You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

206 lines
6.2 KiB

#ifndef WALLY_CORE_H
#define WALLY_CORE_H
#include <stdlib.h>
#include <stdint.h>
#ifndef WALLY_CORE_API
# if defined(_WIN32)
# ifdef WALLY_CORE_BUILD
# define WALLY_CORE_API __declspec(dllexport)
# else
# define WALLY_CORE_API
# endif
# elif defined(__GNUC__) && defined(WALLY_CORE_BUILD)
# define WALLY_CORE_API __attribute__ ((visibility ("default")))
# else
# define WALLY_CORE_API
# endif
#endif
/** Return codes */
#define WALLY_OK 0 /** Success */
#define WALLY_ERROR -1 /** General error */
#define WALLY_EINVAL -2 /** Invalid argument */
#define WALLY_ENOMEM -3 /** malloc() failed */
/**
* Securely wipe memory.
*
* @bytes_in Memory to wipe
* @len_in Size of @bytes_in in bytes.
*/
WALLY_CORE_API int wally_bzero(
void *bytes,
size_t len_in);
/**
* Securely wipe and then free a string allocted by the library.
*
* @str String to free (must be NUL terminated UTF-8).
*/
WALLY_CORE_API int wally_free_string(
char *str);
/** Length of entropy required for @wally_randomize_context */
#define WALLY_SECP_RANDOMISE_LEN 32
/**
* Provide entropy to randomize the libraries internal secp256k1 context.
*
* @bytes_in Entropy to use.
* @len_in Size of @bytes_in in bytes. Must be @WALLY_SECP_RANDOMISE_LEN.
*
* Random data is used in libsecp256k1 to blind the data being processed, to
* make side channel attacks more difficult. libwallycore uses a single
* internal context for secp functions that is not randomized at run time.
* The caller should call this function before using any functions that rely on
* secp (anything using public/private keys).
*/
WALLY_CORE_API int wally_secp_randomize(
const unsigned char *bytes_in,
size_t len_in);
/**
* Convert bytes to a (lower-case) hexadecimal string.
*
* @bytes_in Bytes to convert.
* @len_in Size of @bytes_in in bytes.
* @output Destination for the resulting hexadecimal string.
*
* The string returned should be freed using @wally_free_string.
*/
WALLY_CORE_API int wally_hex_from_bytes(
const unsigned char *bytes_in,
size_t len_in,
char **output);
/**
* Convert a hexadecimal string to bytes.
*
* @hex String to convert.
* @bytes_out: Where to store the resulting bytes.
* @len: The length of @bytes_out in bytes.
* @written: Destination for the number of bytes written to @bytes_out.
*/
WALLY_CORE_API int wally_hex_to_bytes(
const char *hex,
unsigned char *bytes_out,
size_t len,
size_t *written);
/** For @wally_base58_from_bytes, indicates that a checksum should
* be generated. For @wally_base58_to_bytes, indicates that the
* embedded checksum should be validated and stripped off the returned
* bytes.
**/
#define BASE58_FLAG_CHECKSUM 0x1
/** The number of extra bytes required to hold a base58 checksum */
#define BASE58_CHECKSUM_LEN 4
/**
* Create a base 58 encoded string representing binary data.
*
* @bytes_in: Binary data to convert.
* @len_in: The length of @bytes_in in bytes.
* @flags: Pass @BASE58_FLAG_CHECKSUM if @bytes_in should have a
* checksum calculated and appended before converting to base 58.
* @output Destination for the base 58 encoded string representing @bytes_in.
* The string returned should be freed using @wally_free_string.
*/
WALLY_CORE_API int wally_base58_from_bytes(
const unsigned char *bytes_in,
size_t len_in,
uint32_t flags,
char **output);
/**
* Decode a base 58 encoded string back into into binary data.
*
* @str_in: Base 58 encoded string to decode.
* @flags: Pass @BASE58_FLAG_CHECKSUM if @bytes_out should have a
* checksum validated and removed before returning. In this case, @len
* must contain an extra @BASE58_CHECKSUM_LEN bytes to calculate the
* checksum into. The returned length will not include the checksum.
* @bytes_out: Destination for converted binary data.
* @len: The length of @bytes_out in bytes.
* @written: Destination for the length of the decoded bytes.
*
* If the function succeeds, you must check @written. If it is greater
* than @len then no data has been written and the function should be retried
* with a buffer of at least @written bytes in size.
*/
WALLY_CORE_API int wally_base58_to_bytes(
const char *str_in,
uint32_t flags,
unsigned char *bytes_out,
size_t len,
size_t *written);
/**
* Return the length of a base58 encoded string once decoded into bytes.
*
* @str_in: Base 58 encoded string to find the length of.
* @written: Destination for the length of the decoded bytes.
*
* Returns the exact number of bytes that would be required to store @str_in
* as decoded binary, including any embedded checksum. If the string contains
* invalid characters then WALLY_EINVAL is returned. Note that no checksum
* validation takes place.
*
* In the worst case (an all zero buffer, represented by a string of '1'
* characters), this function will return strlen(@str_in). You can therefore
* safely use the length of @str_in as a buffer size to avoid calling this
* function in most cases.
*/
WALLY_CORE_API int wally_base58_get_length(
const char *str_in,
size_t *written);
#ifndef SWIG
/** The type of an overridable function to allocate memory */
typedef void *(*wally_malloc_t)(
size_t size);
/** The type of an overridable function to free memory */
typedef void (*wally_free_t)(
void *ptr);
/** The type of an overridable function to generate an EC nonce */
typedef int (*wally_ec_nonce_t)(
unsigned char *nonce32,
const unsigned char *msg32,
const unsigned char *key32,
const unsigned char *algo16,
void *data,
unsigned int attempt
);
/** Structure holding function pointers for overridable wally operations */
struct wally_operations {
wally_malloc_t malloc_fn;
wally_free_t free_fn;
wally_ec_nonce_t ec_nonce_fn;
};
/**
* Fetch the current overridable operations used by wally.
*
* @output: Destination for the overridable operations.
*/
WALLY_CORE_API int wally_get_operations(
struct wally_operations *output);
/**
* Set the current overridable operations used by wally.
*
* @ops: The overridable operations to set.
*/
WALLY_CORE_API int wally_set_operations(
const struct wally_operations *ops);
#endif /* SWIG */
#endif /* WALLY_CORE_H */