From ffecd36d659ff0765367e514d17e230241085eac Mon Sep 17 00:00:00 2001 From: Zhang Jun Hao Date: Thu, 17 May 2018 19:57:25 +0800 Subject: [PATCH] feat(wolfssl): Add TLS1.0 and TLS1.1 support for wolfssl --- include/wolfssl/openssl/bn.h | 175 ++++ include/wolfssl/openssl/dsa.h | 78 ++ include/wolfssl/openssl/ec.h | 205 ++++ include/wolfssl/openssl/evp.h | 564 +++++++++++ include/wolfssl/openssl/md5.h | 67 ++ include/wolfssl/openssl/opensslv.h | 31 + include/wolfssl/openssl/ripemd.h | 49 + include/wolfssl/openssl/rsa.h | 122 +++ include/wolfssl/openssl/sha.h | 179 ++++ include/wolfssl/openssl/ssl.h | 903 +++++++++++++++++ include/wolfssl/user_settings.h | 16 +- include/wolfssl/wolfcrypt/aes.h | 450 +++++++++ include/wolfssl/wolfcrypt/arc4.h | 56 ++ include/wolfssl/wolfcrypt/des3.h | 118 +++ include/wolfssl/wolfcrypt/ecc.h | 603 ++++++++++++ include/wolfssl/wolfcrypt/hash.h | 153 +++ include/wolfssl/wolfcrypt/hmac.h | 193 ++++ include/wolfssl/wolfcrypt/integer.h | 387 ++++++++ include/wolfssl/wolfcrypt/md5.h | 108 +++ include/wolfssl/wolfcrypt/mpi_class.h | 1010 ++++++++++++++++++++ include/wolfssl/wolfcrypt/mpi_superclass.h | 87 ++ include/wolfssl/wolfcrypt/pwdbased.h | 66 ++ include/wolfssl/wolfcrypt/random.h | 182 ++++ include/wolfssl/wolfcrypt/sha.h | 126 +++ include/wolfssl/wolfcrypt/sha256.h | 176 ++++ include/wolfssl/wolfcrypt/wolfmath.h | 60 ++ lib/libwolfssl.a | Bin 928110 -> 978644 bytes 27 files changed, 6156 insertions(+), 8 deletions(-) create mode 100644 include/wolfssl/openssl/bn.h create mode 100644 include/wolfssl/openssl/dsa.h create mode 100644 include/wolfssl/openssl/ec.h create mode 100644 include/wolfssl/openssl/evp.h create mode 100644 include/wolfssl/openssl/md5.h create mode 100644 include/wolfssl/openssl/opensslv.h create mode 100644 include/wolfssl/openssl/ripemd.h create mode 100644 include/wolfssl/openssl/rsa.h create mode 100644 include/wolfssl/openssl/sha.h create mode 100644 include/wolfssl/openssl/ssl.h create mode 100644 include/wolfssl/wolfcrypt/aes.h create mode 100644 include/wolfssl/wolfcrypt/arc4.h create mode 100644 include/wolfssl/wolfcrypt/des3.h create mode 100644 include/wolfssl/wolfcrypt/ecc.h create mode 100644 include/wolfssl/wolfcrypt/hash.h create mode 100644 include/wolfssl/wolfcrypt/hmac.h create mode 100644 include/wolfssl/wolfcrypt/integer.h create mode 100644 include/wolfssl/wolfcrypt/md5.h create mode 100644 include/wolfssl/wolfcrypt/mpi_class.h create mode 100644 include/wolfssl/wolfcrypt/mpi_superclass.h create mode 100644 include/wolfssl/wolfcrypt/pwdbased.h create mode 100644 include/wolfssl/wolfcrypt/random.h create mode 100644 include/wolfssl/wolfcrypt/sha.h create mode 100644 include/wolfssl/wolfcrypt/sha256.h create mode 100644 include/wolfssl/wolfcrypt/wolfmath.h diff --git a/include/wolfssl/openssl/bn.h b/include/wolfssl/openssl/bn.h new file mode 100644 index 00000000..e360df77 --- /dev/null +++ b/include/wolfssl/openssl/bn.h @@ -0,0 +1,175 @@ +/* bn.h + * + * Copyright (C) 2006-2017 wolfSSL Inc. All rights reserved. + * + * This file is part of wolfSSL. + * + * Contact licensing@wolfssl.com with any questions or comments. + * + * http://www.wolfssl.com + */ + + +/* bn.h for openssl */ + + +#ifndef WOLFSSL_BN_H_ +#define WOLFSSL_BN_H_ + +#include +#include + +#ifdef __cplusplus + extern "C" { +#endif + +typedef struct WOLFSSL_BIGNUM { + int neg; /* openssh deference */ + void* internal; /* our big num */ +} WOLFSSL_BIGNUM; + + +#define WOLFSSL_BN_ULONG mp_digit + +typedef struct WOLFSSL_BN_CTX WOLFSSL_BN_CTX; +typedef struct WOLFSSL_BN_GENCB WOLFSSL_BN_GENCB; + +WOLFSSL_API WOLFSSL_BN_CTX* wolfSSL_BN_CTX_new(void); +WOLFSSL_API void wolfSSL_BN_CTX_init(WOLFSSL_BN_CTX*); +WOLFSSL_API void wolfSSL_BN_CTX_free(WOLFSSL_BN_CTX*); + +WOLFSSL_API WOLFSSL_BIGNUM* wolfSSL_BN_new(void); +WOLFSSL_API void wolfSSL_BN_free(WOLFSSL_BIGNUM*); +WOLFSSL_API void wolfSSL_BN_clear_free(WOLFSSL_BIGNUM*); + + +WOLFSSL_API int wolfSSL_BN_sub(WOLFSSL_BIGNUM*, const WOLFSSL_BIGNUM*, + const WOLFSSL_BIGNUM*); +WOLFSSL_API int wolfSSL_BN_mod(WOLFSSL_BIGNUM*, const WOLFSSL_BIGNUM*, + const WOLFSSL_BIGNUM*, const WOLFSSL_BN_CTX*); +WOLFSSL_API int wolfSSL_BN_mod_exp(WOLFSSL_BIGNUM *r, const WOLFSSL_BIGNUM *a, + const WOLFSSL_BIGNUM *p, const WOLFSSL_BIGNUM *m, WOLFSSL_BN_CTX *ctx); +WOLFSSL_API int wolfSSL_BN_mod_mul(WOLFSSL_BIGNUM *r, const WOLFSSL_BIGNUM *a, + const WOLFSSL_BIGNUM *b, const WOLFSSL_BIGNUM *m, WOLFSSL_BN_CTX *ctx); +WOLFSSL_API const WOLFSSL_BIGNUM* wolfSSL_BN_value_one(void); + + +WOLFSSL_API int wolfSSL_BN_num_bytes(const WOLFSSL_BIGNUM*); +WOLFSSL_API int wolfSSL_BN_num_bits(const WOLFSSL_BIGNUM*); + +WOLFSSL_API int wolfSSL_BN_is_zero(const WOLFSSL_BIGNUM*); +WOLFSSL_API int wolfSSL_BN_is_one(const WOLFSSL_BIGNUM*); +WOLFSSL_API int wolfSSL_BN_is_odd(const WOLFSSL_BIGNUM*); + +WOLFSSL_API int wolfSSL_BN_cmp(const WOLFSSL_BIGNUM*, const WOLFSSL_BIGNUM*); + +WOLFSSL_API int wolfSSL_BN_bn2bin(const WOLFSSL_BIGNUM*, unsigned char*); +WOLFSSL_API WOLFSSL_BIGNUM* wolfSSL_BN_bin2bn(const unsigned char*, int len, + WOLFSSL_BIGNUM* ret); + +WOLFSSL_API int wolfSSL_mask_bits(WOLFSSL_BIGNUM*, int n); + +WOLFSSL_API int wolfSSL_BN_pseudo_rand(WOLFSSL_BIGNUM*, int bits, int top, + int bottom); +WOLFSSL_API int wolfSSL_BN_rand(WOLFSSL_BIGNUM*, int bits, int top, int bottom); +WOLFSSL_API int wolfSSL_BN_is_bit_set(const WOLFSSL_BIGNUM*, int n); +WOLFSSL_API int wolfSSL_BN_hex2bn(WOLFSSL_BIGNUM**, const char* str); + +WOLFSSL_API WOLFSSL_BIGNUM* wolfSSL_BN_dup(const WOLFSSL_BIGNUM*); +WOLFSSL_API WOLFSSL_BIGNUM* wolfSSL_BN_copy(WOLFSSL_BIGNUM*, + const WOLFSSL_BIGNUM*); + +WOLFSSL_API int wolfSSL_BN_dec2bn(WOLFSSL_BIGNUM**, const char* str); +WOLFSSL_API char* wolfSSL_BN_bn2dec(const WOLFSSL_BIGNUM*); + +WOLFSSL_API int wolfSSL_BN_lshift(WOLFSSL_BIGNUM*, const WOLFSSL_BIGNUM*, int); +WOLFSSL_API int wolfSSL_BN_add_word(WOLFSSL_BIGNUM*, WOLFSSL_BN_ULONG); +WOLFSSL_API int wolfSSL_BN_set_bit(WOLFSSL_BIGNUM*, int); +WOLFSSL_API int wolfSSL_BN_set_word(WOLFSSL_BIGNUM*, WOLFSSL_BN_ULONG); +WOLFSSL_API unsigned long wolfSSL_BN_get_word(const WOLFSSL_BIGNUM*); + +WOLFSSL_API int wolfSSL_BN_add(WOLFSSL_BIGNUM*, WOLFSSL_BIGNUM*, + WOLFSSL_BIGNUM*); +WOLFSSL_API char *wolfSSL_BN_bn2hex(const WOLFSSL_BIGNUM*); +WOLFSSL_API int wolfSSL_BN_is_prime_ex(const WOLFSSL_BIGNUM*, int, + WOLFSSL_BN_CTX*, WOLFSSL_BN_GENCB*); +WOLFSSL_API WOLFSSL_BN_ULONG wolfSSL_BN_mod_word(const WOLFSSL_BIGNUM*, + WOLFSSL_BN_ULONG); +#if !defined(NO_FILESYSTEM) && !defined(NO_STDIO_FILESYSTEM) + WOLFSSL_API int wolfSSL_BN_print_fp(FILE*, const WOLFSSL_BIGNUM*); +#endif +WOLFSSL_API int wolfSSL_BN_rshift(WOLFSSL_BIGNUM*, const WOLFSSL_BIGNUM*, int); +WOLFSSL_API WOLFSSL_BIGNUM *wolfSSL_BN_CTX_get(WOLFSSL_BN_CTX *ctx); +WOLFSSL_API void wolfSSL_BN_CTX_start(WOLFSSL_BN_CTX *ctx); +WOLFSSL_API WOLFSSL_BIGNUM *wolfSSL_BN_mod_inverse(WOLFSSL_BIGNUM*, WOLFSSL_BIGNUM*, + const WOLFSSL_BIGNUM*, WOLFSSL_BN_CTX *ctx); +typedef WOLFSSL_BIGNUM BIGNUM; +typedef WOLFSSL_BN_CTX BN_CTX; +typedef WOLFSSL_BN_GENCB BN_GENCB; + +#define BN_CTX_new wolfSSL_BN_CTX_new +#define BN_CTX_init wolfSSL_BN_CTX_init +#define BN_CTX_free wolfSSL_BN_CTX_free + +#define BN_new wolfSSL_BN_new +#define BN_free wolfSSL_BN_free +#define BN_clear_free wolfSSL_BN_clear_free + +#define BN_num_bytes wolfSSL_BN_num_bytes +#define BN_num_bits wolfSSL_BN_num_bits + +#define BN_is_zero wolfSSL_BN_is_zero +#define BN_is_one wolfSSL_BN_is_one +#define BN_is_odd wolfSSL_BN_is_odd + +#define BN_cmp wolfSSL_BN_cmp + +#define BN_bn2bin wolfSSL_BN_bn2bin +#define BN_bin2bn wolfSSL_BN_bin2bn + +#define BN_mod wolfSSL_BN_mod +#define BN_mod_exp wolfSSL_BN_mod_exp +#define BN_mod_mul wolfSSL_BN_mod_mul +#define BN_sub wolfSSL_BN_sub +#define BN_value_one wolfSSL_BN_value_one + +#define BN_mask_bits wolfSSL_mask_bits + +#define BN_pseudo_rand wolfSSL_BN_pseudo_rand +#define BN_rand wolfSSL_BN_rand +#define BN_is_bit_set wolfSSL_BN_is_bit_set +#define BN_hex2bn wolfSSL_BN_hex2bn + +#define BN_dup wolfSSL_BN_dup +#define BN_copy wolfSSL_BN_copy + +#define BN_get_word wolfSSL_BN_get_word +#define BN_set_word wolfSSL_BN_set_word + +#define BN_dec2bn wolfSSL_BN_dec2bn +#define BN_bn2dec wolfSSL_BN_bn2dec +#define BN_bn2hex wolfSSL_BN_bn2hex + +#define BN_lshift wolfSSL_BN_lshift +#define BN_add_word wolfSSL_BN_add_word +#define BN_add wolfSSL_BN_add +#define BN_set_word wolfSSL_BN_set_word +#define BN_set_bit wolfSSL_BN_set_bit + + +#define BN_is_prime_ex wolfSSL_BN_is_prime_ex +#define BN_print_fp wolfSSL_BN_print_fp +#define BN_rshift wolfSSL_BN_rshift +#define BN_mod_word wolfSSL_BN_mod_word + +#define BN_CTX_get wolfSSL_BN_CTX_get +#define BN_CTX_start wolfSSL_BN_CTX_start + +#define BN_mod_inverse wolfSSL_BN_mod_inverse + +#ifdef __cplusplus + } /* extern "C" */ +#endif + + +#endif /* WOLFSSL__H_ */ diff --git a/include/wolfssl/openssl/dsa.h b/include/wolfssl/openssl/dsa.h new file mode 100644 index 00000000..bdcde8e0 --- /dev/null +++ b/include/wolfssl/openssl/dsa.h @@ -0,0 +1,78 @@ +/* dsa.h + * + * Copyright (C) 2006-2017 wolfSSL Inc. All rights reserved. + * + * This file is part of wolfSSL. + * + * Contact licensing@wolfssl.com with any questions or comments. + * + * http://www.wolfssl.com + */ + + +/* dsa.h for openSSL */ + + +#ifndef WOLFSSL_DSA_H_ +#define WOLFSSL_DSA_H_ + +#include + +#ifdef __cplusplus + extern "C" { +#endif + +#ifndef WOLFSSL_DSA_TYPE_DEFINED /* guard on redeclaration */ +typedef struct WOLFSSL_DSA WOLFSSL_DSA; +#define WOLFSSL_DSA_TYPE_DEFINED +#endif + +typedef WOLFSSL_DSA DSA; + +struct WOLFSSL_DSA { + WOLFSSL_BIGNUM* p; + WOLFSSL_BIGNUM* q; + WOLFSSL_BIGNUM* g; + WOLFSSL_BIGNUM* pub_key; /* our y */ + WOLFSSL_BIGNUM* priv_key; /* our x */ + void* internal; /* our Dsa Key */ + char inSet; /* internal set from external ? */ + char exSet; /* external set from internal ? */ +}; + + +WOLFSSL_API WOLFSSL_DSA* wolfSSL_DSA_new(void); +WOLFSSL_API void wolfSSL_DSA_free(WOLFSSL_DSA*); + +WOLFSSL_API int wolfSSL_DSA_generate_key(WOLFSSL_DSA*); + +typedef void (*WOLFSSL_BN_CB)(int i, int j, void* exArg); +WOLFSSL_API WOLFSSL_DSA* wolfSSL_DSA_generate_parameters(int bits, + unsigned char* seed, int seedLen, int* counterRet, + unsigned long* hRet, WOLFSSL_BN_CB cb, void* CBArg); +WOLFSSL_API int wolfSSL_DSA_generate_parameters_ex(WOLFSSL_DSA*, int bits, + unsigned char* seed, int seedLen, int* counterRet, + unsigned long* hRet, void* cb); + +WOLFSSL_API int wolfSSL_DSA_LoadDer(WOLFSSL_DSA*, const unsigned char*, int sz); + +WOLFSSL_API int wolfSSL_DSA_do_sign(const unsigned char* d, + unsigned char* sigRet, WOLFSSL_DSA* dsa); + +WOLFSSL_API int wolfSSL_DSA_do_verify(const unsigned char* d, + unsigned char* sig, + WOLFSSL_DSA* dsa, int *dsacheck); + +#define DSA_new wolfSSL_DSA_new +#define DSA_free wolfSSL_DSA_free + +#define DSA_generate_key wolfSSL_DSA_generate_key +#define DSA_generate_parameters wolfSSL_DSA_generate_parameters +#define DSA_generate_parameters_ex wolfSSL_DSA_generate_parameters_ex + + +#ifdef __cplusplus + } /* extern "C" */ +#endif + +#endif /* header */ diff --git a/include/wolfssl/openssl/ec.h b/include/wolfssl/openssl/ec.h new file mode 100644 index 00000000..24e0e3ad --- /dev/null +++ b/include/wolfssl/openssl/ec.h @@ -0,0 +1,205 @@ +/* ec.h + * + * Copyright (C) 2006-2017 wolfSSL Inc. All rights reserved. + * + * This file is part of wolfSSL. + * + * Contact licensing@wolfssl.com with any questions or comments. + * + * http://www.wolfssl.com + */ + + +/* ec.h for openssl */ + +#ifndef WOLFSSL_EC_H_ +#define WOLFSSL_EC_H_ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Map OpenSSL NID value */ +enum { + POINT_CONVERSION_UNCOMPRESSED = 4, + +#ifdef HAVE_ECC + /* Use ecc_curve_type enum values for NID */ + NID_X9_62_prime192v1 = ECC_SECP192R1, + NID_X9_62_prime256v1 = ECC_SECP256R1, + NID_secp112r1 = ECC_SECP112R1, + NID_secp112r2 = ECC_SECP112R2, + NID_secp128r1 = ECC_SECP128R1, + NID_secp128r2 = ECC_SECP128R2, + NID_secp160r1 = ECC_SECP160R1, + NID_secp160r2 = ECC_SECP160R2, + NID_secp224r1 = ECC_SECP224R1, + NID_secp384r1 = ECC_SECP384R1, + NID_secp521r1 = ECC_SECP521R1, + NID_secp160k1 = ECC_SECP160K1, + NID_secp192k1 = ECC_SECP192K1, + NID_secp224k1 = ECC_SECP224K1, + NID_secp256k1 = ECC_SECP256K1, + NID_brainpoolP160r1 = ECC_BRAINPOOLP160R1, + NID_brainpoolP192r1 = ECC_BRAINPOOLP192R1, + NID_brainpoolP224r1 = ECC_BRAINPOOLP224R1, + NID_brainpoolP256r1 = ECC_BRAINPOOLP256R1, + NID_brainpoolP320r1 = ECC_BRAINPOOLP320R1, + NID_brainpoolP384r1 = ECC_BRAINPOOLP384R1, + NID_brainpoolP512r1 = ECC_BRAINPOOLP512R1, +#endif + + OPENSSL_EC_NAMED_CURVE = 0x001 +}; + +#ifndef WOLFSSL_EC_TYPE_DEFINED /* guard on redeclaration */ +typedef struct WOLFSSL_EC_KEY WOLFSSL_EC_KEY; +typedef struct WOLFSSL_EC_POINT WOLFSSL_EC_POINT; +typedef struct WOLFSSL_EC_GROUP WOLFSSL_EC_GROUP; +#define WOLFSSL_EC_TYPE_DEFINED +#endif + +typedef WOLFSSL_EC_KEY EC_KEY; +typedef WOLFSSL_EC_GROUP EC_GROUP; +typedef WOLFSSL_EC_POINT EC_POINT; + +struct WOLFSSL_EC_POINT { + WOLFSSL_BIGNUM *X; + WOLFSSL_BIGNUM *Y; + WOLFSSL_BIGNUM *Z; + + void* internal; /* our ECC point */ + char inSet; /* internal set from external ? */ + char exSet; /* external set from internal ? */ +}; + +struct WOLFSSL_EC_GROUP { + int curve_idx; /* index of curve, used by WolfSSL as reference */ + int curve_nid; /* NID of curve, used by OpenSSL/OpenSSH as reference */ + int curve_oid; /* OID of curve, used by OpenSSL/OpenSSH as reference */ +}; + +struct WOLFSSL_EC_KEY { + WOLFSSL_EC_GROUP *group; + WOLFSSL_EC_POINT *pub_key; + WOLFSSL_BIGNUM *priv_key; + + void* internal; /* our ECC Key */ + char inSet; /* internal set from external ? */ + char exSet; /* external set from internal ? */ +}; + +WOLFSSL_API +int wolfSSL_ECPoint_i2d(const WOLFSSL_EC_GROUP *curve, + const WOLFSSL_EC_POINT *p, + unsigned char *out, unsigned int *len); +WOLFSSL_API +int wolfSSL_ECPoint_d2i(unsigned char *in, unsigned int len, + const WOLFSSL_EC_GROUP *curve, WOLFSSL_EC_POINT *p); +WOLFSSL_API +int wolfSSL_EC_KEY_LoadDer(WOLFSSL_EC_KEY* key, + const unsigned char* der, int derSz); +WOLFSSL_API +void wolfSSL_EC_KEY_free(WOLFSSL_EC_KEY *key); +WOLFSSL_API +WOLFSSL_EC_POINT *wolfSSL_EC_KEY_get0_public_key(const WOLFSSL_EC_KEY *key); +WOLFSSL_API +const WOLFSSL_EC_GROUP *wolfSSL_EC_KEY_get0_group(const WOLFSSL_EC_KEY *key); +WOLFSSL_API +int wolfSSL_EC_KEY_set_private_key(WOLFSSL_EC_KEY *key, + const WOLFSSL_BIGNUM *priv_key); +WOLFSSL_API +WOLFSSL_BIGNUM *wolfSSL_EC_KEY_get0_private_key(const WOLFSSL_EC_KEY *key); +WOLFSSL_API +WOLFSSL_EC_KEY *wolfSSL_EC_KEY_new_by_curve_name(int nid); +WOLFSSL_API +WOLFSSL_EC_KEY *wolfSSL_EC_KEY_new(void); +WOLFSSL_API +int wolfSSL_EC_KEY_set_group(WOLFSSL_EC_KEY *key, WOLFSSL_EC_GROUP *group); +WOLFSSL_API +int wolfSSL_EC_KEY_generate_key(WOLFSSL_EC_KEY *key); +WOLFSSL_API +void wolfSSL_EC_KEY_set_asn1_flag(WOLFSSL_EC_KEY *key, int asn1_flag); +WOLFSSL_API +int wolfSSL_EC_KEY_set_public_key(WOLFSSL_EC_KEY *key, + const WOLFSSL_EC_POINT *pub); +WOLFSSL_API +void wolfSSL_EC_GROUP_set_asn1_flag(WOLFSSL_EC_GROUP *group, int flag); +WOLFSSL_API +WOLFSSL_EC_GROUP *wolfSSL_EC_GROUP_new_by_curve_name(int nid); +WOLFSSL_API +int wolfSSL_EC_GROUP_cmp(const WOLFSSL_EC_GROUP *a, const WOLFSSL_EC_GROUP *b, + WOLFSSL_BN_CTX *ctx); +WOLFSSL_API +int wolfSSL_EC_GROUP_get_curve_name(const WOLFSSL_EC_GROUP *group); +WOLFSSL_API +int wolfSSL_EC_GROUP_get_degree(const WOLFSSL_EC_GROUP *group); +WOLFSSL_API +int wolfSSL_EC_GROUP_get_order(const WOLFSSL_EC_GROUP *group, + WOLFSSL_BIGNUM *order, WOLFSSL_BN_CTX *ctx); +WOLFSSL_API +void wolfSSL_EC_GROUP_free(WOLFSSL_EC_GROUP *group); +WOLFSSL_API +WOLFSSL_EC_POINT *wolfSSL_EC_POINT_new(const WOLFSSL_EC_GROUP *group); +WOLFSSL_API +int wolfSSL_EC_POINT_get_affine_coordinates_GFp(const WOLFSSL_EC_GROUP *group, + const WOLFSSL_EC_POINT *p, + WOLFSSL_BIGNUM *x, + WOLFSSL_BIGNUM *y, + WOLFSSL_BN_CTX *ctx); +WOLFSSL_API +int wolfSSL_EC_POINT_mul(const WOLFSSL_EC_GROUP *group, WOLFSSL_EC_POINT *r, + const WOLFSSL_BIGNUM *n, + const WOLFSSL_EC_POINT *q, const WOLFSSL_BIGNUM *m, + WOLFSSL_BN_CTX *ctx); +WOLFSSL_API +void wolfSSL_EC_POINT_clear_free(WOLFSSL_EC_POINT *point); +WOLFSSL_API +int wolfSSL_EC_POINT_cmp(const WOLFSSL_EC_GROUP *group, + const WOLFSSL_EC_POINT *a, const WOLFSSL_EC_POINT *b, + WOLFSSL_BN_CTX *ctx); +WOLFSSL_API +void wolfSSL_EC_POINT_free(WOLFSSL_EC_POINT *point); +WOLFSSL_API +int wolfSSL_EC_POINT_is_at_infinity(const WOLFSSL_EC_GROUP *group, + const WOLFSSL_EC_POINT *a); + +#define EC_KEY_free wolfSSL_EC_KEY_free +#define EC_KEY_get0_public_key wolfSSL_EC_KEY_get0_public_key +#define EC_KEY_get0_group wolfSSL_EC_KEY_get0_group +#define EC_KEY_set_private_key wolfSSL_EC_KEY_set_private_key +#define EC_KEY_get0_private_key wolfSSL_EC_KEY_get0_private_key +#define EC_KEY_new_by_curve_name wolfSSL_EC_KEY_new_by_curve_name +#define EC_KEY_set_group wolfSSL_EC_KEY_set_group +#define EC_KEY_generate_key wolfSSL_EC_KEY_generate_key +#define EC_KEY_set_asn1_flag wolfSSL_EC_KEY_set_asn1_flag +#define EC_KEY_set_public_key wolfSSL_EC_KEY_set_public_key +#define EC_KEY_new wolfSSL_EC_KEY_new + +#define EC_GROUP_set_asn1_flag wolfSSL_EC_GROUP_set_asn1_flag +#define EC_GROUP_new_by_curve_name wolfSSL_EC_GROUP_new_by_curve_name +#define EC_GROUP_cmp wolfSSL_EC_GROUP_cmp +#define EC_GROUP_get_curve_name wolfSSL_EC_GROUP_get_curve_name +#define EC_GROUP_get_degree wolfSSL_EC_GROUP_get_degree +#define EC_GROUP_get_order wolfSSL_EC_GROUP_get_order +#define EC_GROUP_free wolfSSL_EC_GROUP_free + +#define EC_POINT_new wolfSSL_EC_POINT_new +#define EC_POINT_get_affine_coordinates_GFp \ + wolfSSL_EC_POINT_get_affine_coordinates_GFp +#define EC_POINT_mul wolfSSL_EC_POINT_mul +#define EC_POINT_clear_free wolfSSL_EC_POINT_clear_free +#define EC_POINT_cmp wolfSSL_EC_POINT_cmp +#define EC_POINT_free wolfSSL_EC_POINT_free +#define EC_POINT_is_at_infinity wolfSSL_EC_POINT_is_at_infinity + +#define EC_POINT_dump wolfSSL_EC_POINT_dump + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* header */ diff --git a/include/wolfssl/openssl/evp.h b/include/wolfssl/openssl/evp.h new file mode 100644 index 00000000..0f9f4035 --- /dev/null +++ b/include/wolfssl/openssl/evp.h @@ -0,0 +1,564 @@ +/* evp.h + * + * Copyright (C) 2006-2017 wolfSSL Inc. All rights reserved. + * + * This file is part of wolfSSL. + * + * Contact licensing@wolfssl.com with any questions or comments. + * + * http://www.wolfssl.com + */ + + + + +/* evp.h defines mini evp openssl compatibility layer + * + */ + + +#ifndef WOLFSSL_EVP_H_ +#define WOLFSSL_EVP_H_ + +#include + +#ifdef WOLFSSL_PREFIX +#include "prefix_evp.h" +#endif + +#ifndef NO_MD4 + #include +#endif +#ifndef NO_MD5 + #include +#endif +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#ifdef HAVE_IDEA + #include +#endif +#include + +#ifdef __cplusplus + extern "C" { +#endif + +typedef char WOLFSSL_EVP_CIPHER; +#ifndef WOLFSSL_EVP_TYPE_DEFINED /* guard on redeclaration */ +typedef char WOLFSSL_EVP_MD; +typedef struct WOLFSSL_EVP_PKEY WOLFSSL_EVP_PKEY; +#define WOLFSSL_EVP_TYPE_DEFINED +#endif + +#ifndef NO_MD4 + WOLFSSL_API const WOLFSSL_EVP_MD* wolfSSL_EVP_md4(void); +#endif +#ifndef NO_MD5 + WOLFSSL_API const WOLFSSL_EVP_MD* wolfSSL_EVP_md5(void); +#endif +WOLFSSL_API const WOLFSSL_EVP_MD* wolfSSL_EVP_sha1(void); +WOLFSSL_API const WOLFSSL_EVP_MD* wolfSSL_EVP_sha224(void); +WOLFSSL_API const WOLFSSL_EVP_MD* wolfSSL_EVP_sha256(void); +WOLFSSL_API const WOLFSSL_EVP_MD* wolfSSL_EVP_sha384(void); +WOLFSSL_API const WOLFSSL_EVP_MD* wolfSSL_EVP_sha512(void); +WOLFSSL_API const WOLFSSL_EVP_MD* wolfSSL_EVP_ripemd160(void); + +WOLFSSL_API const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_128_ecb(void); +WOLFSSL_API const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_192_ecb(void); +WOLFSSL_API const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_256_ecb(void); +WOLFSSL_API const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_128_cbc(void); +WOLFSSL_API const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_192_cbc(void); +WOLFSSL_API const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_256_cbc(void); +WOLFSSL_API const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_128_ctr(void); +WOLFSSL_API const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_192_ctr(void); +WOLFSSL_API const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_256_ctr(void); +WOLFSSL_API const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_des_ecb(void); +WOLFSSL_API const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_des_ede3_ecb(void); +WOLFSSL_API const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_des_cbc(void); +WOLFSSL_API const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_des_ede3_cbc(void); +WOLFSSL_API const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_rc4(void); +WOLFSSL_API const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_idea_cbc(void); +WOLFSSL_API const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_enc_null(void); + + +typedef union { + #ifndef NO_MD4 + WOLFSSL_MD4_CTX md4; + #endif + #ifndef NO_MD5 + WOLFSSL_MD5_CTX md5; + #endif + WOLFSSL_SHA_CTX sha; + #ifdef WOLFSSL_SHA224 + WOLFSSL_SHA224_CTX sha224; + #endif + WOLFSSL_SHA256_CTX sha256; + #ifdef WOLFSSL_SHA384 + WOLFSSL_SHA384_CTX sha384; + #endif + #ifdef WOLFSSL_SHA512 + WOLFSSL_SHA512_CTX sha512; + #endif + #ifdef WOLFSSL_RIPEMD + WOLFSSL_RIPEMD_CTX ripemd; + #endif +} WOLFSSL_Hasher; + + +typedef struct WOLFSSL_EVP_MD_CTX { + union { + WOLFSSL_Hasher digest; + Hmac hmac; + } hash; + unsigned char macType; +} WOLFSSL_EVP_MD_CTX; + + +typedef union { +#ifndef NO_AES + Aes aes; +#endif +#ifndef NO_DES3 + Des des; + Des3 des3; +#endif + Arc4 arc4; +#ifdef HAVE_IDEA + Idea idea; +#endif +} WOLFSSL_Cipher; + + +enum { + AES_128_CBC_TYPE = 1, + AES_192_CBC_TYPE = 2, + AES_256_CBC_TYPE = 3, + AES_128_CTR_TYPE = 4, + AES_192_CTR_TYPE = 5, + AES_256_CTR_TYPE = 6, + AES_128_ECB_TYPE = 7, + AES_192_ECB_TYPE = 8, + AES_256_ECB_TYPE = 9, + DES_CBC_TYPE = 10, + DES_ECB_TYPE = 11, + DES_EDE3_CBC_TYPE = 12, + DES_EDE3_ECB_TYPE = 13, + ARC4_TYPE = 14, + NULL_CIPHER_TYPE = 15, + EVP_PKEY_RSA = 16, + EVP_PKEY_DSA = 17, + EVP_PKEY_EC = 18, +#ifdef HAVE_IDEA + IDEA_CBC_TYPE = 19, +#endif + NID_sha1 = 64, + NID_sha224 = 65, + NID_md2 = 77, + NID_md5 = 4, + NID_hmac = 855, + EVP_PKEY_HMAC = NID_hmac +}; + +enum { + NID_aes_128_cbc = 419, + NID_aes_192_cbc = 423, + NID_aes_256_cbc = 427, + NID_aes_128_ctr = 904, + NID_aes_192_ctr = 905, + NID_aes_256_ctr = 906, + NID_aes_128_ecb = 418, + NID_aes_192_ecb = 422, + NID_aes_256_ecb = 426, + NID_des_cbc = 31, + NID_des_ecb = 29, + NID_des_ede3_cbc= 44, + NID_des_ede3_ecb= 33, + NID_idea_cbc = 34, +}; + +#define WOLFSSL_EVP_BUF_SIZE 16 +typedef struct WOLFSSL_EVP_CIPHER_CTX { + int keyLen; /* user may set for variable */ + int block_size; + unsigned long flags; + unsigned char enc; /* if encrypt side, then true */ + unsigned char cipherType; +#ifndef NO_AES + /* working iv pointer into cipher */ + ALIGN16 unsigned char iv[AES_BLOCK_SIZE]; +#elif !defined(NO_DES3) + /* working iv pointer into cipher */ + ALIGN16 unsigned char iv[DES_BLOCK_SIZE]; +#endif + WOLFSSL_Cipher cipher; + ALIGN16 byte buf[WOLFSSL_EVP_BUF_SIZE]; + int bufUsed; + ALIGN16 byte lastBlock[WOLFSSL_EVP_BUF_SIZE]; + int lastUsed; +} WOLFSSL_EVP_CIPHER_CTX; + +typedef struct WOLFSSL_EVP_PKEY_CTX { + WOLFSSL_EVP_PKEY *pkey; + int op; /* operation */ + int padding; +} WOLFSSL_EVP_PKEY_CTX; + +typedef int WOLFSSL_ENGINE ; +typedef WOLFSSL_ENGINE ENGINE; +typedef WOLFSSL_EVP_PKEY_CTX EVP_PKEY_CTX; + +#define EVP_PKEY_OP_ENCRYPT (1 << 6) +#define EVP_PKEY_OP_DECRYPT (1 << 7) + +WOLFSSL_API void wolfSSL_EVP_init(void); +WOLFSSL_API int wolfSSL_EVP_MD_size(const WOLFSSL_EVP_MD* md); +WOLFSSL_API int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD *md); + +WOLFSSL_API WOLFSSL_EVP_MD_CTX *wolfSSL_EVP_MD_CTX_new (void); +WOLFSSL_API void wolfSSL_EVP_MD_CTX_free(WOLFSSL_EVP_MD_CTX* ctx); +WOLFSSL_API void wolfSSL_EVP_MD_CTX_init(WOLFSSL_EVP_MD_CTX* ctx); +WOLFSSL_API int wolfSSL_EVP_MD_CTX_cleanup(WOLFSSL_EVP_MD_CTX* ctx); +WOLFSSL_API int wolfSSL_EVP_MD_CTX_copy(WOLFSSL_EVP_MD_CTX *out, const WOLFSSL_EVP_MD_CTX *in); +WOLFSSL_API int wolfSSL_EVP_MD_CTX_copy_ex(WOLFSSL_EVP_MD_CTX *out, const WOLFSSL_EVP_MD_CTX *in); +WOLFSSL_API int wolfSSL_EVP_MD_CTX_type(const WOLFSSL_EVP_MD_CTX *ctx); +WOLFSSL_API const WOLFSSL_EVP_MD *wolfSSL_EVP_MD_CTX_md(const WOLFSSL_EVP_MD_CTX *ctx); +WOLFSSL_API const WOLFSSL_EVP_CIPHER *wolfSSL_EVP_get_cipherbyname(const char *name); +WOLFSSL_API const WOLFSSL_EVP_MD *wolfSSL_EVP_get_digestbyname(const char *name); + +WOLFSSL_API int wolfSSL_EVP_DigestInit(WOLFSSL_EVP_MD_CTX* ctx, + const WOLFSSL_EVP_MD* type); +WOLFSSL_API int wolfSSL_EVP_DigestInit_ex(WOLFSSL_EVP_MD_CTX* ctx, + const WOLFSSL_EVP_MD* type, + WOLFSSL_ENGINE *impl); +WOLFSSL_API int wolfSSL_EVP_DigestUpdate(WOLFSSL_EVP_MD_CTX* ctx, const void* data, + size_t sz); +WOLFSSL_API int wolfSSL_EVP_DigestFinal(WOLFSSL_EVP_MD_CTX* ctx, unsigned char* md, + unsigned int* s); +WOLFSSL_API int wolfSSL_EVP_DigestFinal_ex(WOLFSSL_EVP_MD_CTX* ctx, + unsigned char* md, unsigned int* s); + +WOLFSSL_API int wolfSSL_EVP_DigestSignInit(WOLFSSL_EVP_MD_CTX *ctx, + WOLFSSL_EVP_PKEY_CTX **pctx, + const WOLFSSL_EVP_MD *type, + WOLFSSL_ENGINE *e, + WOLFSSL_EVP_PKEY *pkey); +WOLFSSL_API int wolfSSL_EVP_DigestSignUpdate(WOLFSSL_EVP_MD_CTX *ctx, + const void *d, unsigned int cnt); +WOLFSSL_API int wolfSSL_EVP_DigestSignFinal(WOLFSSL_EVP_MD_CTX *ctx, + unsigned char *sig, size_t *siglen); + +#ifndef NO_MD5 +WOLFSSL_API int wolfSSL_EVP_BytesToKey(const WOLFSSL_EVP_CIPHER*, + const WOLFSSL_EVP_MD*, const unsigned char*, + const unsigned char*, int, int, unsigned char*, + unsigned char*); +#endif + +WOLFSSL_API void wolfSSL_EVP_CIPHER_CTX_init(WOLFSSL_EVP_CIPHER_CTX* ctx); +WOLFSSL_API int wolfSSL_EVP_CIPHER_CTX_cleanup(WOLFSSL_EVP_CIPHER_CTX* ctx); + +WOLFSSL_API int wolfSSL_EVP_CIPHER_CTX_iv_length(const WOLFSSL_EVP_CIPHER_CTX*); +WOLFSSL_API int wolfSSL_EVP_CIPHER_iv_length(const WOLFSSL_EVP_CIPHER*); +WOLFSSL_API int wolfSSL_EVP_Cipher_key_length(const WOLFSSL_EVP_CIPHER* c); + + +WOLFSSL_API int wolfSSL_EVP_CipherInit(WOLFSSL_EVP_CIPHER_CTX* ctx, + const WOLFSSL_EVP_CIPHER* type, + const unsigned char* key, + const unsigned char* iv, + int enc); +WOLFSSL_API int wolfSSL_EVP_CipherInit_ex(WOLFSSL_EVP_CIPHER_CTX* ctx, + const WOLFSSL_EVP_CIPHER* type, + WOLFSSL_ENGINE *impl, + const unsigned char* key, + const unsigned char* iv, + int enc); +WOLFSSL_API int wolfSSL_EVP_EncryptInit(WOLFSSL_EVP_CIPHER_CTX* ctx, + const WOLFSSL_EVP_CIPHER* type, + const unsigned char* key, + const unsigned char* iv); +WOLFSSL_API int wolfSSL_EVP_EncryptInit_ex(WOLFSSL_EVP_CIPHER_CTX* ctx, + const WOLFSSL_EVP_CIPHER* type, + WOLFSSL_ENGINE *impl, + const unsigned char* key, + const unsigned char* iv); +WOLFSSL_API int wolfSSL_EVP_DecryptInit(WOLFSSL_EVP_CIPHER_CTX* ctx, + const WOLFSSL_EVP_CIPHER* type, + const unsigned char* key, + const unsigned char* iv); +WOLFSSL_API int wolfSSL_EVP_DecryptInit_ex(WOLFSSL_EVP_CIPHER_CTX* ctx, + const WOLFSSL_EVP_CIPHER* type, + WOLFSSL_ENGINE *impl, + const unsigned char* key, + const unsigned char* iv); +WOLFSSL_API int wolfSSL_EVP_CipherUpdate(WOLFSSL_EVP_CIPHER_CTX *ctx, + unsigned char *out, int *outl, + const unsigned char *in, int inl); +WOLFSSL_API int wolfSSL_EVP_CipherFinal(WOLFSSL_EVP_CIPHER_CTX *ctx, + unsigned char *out, int *outl); +WOLFSSL_API int wolfSSL_EVP_CipherFinal_ex(WOLFSSL_EVP_CIPHER_CTX *ctx, + unsigned char *out, int *outl, int enc); +WOLFSSL_API int wolfSSL_EVP_EncryptFinal(WOLFSSL_EVP_CIPHER_CTX *ctx, + unsigned char *out, int *outl); +WOLFSSL_API int wolfSSL_EVP_EncryptFinal_ex(WOLFSSL_EVP_CIPHER_CTX *ctx, + unsigned char *out, int *outl); +WOLFSSL_API int wolfSSL_EVP_DecryptFinal(WOLFSSL_EVP_CIPHER_CTX *ctx, + unsigned char *out, int *outl); +WOLFSSL_API int wolfSSL_EVP_DecryptFinal_ex(WOLFSSL_EVP_CIPHER_CTX *ctx, + unsigned char *out, int *outl); + +WOLFSSL_API WOLFSSL_EVP_CIPHER_CTX *wolfSSL_EVP_CIPHER_CTX_new(void); +WOLFSSL_API void wolfSSL_EVP_CIPHER_CTX_free(WOLFSSL_EVP_CIPHER_CTX *ctx); +WOLFSSL_API int wolfSSL_EVP_CIPHER_CTX_key_length(WOLFSSL_EVP_CIPHER_CTX* ctx); +WOLFSSL_API int wolfSSL_EVP_CIPHER_CTX_set_key_length(WOLFSSL_EVP_CIPHER_CTX* ctx, + int keylen); +WOLFSSL_API int wolfSSL_EVP_Cipher(WOLFSSL_EVP_CIPHER_CTX* ctx, + unsigned char* dst, unsigned char* src, + unsigned int len); + +WOLFSSL_API const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_get_cipherbynid(int); +WOLFSSL_API const WOLFSSL_EVP_MD* wolfSSL_EVP_get_digestbynid(int); + +WOLFSSL_API WOLFSSL_RSA* wolfSSL_EVP_PKEY_get1_RSA(WOLFSSL_EVP_PKEY*); +WOLFSSL_API WOLFSSL_DSA* wolfSSL_EVP_PKEY_get1_DSA(WOLFSSL_EVP_PKEY*); +WOLFSSL_API WOLFSSL_EC_KEY *wolfSSL_EVP_PKEY_get1_EC_KEY(WOLFSSL_EVP_PKEY *key); +WOLFSSL_API int wolfSSL_EVP_PKEY_set1_RSA(WOLFSSL_EVP_PKEY *pkey, WOLFSSL_RSA *key); + +WOLFSSL_API WOLFSSL_EVP_PKEY* wolfSSL_EVP_PKEY_new_mac_key(int type, ENGINE* e, + const unsigned char* key, int keylen); +WOLFSSL_API const unsigned char* wolfSSL_EVP_PKEY_get0_hmac(const WOLFSSL_EVP_PKEY* pkey, + size_t* len); +WOLFSSL_API int wolfSSL_EVP_PKEY_bits(const WOLFSSL_EVP_PKEY *pkey); +WOLFSSL_API int wolfSSL_EVP_PKEY_CTX_free(WOLFSSL_EVP_PKEY_CTX *ctx); +WOLFSSL_API WOLFSSL_EVP_PKEY_CTX *wolfSSL_EVP_PKEY_CTX_new(WOLFSSL_EVP_PKEY *pkey, WOLFSSL_ENGINE *e); +WOLFSSL_API int wolfSSL_EVP_PKEY_CTX_set_rsa_padding(WOLFSSL_EVP_PKEY_CTX *ctx, int padding); +WOLFSSL_API int wolfSSL_EVP_PKEY_decrypt(WOLFSSL_EVP_PKEY_CTX *ctx, + unsigned char *out, size_t *outlen, + const unsigned char *in, size_t inlen); +WOLFSSL_API int wolfSSL_EVP_PKEY_decrypt_init(WOLFSSL_EVP_PKEY_CTX *ctx); +WOLFSSL_API int wolfSSL_EVP_PKEY_encrypt(WOLFSSL_EVP_PKEY_CTX *ctx, + unsigned char *out, size_t *outlen, + const unsigned char *in, size_t inlen); +WOLFSSL_API int wolfSSL_EVP_PKEY_encrypt_init(WOLFSSL_EVP_PKEY_CTX *ctx); +WOLFSSL_API WOLFSSL_EVP_PKEY *wolfSSL_EVP_PKEY_new(void); +WOLFSSL_API int wolfSSL_EVP_PKEY_size(WOLFSSL_EVP_PKEY *pkey); +WOLFSSL_API int wolfSSL_EVP_SignFinal(WOLFSSL_EVP_MD_CTX *ctx, unsigned char *sigret, + unsigned int *siglen, WOLFSSL_EVP_PKEY *pkey); +WOLFSSL_API int wolfSSL_EVP_SignInit(WOLFSSL_EVP_MD_CTX *ctx, const WOLFSSL_EVP_MD *type); +WOLFSSL_API int wolfSSL_EVP_SignUpdate(WOLFSSL_EVP_MD_CTX *ctx, const void *data, size_t len); +WOLFSSL_API int wolfSSL_EVP_VerifyFinal(WOLFSSL_EVP_MD_CTX *ctx, + unsigned char* sig, unsigned int sig_len, WOLFSSL_EVP_PKEY *pkey); +WOLFSSL_API int wolfSSL_EVP_VerifyInit(WOLFSSL_EVP_MD_CTX *ctx, const WOLFSSL_EVP_MD *type); +WOLFSSL_API int wolfSSL_EVP_VerifyUpdate(WOLFSSL_EVP_MD_CTX *ctx, const void *data, size_t len); + + +/* these next ones don't need real OpenSSL type, for OpenSSH compat only */ +WOLFSSL_API void* wolfSSL_EVP_X_STATE(const WOLFSSL_EVP_CIPHER_CTX* ctx); +WOLFSSL_API int wolfSSL_EVP_X_STATE_LEN(const WOLFSSL_EVP_CIPHER_CTX* ctx); + +WOLFSSL_API void wolfSSL_3des_iv(WOLFSSL_EVP_CIPHER_CTX* ctx, int doset, + unsigned char* iv, int len); +WOLFSSL_API void wolfSSL_aes_ctr_iv(WOLFSSL_EVP_CIPHER_CTX* ctx, int doset, + unsigned char* iv, int len); + +WOLFSSL_API int wolfSSL_StoreExternalIV(WOLFSSL_EVP_CIPHER_CTX* ctx); +WOLFSSL_API int wolfSSL_SetInternalIV(WOLFSSL_EVP_CIPHER_CTX* ctx); + +WOLFSSL_API int wolfSSL_EVP_CIPHER_CTX_block_size(const WOLFSSL_EVP_CIPHER_CTX *ctx); +WOLFSSL_API int wolfSSL_EVP_CIPHER_block_size(const WOLFSSL_EVP_CIPHER *cipher); +WOLFSSL_API unsigned long WOLFSSL_EVP_CIPHER_mode(const WOLFSSL_EVP_CIPHER *cipher); +WOLFSSL_API unsigned long WOLFSSL_CIPHER_mode(const WOLFSSL_EVP_CIPHER *cipher); +WOLFSSL_API unsigned long wolfSSL_EVP_CIPHER_flags(const WOLFSSL_EVP_CIPHER *cipher); +WOLFSSL_API void wolfSSL_EVP_CIPHER_CTX_set_flags(WOLFSSL_EVP_CIPHER_CTX *ctx, int flags); +WOLFSSL_API unsigned long wolfSSL_EVP_CIPHER_CTX_mode(const WOLFSSL_EVP_CIPHER_CTX *ctx); +WOLFSSL_API int wolfSSL_EVP_CIPHER_CTX_set_padding(WOLFSSL_EVP_CIPHER_CTX *c, int pad); +WOLFSSL_API int wolfSSL_EVP_add_digest(const WOLFSSL_EVP_MD *digest); +WOLFSSL_API int wolfSSL_EVP_add_cipher(const WOLFSSL_EVP_CIPHER *cipher); + + +WOLFSSL_API int wolfSSL_PKCS5_PBKDF2_HMAC_SHA1(const char * pass, int passlen, + const unsigned char * salt, + int saltlen, int iter, + int keylen, unsigned char *out); + +#define EVP_CIPH_STREAM_CIPHER WOLFSSL_EVP_CIPH_STREAM_CIPHER +#define EVP_CIPH_ECB_MODE WOLFSSL_EVP_CIPH_ECB_MODE +#define EVP_CIPH_CBC_MODE WOLFSSL_EVP_CIPH_CBC_MODE +#define EVP_CIPH_CFB_MODE WOLFSSL_EVP_CIPH_CFB_MODE +#define EVP_CIPH_OFB_MODE WOLFSSL_EVP_CIPH_OFB_MODE +#define EVP_CIPH_CTR_MODE WOLFSSL_EVP_CIPH_CTR_MODE +#define EVP_CIPH_GCM_MODE WOLFSSL_EVP_CIPH_GCM_MODE +#define EVP_CIPH_CCM_MODE WOLFSSL_EVP_CIPH_CCM_MODE + +#define WOLFSSL_EVP_CIPH_MODE 0x0007 +#define WOLFSSL_EVP_CIPH_STREAM_CIPHER 0x0 +#define WOLFSSL_EVP_CIPH_ECB_MODE 0x1 +#define WOLFSSL_EVP_CIPH_CBC_MODE 0x2 +#define WOLFSSL_EVP_CIPH_CFB_MODE 0x3 +#define WOLFSSL_EVP_CIPH_OFB_MODE 0x4 +#define WOLFSSL_EVP_CIPH_CTR_MODE 0x5 +#define WOLFSSL_EVP_CIPH_GCM_MODE 0x6 +#define WOLFSSL_EVP_CIPH_CCM_MODE 0x7 +#define WOLFSSL_EVP_CIPH_NO_PADDING 0x100 +#define WOLFSSL_EVP_CIPH_TYPE_INIT 0xff + +/* end OpenSSH compat */ + +typedef WOLFSSL_EVP_MD EVP_MD; +typedef WOLFSSL_EVP_CIPHER EVP_CIPHER; +typedef WOLFSSL_EVP_MD_CTX EVP_MD_CTX; +typedef WOLFSSL_EVP_CIPHER_CTX EVP_CIPHER_CTX; + +#ifndef NO_MD4 + #define EVP_md4 wolfSSL_EVP_md4 +#endif +#ifndef NO_MD5 + #define EVP_md5 wolfSSL_EVP_md5 +#endif +#define EVP_sha1 wolfSSL_EVP_sha1 +#define EVP_dds1 wolfSSL_EVP_sha1 +#define EVP_sha224 wolfSSL_EVP_sha224 +#define EVP_sha256 wolfSSL_EVP_sha256 +#define EVP_sha384 wolfSSL_EVP_sha384 +#define EVP_sha512 wolfSSL_EVP_sha512 +#define EVP_ripemd160 wolfSSL_EVP_ripemd160 + +#define EVP_aes_128_cbc wolfSSL_EVP_aes_128_cbc +#define EVP_aes_192_cbc wolfSSL_EVP_aes_192_cbc +#define EVP_aes_256_cbc wolfSSL_EVP_aes_256_cbc +#define EVP_aes_128_ecb wolfSSL_EVP_aes_128_ecb +#define EVP_aes_192_ecb wolfSSL_EVP_aes_192_ecb +#define EVP_aes_256_ecb wolfSSL_EVP_aes_256_ecb +#define EVP_aes_128_ctr wolfSSL_EVP_aes_128_ctr +#define EVP_aes_192_ctr wolfSSL_EVP_aes_192_ctr +#define EVP_aes_256_ctr wolfSSL_EVP_aes_256_ctr +#define EVP_des_cbc wolfSSL_EVP_des_cbc +#define EVP_des_ecb wolfSSL_EVP_des_ecb +#define EVP_des_ede3_cbc wolfSSL_EVP_des_ede3_cbc +#define EVP_des_ede3_ecb wolfSSL_EVP_des_ede3_ecb +#define EVP_rc4 wolfSSL_EVP_rc4 +#define EVP_idea_cbc wolfSSL_EVP_idea_cbc +#define EVP_enc_null wolfSSL_EVP_enc_null + +#define EVP_MD_size wolfSSL_EVP_MD_size +#define EVP_MD_CTX_new wolfSSL_EVP_MD_CTX_new +#define EVP_MD_CTX_create wolfSSL_EVP_MD_CTX_new +#define EVP_MD_CTX_free wolfSSL_EVP_MD_CTX_free +#define EVP_MD_CTX_destroy wolfSSL_EVP_MD_CTX_free +#define EVP_MD_CTX_init wolfSSL_EVP_MD_CTX_init +#define EVP_MD_CTX_cleanup wolfSSL_EVP_MD_CTX_cleanup +#define EVP_MD_CTX_md wolfSSL_EVP_MD_CTX_md +#define EVP_MD_CTX_type wolfSSL_EVP_MD_CTX_type +#define EVP_MD_type wolfSSL_EVP_MD_type + +#define EVP_DigestInit wolfSSL_EVP_DigestInit +#define EVP_DigestInit_ex wolfSSL_EVP_DigestInit_ex +#define EVP_DigestUpdate wolfSSL_EVP_DigestUpdate +#define EVP_DigestFinal wolfSSL_EVP_DigestFinal +#define EVP_DigestFinal_ex wolfSSL_EVP_DigestFinal_ex +#define EVP_DigestSignInit wolfSSL_EVP_DigestSignInit +#define EVP_DigestSignUpdate wolfSSL_EVP_DigestSignUpdate +#define EVP_DigestSignFinal wolfSSL_EVP_DigestSignFinal +#define EVP_BytesToKey wolfSSL_EVP_BytesToKey + +#define EVP_get_cipherbyname wolfSSL_EVP_get_cipherbyname +#define EVP_get_digestbyname wolfSSL_EVP_get_digestbyname + +#define EVP_CIPHER_CTX_init wolfSSL_EVP_CIPHER_CTX_init +#define EVP_CIPHER_CTX_cleanup wolfSSL_EVP_CIPHER_CTX_cleanup +#define EVP_CIPHER_CTX_iv_length wolfSSL_EVP_CIPHER_CTX_iv_length +#define EVP_CIPHER_CTX_key_length wolfSSL_EVP_CIPHER_CTX_key_length +#define EVP_CIPHER_CTX_set_key_length wolfSSL_EVP_CIPHER_CTX_set_key_length +#define EVP_CIPHER_CTX_mode wolfSSL_EVP_CIPHER_CTX_mode + +#define EVP_CIPHER_iv_length wolfSSL_EVP_CIPHER_iv_length +#define EVP_CIPHER_key_length wolfSSL_EVP_Cipher_key_length + +#define EVP_CipherInit wolfSSL_EVP_CipherInit +#define EVP_CipherInit_ex wolfSSL_EVP_CipherInit_ex +#define EVP_EncryptInit wolfSSL_EVP_EncryptInit +#define EVP_EncryptInit_ex wolfSSL_EVP_EncryptInit_ex +#define EVP_DecryptInit wolfSSL_EVP_DecryptInit +#define EVP_DecryptInit_ex wolfSSL_EVP_DecryptInit_ex + +#define EVP_Cipher wolfSSL_EVP_Cipher +#define EVP_CipherUpdate wolfSSL_EVP_CipherUpdate +#define EVP_EncryptUpdate wolfSSL_EVP_CipherUpdate +#define EVP_DecryptUpdate wolfSSL_EVP_CipherUpdate +#define EVP_CipherFinal wolfSSL_EVP_CipherFinal +#define EVP_CipherFinal_ex wolfSSL_EVP_CipherFinal +#define EVP_EncryptFinal wolfSSL_EVP_CipherFinal +#define EVP_EncryptFinal_ex wolfSSL_EVP_CipherFinal +#define EVP_DecryptFinal wolfSSL_EVP_CipherFinal +#define EVP_DecryptFinal_ex wolfSSL_EVP_CipherFinal + +#define EVP_CIPHER_CTX_free wolfSSL_EVP_CIPHER_CTX_free +#define EVP_CIPHER_CTX_new wolfSSL_EVP_CIPHER_CTX_new + +#define EVP_get_cipherbynid wolfSSL_EVP_get_cipherbynid +#define EVP_get_digestbynid wolfSSL_EVP_get_digestbynid +#define EVP_get_cipherbyname wolfSSL_EVP_get_cipherbyname +#define EVP_get_digestbyname wolfSSL_EVP_get_digestbyname + +#define EVP_PKEY_get1_RSA wolfSSL_EVP_PKEY_get1_RSA +#define EVP_PKEY_get1_DSA wolfSSL_EVP_PKEY_get1_DSA +#define EVP_PKEY_set1_RSA wolfSSL_EVP_PKEY_set1_RSA +#define EVP_PKEY_get1_EC_KEY wolfSSL_EVP_PKEY_get1_EC_KEY +#define EVP_PKEY_get0_hmac wolfSSL_EVP_PKEY_get0_hmac +#define EVP_PKEY_new_mac_key wolfSSL_EVP_PKEY_new_mac_key +#define EVP_MD_CTX_copy wolfSSL_EVP_MD_CTX_copy +#define EVP_MD_CTX_copy_ex wolfSSL_EVP_MD_CTX_copy_ex +#define EVP_PKEY_bits wolfSSL_EVP_PKEY_bits +#define EVP_PKEY_CTX_free wolfSSL_EVP_PKEY_CTX_free +#define EVP_PKEY_CTX_new wolfSSL_EVP_PKEY_CTX_new +#define EVP_PKEY_CTX_set_rsa_padding wolfSSL_EVP_PKEY_CTX_set_rsa_padding +#define EVP_PKEY_decrypt wolfSSL_EVP_PKEY_decrypt +#define EVP_PKEY_decrypt_init wolfSSL_EVP_PKEY_decrypt_init +#define EVP_PKEY_encrypt wolfSSL_EVP_PKEY_encrypt +#define EVP_PKEY_encrypt_init wolfSSL_EVP_PKEY_encrypt_init +#define EVP_PKEY_new wolfSSL_PKEY_new +#define EVP_PKEY_free wolfSSL_EVP_PKEY_free +#define EVP_PKEY_size wolfSSL_EVP_PKEY_size +#define EVP_SignFinal wolfSSL_EVP_SignFinal +#define EVP_SignInit wolfSSL_EVP_SignInit +#define EVP_SignUpdate wolfSSL_EVP_SignUpdate +#define EVP_VerifyFinal wolfSSL_EVP_VerifyFinal +#define EVP_VerifyInit wolfSSL_EVP_VerifyInit +#define EVP_VerifyUpdate wolfSSL_EVP_VerifyUpdate + +#define EVP_CIPHER_CTX_block_size wolfSSL_EVP_CIPHER_CTX_block_size +#define EVP_CIPHER_block_size wolfSSL_EVP_CIPHER_block_size +#define EVP_CIPHER_flags wolfSSL_EVP_CIPHER_flags +#define EVP_CIPHER_CTX_set_flags wolfSSL_EVP_CIPHER_CTX_set_flags +#define EVP_CIPHER_CTX_set_padding wolfSSL_EVP_CIPHER_CTX_set_padding +#define EVP_CIPHER_CTX_flags wolfSSL_EVP_CIPHER_CTX_flags +#define EVP_add_digest wolfSSL_EVP_add_digest +#define EVP_add_cipher wolfSSL_EVP_add_cipher + +#define PKCS5_PBKDF2_HMAC_SHA1 wolfSSL_PKCS5_PBKDF2_HMAC_SHA1 + +#ifndef EVP_MAX_MD_SIZE + #define EVP_MAX_MD_SIZE 64 /* sha512 */ +#endif + +#ifndef EVP_MAX_BLOCK_LENGTH + #define EVP_MAX_BLOCK_LENGTH 32 /* 2 * blocklen(AES)? */ + /* They define this as 32. Using the same value here. */ +#endif + +WOLFSSL_API void printPKEY(WOLFSSL_EVP_PKEY *k); + +#ifdef __cplusplus + } /* extern "C" */ +#endif + + +#endif /* WOLFSSL_EVP_H_ */ diff --git a/include/wolfssl/openssl/md5.h b/include/wolfssl/openssl/md5.h new file mode 100644 index 00000000..00217c4e --- /dev/null +++ b/include/wolfssl/openssl/md5.h @@ -0,0 +1,67 @@ +/* md5.h + * + * Copyright (C) 2006-2017 wolfSSL Inc. All rights reserved. + * + * This file is part of wolfSSL. + * + * Contact licensing@wolfssl.com with any questions or comments. + * + * http://www.wolfssl.com + */ + + +/* md5.h for openssl */ + + +#ifndef WOLFSSL_MD5_H_ +#define WOLFSSL_MD5_H_ + +#include + +#ifndef NO_MD5 + +#include + +#ifdef WOLFSSL_PREFIX +#include "prefix_md5.h" +#endif + +#ifdef __cplusplus + extern "C" { +#endif + + +typedef struct WOLFSSL_MD5_CTX { + void* holder[(112 + WC_ASYNC_DEV_SIZE) / sizeof(void*)]; /* big enough to hold wolfcrypt md5, but check on init */ +} WOLFSSL_MD5_CTX; + +WOLFSSL_API int wolfSSL_MD5_Init(WOLFSSL_MD5_CTX*); +WOLFSSL_API int wolfSSL_MD5_Update(WOLFSSL_MD5_CTX*, const void*, unsigned long); +WOLFSSL_API int wolfSSL_MD5_Final(unsigned char*, WOLFSSL_MD5_CTX*); + + +typedef WOLFSSL_MD5_CTX MD5_CTX; + +#define MD5_Init wolfSSL_MD5_Init +#define MD5_Update wolfSSL_MD5_Update +#define MD5_Final wolfSSL_MD5_Final + +#ifdef OPENSSL_EXTRA_BSD + #define MD5Init wolfSSL_MD5_Init + #define MD5Update wolfSSL_MD5_Update + #define MD5Final wolfSSL_MD5_Final +#endif + +#ifndef MD5 +#define MD5(d, n, md) wc_Md5Hash((d), (n), (md)) +#endif + +#define MD5_DIGEST_LENGTH MD5_DIGEST_SIZE + +#ifdef __cplusplus + } /* extern "C" */ +#endif + +#endif /* NO_MD5 */ + +#endif /* WOLFSSL_MD5_H_ */ diff --git a/include/wolfssl/openssl/opensslv.h b/include/wolfssl/openssl/opensslv.h new file mode 100644 index 00000000..a48fede1 --- /dev/null +++ b/include/wolfssl/openssl/opensslv.h @@ -0,0 +1,31 @@ +/* opensslv.h + * + * Copyright (C) 2006-2017 wolfSSL Inc. All rights reserved. + * + * This file is part of wolfSSL. + * + * Contact licensing@wolfssl.com with any questions or comments. + * + * http://www.wolfssl.com + */ + + +/* opensslv.h compatibility */ + +#ifndef WOLFSSL_OPENSSLV_H_ +#define WOLFSSL_OPENSSLV_H_ + + +/* api version compatibility */ +#if defined(HAVE_STUNNEL) || defined(HAVE_LIGHTY) || defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY) || defined(WOLFSSL_SIGNAL) + /* version number can be increased for Lighty after compatibility for ECDH + is added */ + #define OPENSSL_VERSION_NUMBER 0x10001000L +#else + #define OPENSSL_VERSION_NUMBER 0x0090810fL +#endif + +#define OPENSSL_VERSION_TEXT LIBWOLFSSL_VERSION_STRING + + +#endif /* header */ diff --git a/include/wolfssl/openssl/ripemd.h b/include/wolfssl/openssl/ripemd.h new file mode 100644 index 00000000..a8ba0845 --- /dev/null +++ b/include/wolfssl/openssl/ripemd.h @@ -0,0 +1,49 @@ +/* ripemd.h + * + * Copyright (C) 2006-2017 wolfSSL Inc. All rights reserved. + * + * This file is part of wolfSSL. + * + * Contact licensing@wolfssl.com with any questions or comments. + * + * http://www.wolfssl.com + */ + + +/* ripemd.h for openssl */ + + +#ifndef WOLFSSL_RIPEMD_H_ +#define WOLFSSL_RIPEMD_H_ + +#include + +#ifdef __cplusplus + extern "C" { +#endif + + +typedef struct WOLFSSL_RIPEMD_CTX { + int holder[32]; /* big enough to hold wolfcrypt, but check on init */ +} WOLFSSL_RIPEMD_CTX; + +WOLFSSL_API void wolfSSL_RIPEMD_Init(WOLFSSL_RIPEMD_CTX*); +WOLFSSL_API void wolfSSL_RIPEMD_Update(WOLFSSL_RIPEMD_CTX*, const void*, + unsigned long); +WOLFSSL_API void wolfSSL_RIPEMD_Final(unsigned char*, WOLFSSL_RIPEMD_CTX*); + + +typedef WOLFSSL_RIPEMD_CTX RIPEMD_CTX; + +#define RIPEMD_Init wolfSSL_RIPEMD_Init +#define RIPEMD_Update wolfSSL_RIPEMD_Update +#define RIPEMD_Final wolfSSL_RIPEMD_Final + + +#ifdef __cplusplus + } /* extern "C" */ +#endif + + +#endif /* WOLFSSL_MD5_H_ */ + diff --git a/include/wolfssl/openssl/rsa.h b/include/wolfssl/openssl/rsa.h new file mode 100644 index 00000000..c3e22b00 --- /dev/null +++ b/include/wolfssl/openssl/rsa.h @@ -0,0 +1,122 @@ +/* rsa.h + * + * Copyright (C) 2006-2017 wolfSSL Inc. All rights reserved. + * + * This file is part of wolfSSL. + * + * Contact licensing@wolfssl.com with any questions or comments. + * + * http://www.wolfssl.com + */ + + +/* rsa.h for openSSL */ + + +#ifndef WOLFSSL_RSA_H_ +#define WOLFSSL_RSA_H_ + +#include + + +#ifdef __cplusplus + extern "C" { +#endif + +#if !defined(NO_RSA) && !defined(HAVE_USER_RSA) +#if defined(HAVE_FIPS) || \ + (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION < 2)) + /* + choice of padding added after fips, so not available when using fips RSA + */ + + /* Padding types */ + #define RSA_PKCS1_PADDING 0 + #define RSA_PKCS1_OAEP_PADDING 1 +#else + #define RSA_PKCS1_PADDING WC_RSA_PKCSV15_PAD + #define RSA_PKCS1_OAEP_PADDING WC_RSA_OAEP_PAD +#endif /* HAVE_FIPS */ +#endif + +#ifndef WOLFSSL_RSA_TYPE_DEFINED /* guard on redeclaration */ +typedef struct WOLFSSL_RSA WOLFSSL_RSA; +#define WOLFSSL_RSA_TYPE_DEFINED +#endif + +typedef WOLFSSL_RSA RSA; + +struct WOLFSSL_RSA { +#ifdef WC_RSA_BLINDING + WC_RNG* rng; /* for PrivateDecrypt blinding */ +#endif + WOLFSSL_BIGNUM* n; + WOLFSSL_BIGNUM* e; + WOLFSSL_BIGNUM* d; + WOLFSSL_BIGNUM* p; + WOLFSSL_BIGNUM* q; + WOLFSSL_BIGNUM* dmp1; /* dP */ + WOLFSSL_BIGNUM* dmq1; /* dQ */ + WOLFSSL_BIGNUM* iqmp; /* u */ + void* heap; + void* internal; /* our RSA */ + char inSet; /* internal set from external ? */ + char exSet; /* external set from internal ? */ + char ownRng; /* flag for if the rng should be free'd */ +}; + + +WOLFSSL_API WOLFSSL_RSA* wolfSSL_RSA_new(void); +WOLFSSL_API void wolfSSL_RSA_free(WOLFSSL_RSA*); + +WOLFSSL_API int wolfSSL_RSA_generate_key_ex(WOLFSSL_RSA*, int bits, WOLFSSL_BIGNUM*, + void* cb); + +WOLFSSL_API int wolfSSL_RSA_blinding_on(WOLFSSL_RSA*, WOLFSSL_BN_CTX*); +WOLFSSL_API int wolfSSL_RSA_public_encrypt(int len, const unsigned char* fr, + unsigned char* to, WOLFSSL_RSA*, int padding); +WOLFSSL_API int wolfSSL_RSA_private_decrypt(int len, const unsigned char* fr, + unsigned char* to, WOLFSSL_RSA*, int padding); +WOLFSSL_API int wolfSSL_RSA_private_encrypt(int len, unsigned char* in, + unsigned char* out, WOLFSSL_RSA* rsa, int padding); + +WOLFSSL_API int wolfSSL_RSA_size(const WOLFSSL_RSA*); +WOLFSSL_API int wolfSSL_RSA_sign(int type, const unsigned char* m, + unsigned int mLen, unsigned char* sigRet, + unsigned int* sigLen, WOLFSSL_RSA*); +WOLFSSL_API int wolfSSL_RSA_sign_ex(int type, const unsigned char* m, + unsigned int mLen, unsigned char* sigRet, + unsigned int* sigLen, WOLFSSL_RSA*, int); +WOLFSSL_API int wolfSSL_RSA_verify(int type, const unsigned char* m, + unsigned int mLen, const unsigned char* sig, + unsigned int sigLen, WOLFSSL_RSA*); +WOLFSSL_API int wolfSSL_RSA_public_decrypt(int flen, const unsigned char* from, + unsigned char* to, WOLFSSL_RSA*, int padding); +WOLFSSL_API int wolfSSL_RSA_GenAdd(WOLFSSL_RSA*); +WOLFSSL_API int wolfSSL_RSA_LoadDer(WOLFSSL_RSA*, const unsigned char*, int sz); +WOLFSSL_API int wolfSSL_RSA_LoadDer_ex(WOLFSSL_RSA*, const unsigned char*, int sz, int opt); + +#define WOLFSSL_RSA_LOAD_PRIVATE 1 +#define WOLFSSL_RSA_LOAD_PUBLIC 2 + +#define RSA_new wolfSSL_RSA_new +#define RSA_free wolfSSL_RSA_free + +#define RSA_generate_key_ex wolfSSL_RSA_generate_key_ex + +#define RSA_blinding_on wolfSSL_RSA_blinding_on +#define RSA_public_encrypt wolfSSL_RSA_public_encrypt +#define RSA_private_decrypt wolfSSL_RSA_private_decrypt +#define RSA_private_encrypt wolfSSL_RSA_private_encrypt + +#define RSA_size wolfSSL_RSA_size +#define RSA_sign wolfSSL_RSA_sign +#define RSA_verify wolfSSL_RSA_verify +#define RSA_public_decrypt wolfSSL_RSA_public_decrypt + + +#ifdef __cplusplus + } /* extern "C" */ +#endif + +#endif /* header */ diff --git a/include/wolfssl/openssl/sha.h b/include/wolfssl/openssl/sha.h new file mode 100644 index 00000000..550a6df9 --- /dev/null +++ b/include/wolfssl/openssl/sha.h @@ -0,0 +1,179 @@ +/* sha.h + * + * Copyright (C) 2006-2017 wolfSSL Inc. All rights reserved. + * + * This file is part of wolfSSL. + * + * Contact licensing@wolfssl.com with any questions or comments. + * + * http://www.wolfssl.com + */ + + +/* sha.h for openssl */ + + +#ifndef WOLFSSL_SHA_H_ +#define WOLFSSL_SHA_H_ + +#include +#include + +#ifdef WOLFSSL_PREFIX +#include "prefix_sha.h" +#endif + +#ifdef __cplusplus + extern "C" { +#endif + + +typedef struct WOLFSSL_SHA_CTX { + /* big enough to hold wolfcrypt Sha, but check on init */ + void* holder[(112 + WC_ASYNC_DEV_SIZE) / sizeof(void*)]; +} WOLFSSL_SHA_CTX; + +WOLFSSL_API int wolfSSL_SHA_Init(WOLFSSL_SHA_CTX*); +WOLFSSL_API int wolfSSL_SHA_Update(WOLFSSL_SHA_CTX*, const void*, unsigned long); +WOLFSSL_API int wolfSSL_SHA_Final(unsigned char*, WOLFSSL_SHA_CTX*); + +/* SHA1 points to above, shouldn't use SHA0 ever */ +WOLFSSL_API int wolfSSL_SHA1_Init(WOLFSSL_SHA_CTX*); +WOLFSSL_API int wolfSSL_SHA1_Update(WOLFSSL_SHA_CTX*, const void*, unsigned long); +WOLFSSL_API int wolfSSL_SHA1_Final(unsigned char*, WOLFSSL_SHA_CTX*); + +enum { + SHA_DIGEST_LENGTH = 20 +}; + + +typedef WOLFSSL_SHA_CTX SHA_CTX; + +#define SHA_Init wolfSSL_SHA_Init +#define SHA_Update wolfSSL_SHA_Update +#define SHA_Final wolfSSL_SHA_Final + +#define SHA1_Init wolfSSL_SHA1_Init +#define SHA1_Update wolfSSL_SHA1_Update +#define SHA1_Final wolfSSL_SHA1_Final + + +#ifdef WOLFSSL_SHA224 + +/* Using ALIGN16 because when AES-NI is enabled digest and buffer in Sha256 + * struct are 16 byte aligned. Any derefrence to those elements after casting to + * Sha224, is expected to also be 16 byte aligned addresses. */ +typedef struct WOLFSSL_SHA224_CTX { + /* big enough to hold wolfcrypt Sha224, but check on init */ + ALIGN16 void* holder[(272 + WC_ASYNC_DEV_SIZE) / sizeof(void*)]; +} WOLFSSL_SHA224_CTX; + +WOLFSSL_API int wolfSSL_SHA224_Init(WOLFSSL_SHA224_CTX*); +WOLFSSL_API int wolfSSL_SHA224_Update(WOLFSSL_SHA224_CTX*, const void*, + unsigned long); +WOLFSSL_API int wolfSSL_SHA224_Final(unsigned char*, WOLFSSL_SHA224_CTX*); + +enum { + SHA224_DIGEST_LENGTH = 28 +}; + + +typedef WOLFSSL_SHA224_CTX SHA224_CTX; + +#define SHA224_Init wolfSSL_SHA224_Init +#define SHA224_Update wolfSSL_SHA224_Update +#define SHA224_Final wolfSSL_SHA224_Final + +#endif /* WOLFSSL_SHA224 */ + + +/* Using ALIGN16 because when AES-NI is enabled digest and buffer in Sha256 + * struct are 16 byte aligned. Any derefrence to those elements after casting to + * Sha256, is expected to also be 16 byte aligned addresses. */ +typedef struct WOLFSSL_SHA256_CTX { + /* big enough to hold wolfcrypt Sha256, but check on init */ + ALIGN16 void* holder[(272 + WC_ASYNC_DEV_SIZE) / sizeof(void*)]; +} WOLFSSL_SHA256_CTX; + +WOLFSSL_API int wolfSSL_SHA256_Init(WOLFSSL_SHA256_CTX*); +WOLFSSL_API int wolfSSL_SHA256_Update(WOLFSSL_SHA256_CTX*, const void*, + unsigned long); +WOLFSSL_API int wolfSSL_SHA256_Final(unsigned char*, WOLFSSL_SHA256_CTX*); + +enum { + SHA256_DIGEST_LENGTH = 32 +}; + + +typedef WOLFSSL_SHA256_CTX SHA256_CTX; + +#define SHA256_Init wolfSSL_SHA256_Init +#define SHA256_Update wolfSSL_SHA256_Update +#define SHA256_Final wolfSSL_SHA256_Final +#if defined(NO_OLD_SHA256_NAMES) && !defined(HAVE_FIPS) + /* SHA256 is only available in non-fips mode because of SHA256 enum in FIPS + * build. */ + #define SHA256 wolfSSL_SHA256 +#endif + + +#ifdef WOLFSSL_SHA384 + +typedef struct WOLFSSL_SHA384_CTX { + /* big enough to hold wolfCrypt Sha384, but check on init */ + void* holder[(256 + WC_ASYNC_DEV_SIZE) / sizeof(void*)]; +} WOLFSSL_SHA384_CTX; + +WOLFSSL_API int wolfSSL_SHA384_Init(WOLFSSL_SHA384_CTX*); +WOLFSSL_API int wolfSSL_SHA384_Update(WOLFSSL_SHA384_CTX*, const void*, + unsigned long); +WOLFSSL_API int wolfSSL_SHA384_Final(unsigned char*, WOLFSSL_SHA384_CTX*); + +enum { + SHA384_DIGEST_LENGTH = 48 +}; + + +typedef WOLFSSL_SHA384_CTX SHA384_CTX; + +#define SHA384_Init wolfSSL_SHA384_Init +#define SHA384_Update wolfSSL_SHA384_Update +#define SHA384_Final wolfSSL_SHA384_Final + +#endif /* WOLFSSL_SHA384 */ + +#ifdef WOLFSSL_SHA512 + +typedef struct WOLFSSL_SHA512_CTX { + /* big enough to hold wolfCrypt Sha384, but check on init */ + void* holder[(288 + WC_ASYNC_DEV_SIZE) / sizeof(void*)]; +} WOLFSSL_SHA512_CTX; + +WOLFSSL_API int wolfSSL_SHA512_Init(WOLFSSL_SHA512_CTX*); +WOLFSSL_API int wolfSSL_SHA512_Update(WOLFSSL_SHA512_CTX*, const void*, + unsigned long); +WOLFSSL_API int wolfSSL_SHA512_Final(unsigned char*, WOLFSSL_SHA512_CTX*); + +enum { + SHA512_DIGEST_LENGTH = 64 +}; + + +typedef WOLFSSL_SHA512_CTX SHA512_CTX; + +#define SHA512_Init wolfSSL_SHA512_Init +#define SHA512_Update wolfSSL_SHA512_Update +#define SHA512_Final wolfSSL_SHA512_Final + +#endif /* WOLFSSL_SHA512 */ + + + + +#ifdef __cplusplus + } /* extern "C" */ +#endif + + +#endif /* WOLFSSL_SHA_H_ */ + diff --git a/include/wolfssl/openssl/ssl.h b/include/wolfssl/openssl/ssl.h new file mode 100644 index 00000000..0a094a70 --- /dev/null +++ b/include/wolfssl/openssl/ssl.h @@ -0,0 +1,903 @@ +/* ssl.h + * + * Copyright (C) 2006-2017 wolfSSL Inc. All rights reserved. + * + * This file is part of wolfSSL. + * + * Contact licensing@wolfssl.com with any questions or comments. + * + * http://www.wolfssl.com + */ + + + + +/* ssl.h defines wolfssl_openssl compatibility layer + * + */ + + +#ifndef WOLFSSL_OPENSSL_H_ +#define WOLFSSL_OPENSSL_H_ + +/* wolfssl_openssl compatibility layer */ +#ifndef OPENSSL_EXTRA_SSL_GUARD +#define OPENSSL_EXTRA_SSL_GUARD +#include +#endif /* OPENSSL_EXTRA_SSL_GUARD */ + +#include + +#ifdef __cplusplus + extern "C" { +#endif + +#ifdef _WIN32 + /* wincrypt.h clashes */ + #undef X509_NAME +#endif + +#ifdef WOLFSSL_UTASKER + /* tcpip.h clashes */ + #undef ASN1_INTEGER +#endif + + +typedef WOLFSSL SSL; +typedef WOLFSSL_SESSION SSL_SESSION; +typedef WOLFSSL_METHOD SSL_METHOD; +typedef WOLFSSL_CTX SSL_CTX; + +typedef WOLFSSL_X509 X509; +typedef WOLFSSL_X509 X509_REQ; +typedef WOLFSSL_X509_NAME X509_NAME; +typedef WOLFSSL_X509_CHAIN X509_CHAIN; + + +/* redeclare guard */ +#define WOLFSSL_TYPES_DEFINED + + +typedef WOLFSSL_EVP_PKEY EVP_PKEY; +typedef WOLFSSL_EVP_PKEY PKCS8_PRIV_KEY_INFO; +typedef WOLFSSL_BIO BIO; +typedef WOLFSSL_BIO_METHOD BIO_METHOD; +typedef WOLFSSL_CIPHER SSL_CIPHER; +typedef WOLFSSL_X509_LOOKUP X509_LOOKUP; +typedef WOLFSSL_X509_LOOKUP_METHOD X509_LOOKUP_METHOD; +typedef WOLFSSL_X509_CRL X509_CRL; +typedef WOLFSSL_X509_EXTENSION X509_EXTENSION; +typedef WOLFSSL_ASN1_TIME ASN1_TIME; +typedef WOLFSSL_ASN1_INTEGER ASN1_INTEGER; +typedef WOLFSSL_ASN1_OBJECT ASN1_OBJECT; +typedef WOLFSSL_ASN1_STRING ASN1_STRING; +typedef WOLFSSL_dynlock_value CRYPTO_dynlock_value; +typedef WOLFSSL_BUF_MEM BUF_MEM; + +/* GENERAL_NAME and BASIC_CONSTRAINTS structs may need implemented as + * compatibility layer expands. For now treating them as an ASN1_OBJECT */ +typedef WOLFSSL_ASN1_OBJECT GENERAL_NAME; +typedef WOLFSSL_ASN1_OBJECT BASIC_CONSTRAINTS; + +#define ASN1_UTCTIME WOLFSSL_ASN1_TIME +#define ASN1_GENERALIZEDTIME WOLFSSL_ASN1_TIME + +typedef WOLFSSL_COMP_METHOD COMP_METHOD; +typedef WOLFSSL_X509_REVOKED X509_REVOKED; +typedef WOLFSSL_X509_OBJECT X509_OBJECT; +typedef WOLFSSL_X509_STORE X509_STORE; +typedef WOLFSSL_X509_STORE_CTX X509_STORE_CTX; + +#define CRYPTO_free XFREE +#define CRYPTO_malloc XMALLOC +#define CRYPTO_EX_new WOLFSSL_CRYPTO_EX_new +#define CRYPTO_EX_dup WOLFSSL_CRYPTO_EX_dup +#define CRYPTO_EX_free WOLFSSL_CRYPTO_EX_free + +#define STACK_OF(x) WOLFSSL_STACK + +/* this function was used to set the default malloc, free, and realloc */ +#define CRYPTO_malloc_init() /* CRYPTO_malloc_init is not needed */ + +#define SSL_get_client_random(ssl,out,outSz) \ + wolfSSL_get_client_random((ssl),(out),(outSz)) +#define SSL_get_cipher_list(ctx,i) wolfSSL_get_cipher_list_ex((ctx),(i)) +#define SSL_get_cipher_name(ctx) wolfSSL_get_cipher((ctx)) +#define SSL_get_shared_ciphers(ctx,buf,len) \ + wolfSSL_get_shared_ciphers((ctx),(buf),(len)) + +#define ERR_print_errors_fp(file) wolfSSL_ERR_dump_errors_fp((file)) + +/* at the moment only returns ok */ +#define SSL_get_verify_result wolfSSL_get_verify_result +#define SSL_get_verify_mode wolfSSL_SSL_get_mode +#define SSL_get_verify_depth wolfSSL_get_verify_depth +#define SSL_CTX_get_verify_mode wolfSSL_CTX_get_verify_mode +#define SSL_CTX_get_verify_depth wolfSSL_CTX_get_verify_depth +#define SSL_get_certificate wolfSSL_get_certificate +#define SSL_use_certificate wolfSSL_use_certificate +#define SSL_use_certificate_ASN1 wolfSSL_use_certificate_ASN1 +#define d2i_PKCS8_PRIV_KEY_INFO_bio wolfSSL_d2i_PKCS8_PKEY_bio +#define PKCS8_PRIV_KEY_INFO_free wolfSSL_EVP_PKEY_free + +#define d2i_PUBKEY_bio wolfSSL_d2i_PUBKEY_bio +#define d2i_PrivateKey wolfSSL_d2i_PrivateKey +#define SSL_use_PrivateKey wolfSSL_use_PrivateKey +#define SSL_use_PrivateKey_ASN1 wolfSSL_use_PrivateKey_ASN1 +#define SSL_use_RSAPrivateKey_ASN1 wolfSSL_use_RSAPrivateKey_ASN1 +#define SSL_get_privatekey wolfSSL_get_privatekey + +#define SSLv23_method wolfSSLv23_method +#define SSLv3_server_method wolfSSLv3_server_method +#define SSLv3_client_method wolfSSLv3_client_method +#define TLSv1_method wolfTLSv1_method +#define TLSv1_server_method wolfTLSv1_server_method +#define TLSv1_client_method wolfTLSv1_client_method +#define TLSv1_1_server_method wolfTLSv1_1_server_method +#define TLSv1_1_client_method wolfTLSv1_1_client_method +#define TLSv1_2_server_method wolfTLSv1_2_server_method +#define TLSv1_2_client_method wolfTLSv1_2_client_method + +#define X509_FILETYPE_ASN1 SSL_FILETYPE_ASN1 + +#ifdef WOLFSSL_DTLS + #define DTLSv1_client_method wolfDTLSv1_client_method + #define DTLSv1_server_method wolfDTLSv1_server_method + #define DTLSv1_2_client_method wolfDTLSv1_2_client_method + #define DTLSv1_2_server_method wolfDTLSv1_2_server_method +#endif + + +#ifndef NO_FILESYSTEM + #define SSL_CTX_use_certificate_file wolfSSL_CTX_use_certificate_file + #define SSL_CTX_use_PrivateKey_file wolfSSL_CTX_use_PrivateKey_file + #define SSL_CTX_load_verify_locations wolfSSL_CTX_load_verify_locations + #define SSL_CTX_use_certificate_chain_file wolfSSL_CTX_use_certificate_chain_file + #define SSL_CTX_use_RSAPrivateKey_file wolfSSL_CTX_use_RSAPrivateKey_file + + #define SSL_use_certificate_file wolfSSL_use_certificate_file + #define SSL_use_PrivateKey_file wolfSSL_use_PrivateKey_file + #define SSL_use_certificate_chain_file wolfSSL_use_certificate_chain_file + #define SSL_use_RSAPrivateKey_file wolfSSL_use_RSAPrivateKey_file +#endif + +#define SSL_CTX_new wolfSSL_CTX_new +#define SSL_new wolfSSL_new +#define SSL_set_fd wolfSSL_set_fd +#define SSL_get_fd wolfSSL_get_fd +#define SSL_connect wolfSSL_connect +#define SSL_clear wolfSSL_clear +#define SSL_state wolfSSL_state + +#define SSL_write wolfSSL_write +#define SSL_read wolfSSL_read +#define SSL_peek wolfSSL_peek +#define SSL_accept wolfSSL_accept +#define SSL_CTX_free wolfSSL_CTX_free +#define SSL_free wolfSSL_free +#define SSL_shutdown wolfSSL_shutdown + +#define SSL_CTX_set_quiet_shutdown wolfSSL_CTX_set_quiet_shutdown +#define SSL_set_quiet_shutdown wolfSSL_set_quiet_shutdown +#define SSL_get_error wolfSSL_get_error +#define SSL_set_session wolfSSL_set_session +#define SSL_get_session wolfSSL_get_session +#define SSL_flush_sessions wolfSSL_flush_sessions +/* assume unlimited temporarily */ +#define SSL_CTX_get_session_cache_mode(ctx) 0 + +#define SSL_CTX_set_verify wolfSSL_CTX_set_verify +#define SSL_set_verify wolfSSL_set_verify +#define SSL_pending wolfSSL_pending +#define SSL_load_error_strings wolfSSL_load_error_strings +#define SSL_library_init wolfSSL_library_init +#define SSL_CTX_set_session_cache_mode wolfSSL_CTX_set_session_cache_mode +#define SSL_CTX_set_cipher_list wolfSSL_CTX_set_cipher_list +#define SSL_set_cipher_list wolfSSL_set_cipher_list + +#define ERR_error_string wolfSSL_ERR_error_string +#define ERR_error_string_n wolfSSL_ERR_error_string_n +#define ERR_reason_error_string wolfSSL_ERR_reason_error_string + +#define SSL_set_ex_data wolfSSL_set_ex_data +#define SSL_get_shutdown wolfSSL_get_shutdown +#define SSL_set_rfd wolfSSL_set_rfd +#define SSL_set_wfd wolfSSL_set_wfd +#define SSL_set_shutdown wolfSSL_set_shutdown +#define SSL_set_session_id_context wolfSSL_set_session_id_context +#define SSL_set_connect_state wolfSSL_set_connect_state +#define SSL_set_accept_state wolfSSL_set_accept_state +#define SSL_session_reused wolfSSL_session_reused +#define SSL_SESSION_free wolfSSL_SESSION_free +#define SSL_is_init_finished wolfSSL_is_init_finished + +#define SSL_get_version wolfSSL_get_version +#define SSL_get_current_cipher wolfSSL_get_current_cipher + +/* use wolfSSL_get_cipher_name for its return format */ +#define SSL_get_cipher wolfSSL_get_cipher_name +#define SSL_CIPHER_description wolfSSL_CIPHER_description +#define SSL_CIPHER_get_name wolfSSL_CIPHER_get_name +#define SSL_get1_session wolfSSL_get1_session + +#define SSL_get_keyblock_size wolfSSL_get_keyblock_size +#define SSL_get_keys wolfSSL_get_keys +#define SSL_SESSION_get_master_key wolfSSL_SESSION_get_master_key +#define SSL_SESSION_get_master_key_length wolfSSL_SESSION_get_master_key_length + +#define DSA_dup_DH wolfSSL_DSA_dup_DH + +#define X509_load_certificate_file wolfSSL_X509_load_certificate_file +#define X509_NAME_get_text_by_NID wolfSSL_X509_NAME_get_text_by_NID +#define X509_get_ext_d2i wolfSSL_X509_get_ext_d2i +#define X509_digest wolfSSL_X509_digest +#define X509_free wolfSSL_X509_free +#define X509_new wolfSSL_X509_new +#define OPENSSL_free wolfSSL_OPENSSL_free +#define OPENSSL_malloc wolfSSL_OPENSSL_malloc + +#define OCSP_parse_url wolfSSL_OCSP_parse_url +#define SSLv23_client_method wolfSSLv23_client_method +#define SSLv2_client_method wolfSSLv2_client_method +#define SSLv2_server_method wolfSSLv2_server_method + +#define MD4_Init wolfSSL_MD4_Init +#define MD4_Update wolfSSL_MD4_Update +#define MD4_Final wolfSSL_MD4_Final + +#define BIO_new wolfSSL_BIO_new +#define BIO_free wolfSSL_BIO_free +#define BIO_free_all wolfSSL_BIO_free_all +#define BIO_nread0 wolfSSL_BIO_nread0 +#define BIO_nread wolfSSL_BIO_nread +#define BIO_read wolfSSL_BIO_read +#define BIO_nwrite0 wolfSSL_BIO_nwrite0 +#define BIO_nwrite wolfSSL_BIO_nwrite +#define BIO_write wolfSSL_BIO_write +#define BIO_push wolfSSL_BIO_push +#define BIO_pop wolfSSL_BIO_pop +#define BIO_flush wolfSSL_BIO_flush +#define BIO_pending wolfSSL_BIO_pending + +#define BIO_get_mem_data wolfSSL_BIO_get_mem_data +#define BIO_new_mem_buf wolfSSL_BIO_new_mem_buf + +#define BIO_f_buffer wolfSSL_BIO_f_buffer +#define BIO_set_write_buffer_size wolfSSL_BIO_set_write_buffer_size +#define BIO_f_ssl wolfSSL_BIO_f_ssl +#define BIO_new_socket wolfSSL_BIO_new_socket +#define SSL_set_bio wolfSSL_set_bio +#define BIO_eof wolfSSL_BIO_eof +#define BIO_set_ss wolfSSL_BIO_set_ss + +#define BIO_s_mem wolfSSL_BIO_s_mem +#define BIO_f_base64 wolfSSL_BIO_f_base64 +#define BIO_set_flags wolfSSL_BIO_set_flags + +#define OpenSSL_add_all_digests() wolfCrypt_Init() +#define OpenSSL_add_all_ciphers() wolfCrypt_Init() +#define OpenSSL_add_all_algorithms wolfSSL_add_all_algorithms +#define SSLeay_add_ssl_algorithms wolfSSL_add_all_algorithms +#define SSLeay_add_all_algorithms wolfSSL_add_all_algorithms + +#define RAND_screen wolfSSL_RAND_screen +#define RAND_file_name wolfSSL_RAND_file_name +#define RAND_write_file wolfSSL_RAND_write_file +#define RAND_load_file wolfSSL_RAND_load_file +#define RAND_egd wolfSSL_RAND_egd +#define RAND_seed wolfSSL_RAND_seed +#define RAND_cleanup wolfSSL_RAND_Cleanup +#define RAND_add wolfSSL_RAND_add + +#define COMP_zlib wolfSSL_COMP_zlib +#define COMP_rle wolfSSL_COMP_rle +#define SSL_COMP_add_compression_method wolfSSL_COMP_add_compression_method + +#define SSL_get_ex_new_index wolfSSL_get_ex_new_index + +/* depreciated */ +#define CRYPTO_thread_id wolfSSL_thread_id +#define CRYPTO_set_id_callback wolfSSL_set_id_callback + +#define CRYPTO_set_locking_callback wolfSSL_set_locking_callback +#define CRYPTO_set_dynlock_create_callback wolfSSL_set_dynlock_create_callback +#define CRYPTO_set_dynlock_lock_callback wolfSSL_set_dynlock_lock_callback +#define CRYPTO_set_dynlock_destroy_callback wolfSSL_set_dynlock_destroy_callback +#define CRYPTO_num_locks wolfSSL_num_locks + + +#define CRYPTO_LOCK 1 +#define CRYPTO_UNLOCK 2 +#define CRYPTO_READ 4 +#define CRYPTO_WRITE 8 + +#define X509_STORE_CTX_get_current_cert wolfSSL_X509_STORE_CTX_get_current_cert +#define X509_STORE_add_cert wolfSSL_X509_STORE_add_cert +#define X509_STORE_set_flags wolfSSL_X509_STORE_set_flags +#define X509_STORE_CTX_set_verify_cb wolfSSL_X509_STORE_CTX_set_verify_cb +#define X509_STORE_CTX_free wolfSSL_X509_STORE_CTX_free +#define X509_STORE_CTX_new wolfSSL_X509_STORE_CTX_new +#define X509_STORE_CTX_get_chain wolfSSL_X509_STORE_CTX_get_chain +#define X509_STORE_CTX_get_error wolfSSL_X509_STORE_CTX_get_error +#define X509_STORE_CTX_get_error_depth wolfSSL_X509_STORE_CTX_get_error_depth + +#define X509_print wolfSSL_X509_print +#define X509_NAME_cmp wolfSSL_X509_NAME_cmp +#define i2d_X509_NAME wolfSSL_i2d_X509_NAME +#define X509_NAME_ENTRY_free wolfSSL_X509_NAME_ENTRY_free +#define X509_NAME_ENTRY_create_by_NID wolfSSL_X509_NAME_ENTRY_create_by_NID +#define X509_NAME_add_entry wolfSSL_X509_NAME_add_entry +#define X509_NAME_oneline wolfSSL_X509_NAME_oneline +#define X509_get_issuer_name wolfSSL_X509_get_issuer_name +#define X509_get_subject_name wolfSSL_X509_get_subject_name +#define X509_verify_cert_error_string wolfSSL_X509_verify_cert_error_string +#define X509_verify_cert wolfSSL_X509_verify_cert + +#define X509_LOOKUP_add_dir wolfSSL_X509_LOOKUP_add_dir +#define X509_LOOKUP_load_file wolfSSL_X509_LOOKUP_load_file +#define X509_LOOKUP_hash_dir wolfSSL_X509_LOOKUP_hash_dir +#define X509_LOOKUP_file wolfSSL_X509_LOOKUP_file + +#define X509_STORE_add_lookup wolfSSL_X509_STORE_add_lookup +#define X509_STORE_new wolfSSL_X509_STORE_new +#define X509_STORE_get_by_subject wolfSSL_X509_STORE_get_by_subject +#define X509_STORE_CTX_init wolfSSL_X509_STORE_CTX_init +#define X509_STORE_CTX_cleanup wolfSSL_X509_STORE_CTX_cleanup + +#define X509_CRL_get_lastUpdate wolfSSL_X509_CRL_get_lastUpdate +#define X509_CRL_get_nextUpdate wolfSSL_X509_CRL_get_nextUpdate + +#define X509_get_pubkey wolfSSL_X509_get_pubkey +#define X509_CRL_verify wolfSSL_X509_CRL_verify +#define X509_STORE_CTX_set_error wolfSSL_X509_STORE_CTX_set_error +#define X509_OBJECT_free_contents wolfSSL_X509_OBJECT_free_contents +#define EVP_PKEY_new wolfSSL_PKEY_new +#define EVP_PKEY_free wolfSSL_EVP_PKEY_free +#define EVP_PKEY_type wolfSSL_EVP_PKEY_type +#define EVP_PKEY_base_id wolfSSL_EVP_PKEY_base_id +#define d2i_PUBKEY wolfSSL_d2i_PUBKEY +#define X509_cmp_current_time wolfSSL_X509_cmp_current_time +#define sk_X509_REVOKED_num wolfSSL_sk_X509_REVOKED_num +#define X509_CRL_get_REVOKED wolfSSL_X509_CRL_get_REVOKED +#define sk_X509_REVOKED_value wolfSSL_sk_X509_REVOKED_value +#define X509_get_notBefore(cert) (ASN1_TIME*)wolfSSL_X509_notBefore((cert)) +#define X509_get_notAfter(cert) (ASN1_TIME*)wolfSSL_X509_notAfter((cert)) + + +#define X509_get_serialNumber wolfSSL_X509_get_serialNumber + +#define ASN1_TIME_print wolfSSL_ASN1_TIME_print +#define ASN1_GENERALIZEDTIME_print wolfSSL_ASN1_GENERALIZEDTIME_print +#define ASN1_TIME_adj wolfSSL_ASN1_TIME_adj + +#define ASN1_INTEGER_cmp wolfSSL_ASN1_INTEGER_cmp +#define ASN1_INTEGER_get wolfSSL_ASN1_INTEGER_get +#define ASN1_INTEGER_to_BN wolfSSL_ASN1_INTEGER_to_BN +#define ASN1_STRING_to_UTF8 wolfSSL_ASN1_STRING_to_UTF8 + +#define SSL_load_client_CA_file wolfSSL_load_client_CA_file + +#define SSL_CTX_get_client_CA_list wolfSSL_SSL_CTX_get_client_CA_list +#define SSL_CTX_set_client_CA_list wolfSSL_CTX_set_client_CA_list +#define SSL_CTX_set_cert_store wolfSSL_CTX_set_cert_store +#define SSL_CTX_get_cert_store wolfSSL_CTX_get_cert_store +#define X509_STORE_CTX_get_ex_data wolfSSL_X509_STORE_CTX_get_ex_data +#define SSL_get_ex_data_X509_STORE_CTX_idx wolfSSL_get_ex_data_X509_STORE_CTX_idx +#define SSL_get_ex_data wolfSSL_get_ex_data + +#define SSL_CTX_set_default_passwd_cb_userdata wolfSSL_CTX_set_default_passwd_cb_userdata +#define SSL_CTX_set_default_passwd_cb wolfSSL_CTX_set_default_passwd_cb + +#define SSL_CTX_set_timeout(ctx, to) wolfSSL_CTX_set_timeout(ctx, (unsigned int) to) +#define SSL_CTX_set_info_callback wolfSSL_CTX_set_info_callback +#define SSL_CTX_set_alpn_protos wolfSSL_CTX_set_alpn_protos +#define ERR_peek_error wolfSSL_ERR_peek_error +#define ERR_peek_last_error_line wolfSSL_ERR_peek_last_error_line +#define ERR_peek_errors_fp wolfSSL_ERR_peek_errors_fp +#define ERR_GET_REASON wolfSSL_ERR_GET_REASON + +#define SSL_alert_type_string wolfSSL_alert_type_string +#define SSL_alert_desc_string wolfSSL_alert_desc_string +#define SSL_state_string wolfSSL_state_string + +#define RSA_free wolfSSL_RSA_free +#define RSA_generate_key wolfSSL_RSA_generate_key +#define SSL_CTX_set_tmp_rsa_callback wolfSSL_CTX_set_tmp_rsa_callback + +#define PEM_def_callback wolfSSL_PEM_def_callback + +#define SSL_CTX_sess_accept wolfSSL_CTX_sess_accept +#define SSL_CTX_sess_connect wolfSSL_CTX_sess_connect +#define SSL_CTX_sess_accept_good wolfSSL_CTX_sess_accept_good +#define SSL_CTX_sess_connect_good wolfSSL_CTX_sess_connect_good +#define SSL_CTX_sess_accept_renegotiate wolfSSL_CTX_sess_accept_renegotiate +#define SSL_CTX_sess_connect_renegotiate wolfSSL_CTX_sess_connect_renegotiate +#define SSL_CTX_sess_hits wolfSSL_CTX_sess_hits +#define SSL_CTX_sess_cb_hits wolfSSL_CTX_sess_cb_hits +#define SSL_CTX_sess_cache_full wolfSSL_CTX_sess_cache_full +#define SSL_CTX_sess_misses wolfSSL_CTX_sess_misses +#define SSL_CTX_sess_timeouts wolfSSL_CTX_sess_timeouts +#define SSL_CTX_sess_number wolfSSL_CTX_sess_number +#define SSL_CTX_sess_get_cache_size wolfSSL_CTX_sess_get_cache_size + + +#define SSL_DEFAULT_CIPHER_LIST WOLFSSL_DEFAULT_CIPHER_LIST +#define RSA_F4 WOLFSSL_RSA_F4 + +#define SSL_CTX_set_psk_client_callback wolfSSL_CTX_set_psk_client_callback +#define SSL_set_psk_client_callback wolfSSL_set_psk_client_callback + +#define SSL_get_psk_identity_hint wolfSSL_get_psk_identity_hint +#define SSL_get_psk_identity wolfSSL_get_psk_identity + +#define SSL_CTX_use_psk_identity_hint wolfSSL_CTX_use_psk_identity_hint +#define SSL_use_psk_identity_hint wolfSSL_use_psk_identity_hint + +#define SSL_CTX_set_psk_server_callback wolfSSL_CTX_set_psk_server_callback +#define SSL_set_psk_server_callback wolfSSL_set_psk_server_callback + +/* system file ints for ERR_put_error */ +#define SYS_F_ACCEPT WOLFSSL_SYS_ACCEPT +#define SYS_F_BIND WOLFSSL_SYS_BIND +#define SYS_F_CONNECT WOLFSSL_SYS_CONNECT +#define SYS_F_FOPEN WOLFSSL_SYS_FOPEN +#define SYS_F_FREAD WOLFSSL_SYS_FREAD +#define SYS_F_GETADDRINFO WOLFSSL_SYS_GETADDRINFO +#define SYS_F_GETSOCKOPT WOLFSSL_SYS_GETSOCKOPT +#define SYS_F_GETSOCKNAME WOLFSSL_SYS_GETSOCKNAME +#define SYS_F_OPENDIR WOLFSSL_SYS_OPENDIR +#define SYS_F_SETSOCKOPT WOLFSSL_SYS_SETSOCKOPT +#define SYS_F_SOCKET WOLFSSL_SYS_SOCKET +#define SYS_F_GETHOSTBYNAME WOLFSSL_SYS_GETHOSTBYNAME +#define SYS_F_GETNAMEINFO WOLFSSL_SYS_GETNAMEINFO +#define SYS_F_GETSERVBYNAME WOLFSSL_SYS_GETSERVBYNAME +#define SYS_F_IOCTLSOCKET WOLFSSL_SYS_IOCTLSOCKET +#define SYS_F_LISTEN WOLFSSL_SYS_LISTEN + +#define ERR_put_error wolfSSL_ERR_put_error +#define ERR_get_error_line wolfSSL_ERR_get_error_line +#define ERR_get_error_line_data wolfSSL_ERR_get_error_line_data + +#define ERR_get_error wolfSSL_ERR_get_error +#define ERR_clear_error wolfSSL_ERR_clear_error + +#define RAND_status wolfSSL_RAND_status +#define RAND_bytes wolfSSL_RAND_bytes +#define RAND_pseudo_bytes wolfSSL_RAND_pseudo_bytes +#define SSLv23_server_method wolfSSLv23_server_method +#define SSL_CTX_set_options wolfSSL_CTX_set_options +#define SSL_CTX_get_options wolfSSL_CTX_get_options +#define SSL_CTX_clear_options wolfSSL_CTX_clear_options + +#define SSL_CTX_check_private_key wolfSSL_CTX_check_private_key +#define SSL_check_private_key wolfSSL_check_private_key + +#define ERR_free_strings wolfSSL_ERR_free_strings +#define ERR_remove_state wolfSSL_ERR_remove_state +#define EVP_cleanup wolfSSL_EVP_cleanup + +#define CRYPTO_cleanup_all_ex_data wolfSSL_cleanup_all_ex_data +#define SSL_CTX_set_mode wolfSSL_CTX_set_mode +#define SSL_CTX_get_mode wolfSSL_CTX_get_mode +#define SSL_CTX_set_default_read_ahead wolfSSL_CTX_set_default_read_ahead + +#define SSL_CTX_sess_set_cache_size wolfSSL_CTX_sess_set_cache_size +#define SSL_CTX_set_default_verify_paths wolfSSL_CTX_set_default_verify_paths + +#define SSL_CTX_set_session_id_context wolfSSL_CTX_set_session_id_context +#define SSL_get_peer_certificate wolfSSL_get_peer_certificate +#define SSL_get_peer_cert_chain wolfSSL_get_peer_cert_chain + +#define SSL_want_read wolfSSL_want_read +#define SSL_want_write wolfSSL_want_write + +#define BIO_prf wolfSSL_BIO_prf +#define ASN1_UTCTIME_pr wolfSSL_ASN1_UTCTIME_pr + +#define sk_num wolfSSL_sk_num +#define sk_value wolfSSL_sk_value +#define sk_X509_pop wolfSSL_sk_X509_pop +#define sk_X509_free wolfSSL_sk_X509_free +#define i2d_X509_bio wolfSSL_i2d_X509_bio +#define d2i_X509_bio wolfSSL_d2i_X509_bio +#define i2d_X509 wolfSSL_i2d_X509 +#define d2i_X509 wolfSSL_d2i_X509 + +#define SSL_CTX_get_ex_data wolfSSL_CTX_get_ex_data +#define SSL_CTX_set_ex_data wolfSSL_CTX_set_ex_data +#define SSL_CTX_sess_set_get_cb wolfSSL_CTX_sess_set_get_cb +#define SSL_CTX_sess_set_new_cb wolfSSL_CTX_sess_set_new_cb +#define SSL_CTX_sess_set_remove_cb wolfSSL_CTX_sess_set_remove_cb + +#define i2d_SSL_SESSION wolfSSL_i2d_SSL_SESSION +#define d2i_SSL_SESSION wolfSSL_d2i_SSL_SESSION +#define SSL_SESSION_set_timeout wolfSSL_SSL_SESSION_set_timeout +#define SSL_SESSION_get_timeout wolfSSL_SESSION_get_timeout +#define SSL_SESSION_get_time wolfSSL_SESSION_get_time +#define SSL_CTX_get_ex_new_index wolfSSL_CTX_get_ex_new_index +#define PEM_read_bio_X509 wolfSSL_PEM_read_bio_X509 +#define PEM_read_bio_X509_AUX wolfSSL_PEM_read_bio_X509_AUX + +/*#if OPENSSL_API_COMPAT < 0x10100000L*/ +#define CONF_modules_free() +#define ENGINE_cleanup() +#define HMAC_CTX_cleanup wolfSSL_HMAC_cleanup +#define SSL_CTX_need_tmp_RSA(ctx) 0 +#define SSL_CTX_set_tmp_rsa(ctx,rsa) 1 +#define SSL_need_tmp_RSA(ssl) 0 +#define SSL_set_tmp_rsa(ssl,rsa) 1 +/*#endif*/ + +#define CONF_modules_unload(a) + +#define SSL_get_hit wolfSSL_session_reused + +/* yassl had set the default to be 500 */ +#define SSL_get_default_timeout(ctx) 500 + +#define X509_NAME_free wolfSSL_X509_NAME_free +#define X509_NAME_new wolfSSL_X509_NAME_new + +typedef WOLFSSL_X509_NAME_ENTRY X509_NAME_ENTRY; + +#define SSL_CTX_use_certificate wolfSSL_CTX_use_certificate +#define SSL_CTX_use_PrivateKey wolfSSL_CTX_use_PrivateKey +#define BIO_read_filename wolfSSL_BIO_read_filename +#define BIO_s_file wolfSSL_BIO_s_file +#define SSL_CTX_set_verify_depth wolfSSL_CTX_set_verify_depth +#define SSL_set_verify_depth wolfSSL_set_verify_depth +#define SSL_get_app_data wolfSSL_get_app_data +#define SSL_set_app_data wolfSSL_set_app_data +#define X509_NAME_entry_count wolfSSL_X509_NAME_entry_count +#define X509_NAME_ENTRY_get_object wolfSSL_X509_NAME_ENTRY_get_object +#define X509_NAME_get_entry wolfSSL_X509_NAME_get_entry +#define ASN1_STRING_data wolfSSL_ASN1_STRING_data +#define ASN1_STRING_length wolfSSL_ASN1_STRING_length +#define X509_NAME_get_index_by_NID wolfSSL_X509_NAME_get_index_by_NID +#define X509_NAME_ENTRY_get_data wolfSSL_X509_NAME_ENTRY_get_data +#define sk_X509_NAME_pop_free wolfSSL_sk_X509_NAME_pop_free +#define SHA1 wolfSSL_SHA1 +#define X509_check_private_key wolfSSL_X509_check_private_key +#define SSL_dup_CA_list wolfSSL_dup_CA_list + + + + +/* NIDs */ +enum { + NID_des = 66, + NID_des3 = 67, + NID_sha256 = 672, + NID_sha384 = 673, + NID_sha512 = 674, + NID_hw_name_oid = 73, + NID_id_pkix_OCSP_basic = 74, + NID_any_policy = 75, + NID_anyExtendedKeyUsage = 76, +}; + +enum { + GEN_DNS = 0x02, /* ASN_DNS_TYPE */ + GEN_EMAIL = 0x01, /* ASN_RFC822_TYPE */ + GEN_URI = 0x06 /* ASN_URI_TYPE */ +}; + +#define PEM_write_bio_X509_REQ wolfSSL_PEM_write_bio_X509_REQ +#define PEM_write_bio_X509_AUX wolfSSL_PEM_write_bio_X509_AUX + +#define PEM_read_bio_DHparams wolfSSL_PEM_read_bio_DHparams +#define PEM_read_bio_DSAparams wolfSSL_PEM_read_bio_DSAparams +#define PEM_write_bio_X509 wolfSSL_PEM_write_bio_X509 +#define PEM_write_bio_X509_REQ wolfSSL_PEM_write_bio_X509_REQ +#define PEM_write_bio_X509_AUX wolfSSL_PEM_write_bio_X509_AUX + +#ifdef WOLFSSL_HAPROXY +#define SSL_get_rbio wolfSSL_SSL_get_rbio +#define SSL_get_wbio wolfSSL_SSL_get_wbio +#define SSL_do_handshake wolfSSL_SSL_do_handshake +#define SSL_get_ciphers(x) wolfSSL_get_ciphers_compat(x) +#define SSL_SESSION_get_id wolfSSL_SESSION_get_id +#define ASN1_STRING_get0_data wolfSSL_ASN1_STRING_data +#define SSL_get_cipher_bits(s,np) wolfSSL_CIPHER_get_bits(SSL_get_current_cipher(s),np) +#define sk_SSL_CIPHER_num wolfSSL_sk_SSL_CIPHER_num +#define sk_SSL_COMP_zero wolfSSL_sk_SSL_COMP_zero +#define sk_SSL_CIPHER_value wolfSSL_sk_SSL_CIPHER_value +#endif /* WOLFSSL_HAPROXY */ + +#define SSL_CTX_set_tmp_dh wolfSSL_CTX_set_tmp_dh + +#define BIO_new_file wolfSSL_BIO_new_file +#define BIO_ctrl wolfSSL_BIO_ctrl +#define BIO_ctrl_pending wolfSSL_BIO_ctrl_pending +#define BIO_get_mem_ptr wolfSSL_BIO_get_mem_ptr +#define BIO_int_ctrl wolfSSL_BIO_int_ctrl +#define BIO_reset wolfSSL_BIO_reset +#define BIO_s_file wolfSSL_BIO_s_file +#define BIO_s_bio wolfSSL_BIO_s_bio +#define BIO_s_socket wolfSSL_BIO_s_socket +#define BIO_set_fd wolfSSL_BIO_set_fd +#define BIO_ctrl_reset_read_request wolfSSL_BIO_ctrl_reset_read_request + +#define BIO_set_write_buf_size wolfSSL_BIO_set_write_buf_size +#define BIO_make_bio_pair wolfSSL_BIO_make_bio_pair + +#define BIO_set_fp wolfSSL_BIO_set_fp +#define BIO_get_fp wolfSSL_BIO_get_fp +#define BIO_seek wolfSSL_BIO_seek +#define BIO_write_filename wolfSSL_BIO_write_filename +#define BIO_set_mem_eof_return wolfSSL_BIO_set_mem_eof_return + +#define TLSEXT_STATUSTYPE_ocsp 1 + +#define SSL_set_options wolfSSL_set_options +#define SSL_get_options wolfSSL_get_options +#define SSL_clear_options wolfSSL_clear_options +#define SSL_set_tmp_dh wolfSSL_set_tmp_dh +#define SSL_clear_num_renegotiations wolfSSL_clear_num_renegotiations +#define SSL_total_renegotiations wolfSSL_total_renegotiations +#define SSL_set_tlsext_debug_arg wolfSSL_set_tlsext_debug_arg +#define SSL_set_tlsext_status_type wolfSSL_set_tlsext_status_type +#define SSL_set_tlsext_status_exts wolfSSL_set_tlsext_status_exts +#define SSL_get_tlsext_status_ids wolfSSL_get_tlsext_status_ids +#define SSL_set_tlsext_status_ids wolfSSL_set_tlsext_status_ids +#define SSL_get_tlsext_status_ocsp_resp wolfSSL_get_tlsext_status_ocsp_resp +#define SSL_set_tlsext_status_ocsp_resp wolfSSL_set_tlsext_status_ocsp_resp + +#define SSL_CTX_add_extra_chain_cert wolfSSL_CTX_add_extra_chain_cert +#define SSL_CTX_get_read_ahead wolfSSL_CTX_get_read_ahead +#define SSL_CTX_set_read_ahead wolfSSL_CTX_set_read_ahead +#define SSL_CTX_set_tlsext_status_arg wolfSSL_CTX_set_tlsext_status_arg +#define SSL_CTX_set_tlsext_opaque_prf_input_callback_arg \ + wolfSSL_CTX_set_tlsext_opaque_prf_input_callback_arg +#define SSL_get_server_random wolfSSL_get_server_random + +#define SSL_get_tlsext_status_exts wolfSSL_get_tlsext_status_exts + +#define BIO_C_SET_FILE_PTR 106 +#define BIO_C_GET_FILE_PTR 107 +#define BIO_C_SET_FILENAME 108 +#define BIO_C_FILE_SEEK 128 +#define BIO_C_SET_BUF_MEM_EOF_RETURN 130 +#define BIO_C_SET_WRITE_BUF_SIZE 136 +#define BIO_C_MAKE_BIO_PAIR 138 + +#define BIO_CTRL_RESET 1 +#define BIO_CTRL_INFO 3 +#define BIO_CTRL_FLUSH 11 +#define BIO_CLOSE 0x01 +#define BIO_FP_WRITE 0x04 + +#define SSL_CTRL_CLEAR_NUM_RENEGOTIATIONS 11 +#define SSL_CTRL_GET_TOTAL_RENEGOTIATIONS 12 +#define SSL_CTRL_SET_TMP_DH 3 +#define SSL_CTRL_SET_TLSEXT_DEBUG_ARG 57 +#define SSL_CTRL_SET_TLSEXT_STATUS_REQ_TYPE 65 +#define SSL_CTRL_GET_TLSEXT_STATUS_REQ_EXTS 66 +#define SSL_CTRL_SET_TLSEXT_STATUS_REQ_EXTS 67 +#define SSL_CTRL_GET_TLSEXT_STATUS_REQ_IDS 68 +#define SSL_CTRL_SET_TLSEXT_STATUS_REQ_IDS 69 +#define SSL_CTRL_GET_TLSEXT_STATUS_REQ_OCSP_RESP 70 +#define SSL_CTRL_SET_TLSEXT_STATUS_REQ_OCSP_RESP 71 + +#define SSL_CTRL_SET_TMP_DH 3 +#define SSL_CTRL_EXTRA_CHAIN_CERT 14 + +#define SSL_CTRL_SET_SESS_CACHE_SIZE 42 +#define SSL_CTRL_GET_READ_AHEAD 40 +#define SSL_CTRL_SET_READ_AHEAD 41 + +#define SSL_CTRL_SET_TLSEXT_STATUS_REQ_CB 63 +#define SSL_CTRL_SET_TLSEXT_STATUS_REQ_CB_ARG 64 + +#define SSL_CTRL_GET_EXTRA_CHAIN_CERTS 82 + +#define SSL_ctrl wolfSSL_ctrl +#define SSL_CTX_ctrl wolfSSL_CTX_ctrl + +#define X509_V_FLAG_CRL_CHECK WOLFSSL_CRL_CHECK +#define X509_V_FLAG_CRL_CHECK_ALL WOLFSSL_CRL_CHECKALL + +#define X509_V_FLAG_USE_CHECK_TIME WOLFSSL_USE_CHECK_TIME +#define X509_V_FLAG_NO_CHECK_TIME WOLFSSL_NO_CHECK_TIME + +#define SSL3_RANDOM_SIZE 32 /* same as RAN_LEN in internal.h */ +#if defined(HAVE_STUNNEL) || defined(WOLFSSL_NGINX) || defined(OPENSSL_EXTRA) +#include + +#define SSL2_VERSION 0x0002 +#define SSL3_VERSION 0x0300 +#define TLS1_VERSION 0x0301 +#define DTLS1_VERSION 0xFEFF +#define SSL23_ST_SR_CLNT_HELLO_A (0x210|0x2000) +#define SSL3_ST_SR_CLNT_HELLO_A (0x110|0x2000) +#define ASN1_STRFLGS_ESC_MSB 4 + +#define SSL_MAX_MASTER_KEY_LENGTH WOLFSSL_MAX_MASTER_KEY_LENGTH + +#define SSL_alert_desc_string_long wolfSSL_alert_desc_string_long +#define SSL_alert_type_string_long wolfSSL_alert_type_string_long +#define SSL_CIPHER_get_bits wolfSSL_CIPHER_get_bits +#define sk_X509_NAME_num wolfSSL_sk_X509_NAME_num +#define sk_GENERAL_NAME_num wolfSSL_sk_GENERAL_NAME_num +#define sk_X509_num wolfSSL_sk_X509_num +#define X509_NAME_print_ex wolfSSL_X509_NAME_print_ex +#define X509_get0_pubkey_bitstr wolfSSL_X509_get0_pubkey_bitstr +#define SSL_CTX_get_options wolfSSL_CTX_get_options + +#define SSL_CTX_flush_sessions wolfSSL_flush_sessions +#define SSL_CTX_add_session wolfSSL_CTX_add_session +#define SSL_get_SSL_CTX wolfSSL_get_SSL_CTX +#define SSL_version wolfSSL_version +#define SSL_get_state wolfSSL_get_state +#define SSL_state_string_long wolfSSL_state_string_long + +#define sk_X509_NAME_value wolfSSL_sk_X509_NAME_value +#define sk_X509_value wolfSSL_sk_X509_value +#define sk_GENERAL_NAME_value wolfSSL_sk_GENERAL_NAME_value +#define SSL_SESSION_get_ex_data wolfSSL_SESSION_get_ex_data +#define SSL_SESSION_set_ex_data wolfSSL_SESSION_set_ex_data +#define SSL_SESSION_get_ex_new_index wolfSSL_SESSION_get_ex_new_index +#define SSL_SESSION_get_id wolfSSL_SESSION_get_id +#define CRYPTO_dynlock_value WOLFSSL_dynlock_value +typedef WOLFSSL_ASN1_BIT_STRING ASN1_BIT_STRING; +#define X509_STORE_get1_certs wolfSSL_X509_STORE_get1_certs +#define sk_X509_pop_free wolfSSL_sk_X509_pop_free +#define sk_GENERAL_NAME_pop_free wolfSSL_sk_GENERAL_NAME_pop_free +#define GENERAL_NAME_free NULL + +#define SSL3_AL_FATAL 2 +#define SSL_TLSEXT_ERR_OK 0 +#define SSL_TLSEXT_ERR_ALERT_FATAL alert_fatal +#define SSL_TLSEXT_ERR_NOACK alert_warning +#define TLSEXT_NAMETYPE_host_name WOLFSSL_SNI_HOST_NAME + +#define SSL_set_tlsext_host_name wolfSSL_set_tlsext_host_name +#define SSL_get_servername wolfSSL_get_servername +#define SSL_set_SSL_CTX wolfSSL_set_SSL_CTX +#define SSL_CTX_get_verify_callback wolfSSL_CTX_get_verify_callback +#define SSL_CTX_set_tlsext_servername_callback wolfSSL_CTX_set_tlsext_servername_callback +#define SSL_CTX_set_tlsext_servername_arg wolfSSL_CTX_set_servername_arg + +#define PSK_MAX_PSK_LEN 256 +#define PSK_MAX_IDENTITY_LEN 128 +#define ERR_remove_thread_state WOLFSSL_ERR_remove_thread_state +#define SSL_CTX_clear_options wolfSSL_CTX_clear_options + + +#endif /* HAVE_STUNNEL || WOLFSSL_NGINX */ +#define SSL_CTX_get_default_passwd_cb wolfSSL_CTX_get_default_passwd_cb +#define SSL_CTX_get_default_passwd_cb_userdata wolfSSL_CTX_get_default_passwd_cb_userdata + +/* certificate extension NIDs */ +#define NID_basic_constraints 133 +#define NID_key_usage 129 /* 2.5.29.15 */ +#define NID_ext_key_usage 151 /* 2.5.29.37 */ +#define NID_subject_key_identifier 128 +#define NID_authority_key_identifier 149 +#define NID_private_key_usage_period 130 /* 2.5.29.16 */ +#define NID_subject_alt_name 131 +#define NID_issuer_alt_name 132 +#define NID_info_access 69 +#define NID_sinfo_access 79 /* id-pe 11 */ +#define NID_name_constraints 144 /* 2.5.29.30 */ +#define NID_certificate_policies 146 +#define NID_policy_mappings 147 +#define NID_policy_constraints 150 +#define NID_inhibit_any_policy 168 /* 2.5.29.54 */ +#define NID_tlsfeature 92 /* id-pe 24 */ +#define NID_commonName 0x03 /* matchs ASN_COMMON_NAME in asn.h */ +#define NID_domainComponent 0x19 + /* matchs ASN_DOMAIN_COMPONENT in asn.h */ + + /* matchs ASN_..._NAME in asn.h */ +#define NID_surname 0x04, /* SN */ +#define NID_serialNumber 0x05, /* serialNumber */ +#define NID_countryName 0x06, /* C */ +#define NID_localityName 0x07, /* L */ +#define NID_stateOrProvinceName 0x08, /* ST */ +#define NID_organizationName 0x0a, /* O */ +#define NID_organizationalUnitName 0x0b, /* OU */ + + +#define SSL_CTX_set_msg_callback wolfSSL_CTX_set_msg_callback +#define SSL_set_msg_callback wolfSSL_set_msg_callback +#define SSL_CTX_set_msg_callback_arg wolfSSL_CTX_set_msg_callback_arg +#define SSL_set_msg_callback_arg wolfSSL_set_msg_callback_arg + + +/* Nginx uses this to determine if reached end of certs in file. + * PEM_read_bio_X509 is called and the return error is lost. + * The error that needs to be detected is: SSL_NO_PEM_HEADER. + */ +#define ERR_GET_LIB(l) (int)((((unsigned long)l)>>24L)&0xffL) +#define PEM_R_NO_START_LINE 108 +#define ERR_LIB_PEM 9 +#define ERR_LIB_X509 10 + +#if defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY) || \ + defined(WOLFSSL_MYSQL_COMPATIBLE) + +#include + +#define OPENSSL_STRING WOLFSSL_STRING + +#define TLSEXT_TYPE_application_layer_protocol_negotiation 16 + +#define OPENSSL_NPN_UNSUPPORTED 0 +#define OPENSSL_NPN_NEGOTIATED 1 +#define OPENSSL_NPN_NO_OVERLAP 2 + +/* Nginx checks these to see if the error was a handshake error. */ +#define SSL_R_BAD_CHANGE_CIPHER_SPEC LENGTH_ERROR +#define SSL_R_BLOCK_CIPHER_PAD_IS_WRONG BUFFER_E +#define SSL_R_DIGEST_CHECK_FAILED VERIFY_MAC_ERROR +#define SSL_R_ERROR_IN_RECEIVED_CIPHER_LIST SUITES_ERROR +#define SSL_R_EXCESSIVE_MESSAGE_SIZE BUFFER_ERROR +#define SSL_R_LENGTH_MISMATCH LENGTH_ERROR +#define SSL_R_NO_CIPHERS_SPECIFIED SUITES_ERROR +#define SSL_R_NO_COMPRESSION_SPECIFIED COMPRESSION_ERROR +#define SSL_R_NO_SHARED_CIPHER MATCH_SUITE_ERROR +#define SSL_R_RECORD_LENGTH_MISMATCH HANDSHAKE_SIZE_ERROR +#define SSL_R_UNEXPECTED_MESSAGE OUT_OF_ORDER_E +#define SSL_R_UNEXPECTED_RECORD SANITY_MSG_E +#define SSL_R_UNKNOWN_ALERT_TYPE BUFFER_ERROR +#define SSL_R_UNKNOWN_PROTOCOL VERSION_ERROR +#define SSL_R_WRONG_VERSION_NUMBER VERSION_ERROR +#define SSL_R_DECRYPTION_FAILED_OR_BAD_RECORD_MAC ENCRYPT_ERROR + +#ifdef HAVE_SESSION_TICKET +#define SSL_OP_NO_TICKET SSL_OP_NO_TICKET +#define SSL_CTRL_SET_TLSEXT_TICKET_KEY_CB 72 +#endif + +#define OPENSSL_config wolfSSL_OPENSSL_config +#define OPENSSL_memdup wolfSSL_OPENSSL_memdup +#define X509_get_ex_new_index wolfSSL_X509_get_ex_new_index +#define X509_get_ex_data wolfSSL_X509_get_ex_data +#define X509_set_ex_data wolfSSL_X509_set_ex_data +#define X509_NAME_digest wolfSSL_X509_NAME_digest +#define SSL_CTX_get_timeout wolfSSL_SSL_CTX_get_timeout +#define SSL_CTX_set_tmp_ecdh wolfSSL_SSL_CTX_set_tmp_ecdh +#define SSL_CTX_remove_session wolfSSL_SSL_CTX_remove_session +#define SSL_get_rbio wolfSSL_SSL_get_rbio +#define SSL_get_wbio wolfSSL_SSL_get_wbio +#define SSL_do_handshake wolfSSL_SSL_do_handshake +#define SSL_in_init wolfSSL_SSL_in_init +#define SSL_get0_session wolfSSL_SSL_get0_session +#define X509_check_host wolfSSL_X509_check_host +#define i2a_ASN1_INTEGER wolfSSL_i2a_ASN1_INTEGER +#define ERR_peek_error_line_data wolfSSL_ERR_peek_error_line_data +#define ERR_load_BIO_strings wolfSSL_ERR_load_BIO_strings +#define SSL_CTX_set_tlsext_ticket_key_cb wolfSSL_CTX_set_tlsext_ticket_key_cb +#define X509_email_free wolfSSL_X509_email_free +#define X509_get1_ocsp wolfSSL_X509_get1_ocsp +#define SSL_CTX_set_tlsext_status_cb wolfSSL_CTX_set_tlsext_status_cb +#define X509_check_issued wolfSSL_X509_check_issued +#define X509_dup wolfSSL_X509_dup +#define X509_STORE_CTX_new wolfSSL_X509_STORE_CTX_new +#define X509_STORE_CTX_free wolfSSL_X509_STORE_CTX_free +#define SSL_CTX_get_extra_chain_certs wolfSSL_CTX_get_extra_chain_certs +#define X509_STORE_CTX_get1_issuer wolfSSL_X509_STORE_CTX_get1_issuer +#define sk_OPENSSL_STRING_value wolfSSL_sk_WOLFSSL_STRING_value +#define SSL_get0_alpn_selected wolfSSL_get0_alpn_selected +#define SSL_select_next_proto wolfSSL_select_next_proto +#define SSL_CTX_set_alpn_select_cb wolfSSL_CTX_set_alpn_select_cb +#define SSL_CTX_set_next_protos_advertised_cb wolfSSL_CTX_set_next_protos_advertised_cb +#define SSL_CTX_set_next_proto_select_cb wolfSSL_CTX_set_next_proto_select_cb +#define SSL_get0_next_proto_negotiated wolfSSL_get0_next_proto_negotiated +#define SSL_is_server wolfSSL_is_server +#define SSL_CTX_set1_curves_list wolfSSL_CTX_set1_curves_list + +#endif /* WOLFSSL_NGINX || WOLFSSL_HAPROXY */ + +#define X509_STORE_CTX_set_time wolfSSL_X509_STORE_CTX_set_time +#define SSL_CTX_add_client_CA wolfSSL_CTX_add_client_CA +#define SSL_CTX_set_srp_password wolfSSL_CTX_set_srp_password +#define SSL_CTX_set_srp_username wolfSSL_CTX_set_srp_username + +#ifdef __cplusplus + } /* extern "C" */ +#endif + + +#endif /* wolfSSL_openssl_h__ */ diff --git a/include/wolfssl/user_settings.h b/include/wolfssl/user_settings.h index cf5f13af..47a8d39b 100755 --- a/include/wolfssl/user_settings.h +++ b/include/wolfssl/user_settings.h @@ -33,16 +33,12 @@ #define HAVE_PK_CALLBACKS #define WOLFSSL_KEY_GEN #define WOLFSSL_RIPEMD -#define ESP_PLATFORM -#define DEBUG_ESP_PLATFORM #define USE_WOLFSSL_IO #define WOLFSSL_STATIC_RSA #define NO_DH #define NO_MD4 -#define NO_MD5 #define NO_DES3 #define NO_DSA -#define NO_OLD_TLS #define NO_RC4 #define NO_RABBIT #define HAVE_ECC @@ -51,6 +47,13 @@ #define WOLFSSL_TYPES #define NO_FILESYSTEM #define WOLFSSL_ALT_CERT_CHAINS +#define WOLFSSL_ALLOW_TLSV10 +#define WOLFSSL_SMALL_STACK +#define SMALL_SESSION_CACHE + +#define SSL_CTX_use_certificate_ASN1(ctx,len,buf) wolfSSL_CTX_use_certificate_buffer(ctx,buf,len,WOLFSSL_FILETYPE_PEM) +#define SSL_CTX_use_PrivateKey_ASN1(type,ctx,buf,len) wolfSSL_CTX_use_PrivateKey_buffer(ctx,buf,len, WOLFSSL_FILETYPE_PEM) +#define SSL_CTX_load_verify_buffer(ctx,buf,len) wolfSSL_CTX_load_verify_buffer(ctx,buf,len, WOLFSSL_FILETYPE_PEM) #ifdef WOLFSSL_TYPES #ifndef byte @@ -62,11 +65,8 @@ #endif #ifndef CUSTOM_RAND_GENERATE_BLOCK - /* To use define the following:*/ - #define CUSTOM_RAND_GENERATE_BLOCK myRngFunc - extern int myRngFunc(byte* output, word32 sz); - + #define CUSTOM_RAND_GENERATE_BLOCK os_get_random #endif #endif diff --git a/include/wolfssl/wolfcrypt/aes.h b/include/wolfssl/wolfcrypt/aes.h new file mode 100644 index 00000000..adc67846 --- /dev/null +++ b/include/wolfssl/wolfcrypt/aes.h @@ -0,0 +1,450 @@ +/* aes.h + * + * Copyright (C) 2006-2017 wolfSSL Inc. All rights reserved. + * + * This file is part of wolfSSL. + * + * Contact licensing@wolfssl.com with any questions or comments. + * + * http://www.wolfssl.com + */ + + + +#ifndef WOLF_CRYPT_AES_H +#define WOLF_CRYPT_AES_H + +#include + +#ifndef NO_AES + +/* included for fips @wc_fips */ +#ifdef HAVE_FIPS +#include +#if defined(CYASSL_AES_COUNTER) && !defined(WOLFSSL_AES_COUNTER) + #define WOLFSSL_AES_COUNTER +#endif +#if !defined(WOLFSSL_AES_DIRECT) && defined(CYASSL_AES_DIRECT) + #define WOLFSSL_AES_DIRECT +#endif +#endif + +#ifndef HAVE_FIPS /* to avoid redefinition of macros */ + +#ifdef WOLFSSL_AESNI + +#include +#include +#include + +#endif /* WOLFSSL_AESNI */ + +#ifdef WOLFSSL_XILINX_CRYPT +#include "xsecure_aes.h" +#endif + +#endif /* HAVE_FIPS */ + +#ifdef __cplusplus + extern "C" { +#endif + +#ifndef HAVE_FIPS /* to avoid redefinition of structures */ + +#ifdef WOLFSSL_ASYNC_CRYPT + #include +#endif + +enum { + AES_ENC_TYPE = 1, /* cipher unique type */ + AES_ENCRYPTION = 0, + AES_DECRYPTION = 1, + KEYWRAP_BLOCK_SIZE = 8, + AES_BLOCK_SIZE = 16 +}; + + +typedef struct Aes { + /* AESNI needs key first, rounds 2nd, not sure why yet */ + ALIGN16 word32 key[60]; + word32 rounds; + int keylen; + + ALIGN16 word32 reg[AES_BLOCK_SIZE / sizeof(word32)]; /* for CBC mode */ + ALIGN16 word32 tmp[AES_BLOCK_SIZE / sizeof(word32)]; /* same */ + +#ifdef HAVE_AESGCM + ALIGN16 byte H[AES_BLOCK_SIZE]; +#ifdef GCM_TABLE + /* key-based fast multiplication table. */ + ALIGN16 byte M0[256][AES_BLOCK_SIZE]; +#endif /* GCM_TABLE */ +#endif /* HAVE_AESGCM */ +#ifdef WOLFSSL_AESNI + byte use_aesni; +#endif /* WOLFSSL_AESNI */ +#ifdef WOLFSSL_ASYNC_CRYPT + word32 asyncKey[AES_MAX_KEY_SIZE/8/sizeof(word32)]; /* raw key */ + word32 asyncIv[AES_BLOCK_SIZE/sizeof(word32)]; /* raw IV */ + WC_ASYNC_DEV asyncDev; +#endif /* WOLFSSL_ASYNC_CRYPT */ +#if defined(WOLFSSL_AES_COUNTER) || defined(WOLFSSL_AES_CFB) + word32 left; /* unused bytes left from last call */ +#endif +#ifdef WOLFSSL_XILINX_CRYPT + XSecure_Aes xilAes; + XCsuDma dma; + word32 key_init[8]; + word32 kup; +#endif + void* heap; /* memory hint to use */ +} Aes; + +#ifdef WOLFSSL_AES_XTS +typedef struct XtsAes { + Aes aes; + Aes tweak; +} XtsAes; +#endif + +#ifdef HAVE_AESGCM +typedef struct Gmac { + Aes aes; +} Gmac; +#endif /* HAVE_AESGCM */ +#endif /* HAVE_FIPS */ + + +/* Authenticate cipher function prototypes */ +typedef int (*wc_AesAuthEncryptFunc)(Aes* aes, byte* out, + const byte* in, word32 sz, + const byte* iv, word32 ivSz, + byte* authTag, word32 authTagSz, + const byte* authIn, word32 authInSz); +typedef int (*wc_AesAuthDecryptFunc)(Aes* aes, byte* out, + const byte* in, word32 sz, + const byte* iv, word32 ivSz, + const byte* authTag, word32 authTagSz, + const byte* authIn, word32 authInSz); + +/* AES-CBC */ +WOLFSSL_API int wc_AesSetKey(Aes* aes, const byte* key, word32 len, + const byte* iv, int dir); +WOLFSSL_API int wc_AesSetIV(Aes* aes, const byte* iv); +WOLFSSL_API int wc_AesCbcEncrypt(Aes* aes, byte* out, + const byte* in, word32 sz); +WOLFSSL_API int wc_AesCbcDecrypt(Aes* aes, byte* out, + const byte* in, word32 sz); + +#ifdef WOLFSSL_AES_CFB +WOLFSSL_API int wc_AesCfbEncrypt(Aes* aes, byte* out, + const byte* in, word32 sz); +#ifdef HAVE_AES_DECRYPT +WOLFSSL_API int wc_AesCfbDecrypt(Aes* aes, byte* out, + const byte* in, word32 sz); +#endif /* HAVE_AES_DECRYPT */ +#endif /* WOLFSSL_AES_CFB */ + +#ifdef HAVE_AES_ECB +WOLFSSL_API int wc_AesEcbEncrypt(Aes* aes, byte* out, + const byte* in, word32 sz); +WOLFSSL_API int wc_AesEcbDecrypt(Aes* aes, byte* out, + const byte* in, word32 sz); +#endif + +/* AES-CTR */ +#ifdef WOLFSSL_AES_COUNTER + WOLFSSL_API int wc_AesCtrEncrypt(Aes* aes, byte* out, + const byte* in, word32 sz); +#endif +/* AES-DIRECT */ +#if defined(WOLFSSL_AES_DIRECT) + WOLFSSL_API void wc_AesEncryptDirect(Aes* aes, byte* out, const byte* in); + WOLFSSL_API void wc_AesDecryptDirect(Aes* aes, byte* out, const byte* in); + WOLFSSL_API int wc_AesSetKeyDirect(Aes* aes, const byte* key, word32 len, + const byte* iv, int dir); +#endif +#ifdef HAVE_AESGCM +#ifdef WOLFSSL_XILINX_CRYPT + WOLFSSL_API int wc_AesGcmSetKey_ex(Aes* aes, const byte* key, word32 len, + word32 kup); +#endif + WOLFSSL_API int wc_AesGcmSetKey(Aes* aes, const byte* key, word32 len); + WOLFSSL_API int wc_AesGcmEncrypt(Aes* aes, byte* out, + const byte* in, word32 sz, + const byte* iv, word32 ivSz, + byte* authTag, word32 authTagSz, + const byte* authIn, word32 authInSz); + WOLFSSL_API int wc_AesGcmDecrypt(Aes* aes, byte* out, + const byte* in, word32 sz, + const byte* iv, word32 ivSz, + const byte* authTag, word32 authTagSz, + const byte* authIn, word32 authInSz); + + WOLFSSL_API int wc_GmacSetKey(Gmac* gmac, const byte* key, word32 len); + WOLFSSL_API int wc_GmacUpdate(Gmac* gmac, const byte* iv, word32 ivSz, + const byte* authIn, word32 authInSz, + byte* authTag, word32 authTagSz); + WOLFSSL_LOCAL void GHASH(Aes* aes, const byte* a, word32 aSz, const byte* c, + word32 cSz, byte* s, word32 sSz); +#endif /* HAVE_AESGCM */ +#ifdef HAVE_AESCCM + WOLFSSL_API int wc_AesCcmSetKey(Aes* aes, const byte* key, word32 keySz); + WOLFSSL_API int wc_AesCcmEncrypt(Aes* aes, byte* out, + const byte* in, word32 inSz, + const byte* nonce, word32 nonceSz, + byte* authTag, word32 authTagSz, + const byte* authIn, word32 authInSz); + WOLFSSL_API int wc_AesCcmDecrypt(Aes* aes, byte* out, + const byte* in, word32 inSz, + const byte* nonce, word32 nonceSz, + const byte* authTag, word32 authTagSz, + const byte* authIn, word32 authInSz); +#endif /* HAVE_AESCCM */ +#ifdef HAVE_AES_KEYWRAP + WOLFSSL_API int wc_AesKeyWrap(const byte* key, word32 keySz, + const byte* in, word32 inSz, + byte* out, word32 outSz, + const byte* iv); + WOLFSSL_API int wc_AesKeyUnWrap(const byte* key, word32 keySz, + const byte* in, word32 inSz, + byte* out, word32 outSz, + const byte* iv); +#endif /* HAVE_AES_KEYWRAP */ + +#ifdef WOLFSSL_AES_XTS +/*! + \ingroup AES + + \brief This is to help with setting keys to correct encrypt or decrypt type. + + \note Is up to user to call wc_AesXtsFree on aes key when done. + + \return 0 Success + + \param aes AES keys for encrypt/decrypt process + \param key buffer holding aes key | tweak key + \param len length of key buffer in bytes. Should be twice that of key size. + i.e. 32 for a 16 byte key. + \param dir direction, either AES_ENCRYPTION or AES_DECRYPTION + \param heap heap hint to use for memory. Can be NULL + \param devId id to use with async crypto. Can be 0 + + _Example_ + \code + XtsAes aes; + + if(wc_AesXtsSetKey(&aes, key, sizeof(key), AES_ENCRYPTION, NULL, 0) != 0) + { + // Handle error + } + wc_AesXtsFree(&aes); + \endcode + + \sa wc_AesXtsEncrypt + \sa wc_AesXtsDecrypt + \sa wc_AesXtsFree +*/ +WOLFSSL_API int wc_AesXtsSetKey(XtsAes* aes, const byte* key, + word32 len, int dir, void* heap, int devId); + + +/*! + \ingroup AES + + \brief Same process as wc_AesXtsEncrypt but uses a word64 type as the tweak + value instead of a byte array. This just converts the word64 to a + byte array and calls wc_AesXtsEncrypt. + + \return 0 Success + + \param aes AES keys to use for block encrypt/decrypt + \param out output buffer to hold cipher text + \param in input plain text buffer to encrypt + \param sz size of both out and in buffers + \param sector value to use for tweak + + _Example_ + \code + XtsAes aes; + unsigned char plain[SIZE]; + unsigned char cipher[SIZE]; + word64 s = VALUE; + + //set up keys with AES_ENCRYPTION as dir + + if(wc_AesXtsEncryptSector(&aes, cipher, plain, SIZE, s) != 0) + { + // Handle error + } + wc_AesXtsFree(&aes); + \endcode + + \sa wc_AesXtsEncrypt + \sa wc_AesXtsDecrypt + \sa wc_AesXtsSetKey + \sa wc_AesXtsFree +*/ +WOLFSSL_API int wc_AesXtsEncryptSector(XtsAes* aes, byte* out, + const byte* in, word32 sz, word64 sector); + + +/*! + \ingroup AES + + \brief Same process as wc_AesXtsDecrypt but uses a word64 type as the tweak + value instead of a byte array. This just converts the word64 to a + byte array. + + \return 0 Success + + \param aes AES keys to use for block encrypt/decrypt + \param out output buffer to hold plain text + \param in input cipher text buffer to decrypt + \param sz size of both out and in buffers + \param sector value to use for tweak + + _Example_ + \code + XtsAes aes; + unsigned char plain[SIZE]; + unsigned char cipher[SIZE]; + word64 s = VALUE; + + //set up aes key with AES_DECRYPTION as dir and tweak with AES_ENCRYPTION + + if(wc_AesXtsDecryptSector(&aes, plain, cipher, SIZE, s) != 0) + { + // Handle error + } + wc_AesXtsFree(&aes); + \endcode + + \sa wc_AesXtsEncrypt + \sa wc_AesXtsDecrypt + \sa wc_AesXtsSetKey + \sa wc_AesXtsFree +*/ +WOLFSSL_API int wc_AesXtsDecryptSector(XtsAes* aes, byte* out, + const byte* in, word32 sz, word64 sector); + + +/*! + \ingroup AES + + \brief AES with XTS mode. (XTS) XEX encryption with Tweak and cipher text + Stealing. + + \return 0 Success + + \param aes AES keys to use for block encrypt/decrypt + \param out output buffer to hold cipher text + \param in input plain text buffer to encrypt + \param sz size of both out and in buffers + \param i value to use for tweak + \param iSz size of i buffer, should always be AES_BLOCK_SIZE but having + this input adds a sanity check on how the user calls the + function. + + _Example_ + \code + XtsAes aes; + unsigned char plain[SIZE]; + unsigned char cipher[SIZE]; + unsigned char i[AES_BLOCK_SIZE]; + + //set up key with AES_ENCRYPTION as dir + + if(wc_AesXtsEncrypt(&aes, cipher, plain, SIZE, i, sizeof(i)) != 0) + { + // Handle error + } + wc_AesXtsFree(&aes); + \endcode + + \sa wc_AesXtsDecrypt + \sa wc_AesXtsSetKey + \sa wc_AesXtsFree +*/ +WOLFSSL_API int wc_AesXtsEncrypt(XtsAes* aes, byte* out, + const byte* in, word32 sz, const byte* i, word32 iSz); + + +/*! + \ingroup AES + + \brief Same process as encryption but Aes key is AES_DECRYPTION type. + + \return 0 Success + + \param aes AES keys to use for block encrypt/decrypt + \param out output buffer to hold plain text + \param in input cipher text buffer to decrypt + \param sz size of both out and in buffers + \param i value to use for tweak + \param iSz size of i buffer, should always be AES_BLOCK_SIZE but having + this input adds a sanity check on how the user calls the + function. + _Example_ + \code + XtsAes aes; + unsigned char plain[SIZE]; + unsigned char cipher[SIZE]; + unsigned char i[AES_BLOCK_SIZE]; + + //set up key with AES_DECRYPTION as dir and tweak with AES_ENCRYPTION + + if(wc_AesXtsDecrypt(&aes, plain, cipher, SIZE, i, sizeof(i)) != 0) + { + // Handle error + } + wc_AesXtsFree(&aes); + \endcode + + \sa wc_AesXtsEncrypt + \sa wc_AesXtsSetKey + \sa wc_AesXtsFree +*/ +WOLFSSL_API int wc_AesXtsDecrypt(XtsAes* aes, byte* out, + const byte* in, word32 sz, const byte* i, word32 iSz); + + +/*! + \ingroup AES + + \brief This is to free up any resources used by the XtsAes structure + + \return 0 Success + + \param aes AES keys to free + + _Example_ + \code + XtsAes aes; + + if(wc_AesXtsSetKey(&aes, key, sizeof(key), AES_ENCRYPTION, NULL, 0) != 0) + { + // Handle error + } + wc_AesXtsFree(&aes); + \endcode + + \sa wc_AesXtsEncrypt + \sa wc_AesXtsDecrypt + \sa wc_AesXtsSetKey +*/ +WOLFSSL_API int wc_AesXtsFree(XtsAes* aes); +#endif + +WOLFSSL_API int wc_AesGetKeySize(Aes* aes, word32* keySize); + +WOLFSSL_API int wc_AesInit(Aes*, void*, int); +WOLFSSL_API void wc_AesFree(Aes*); + +#ifdef __cplusplus + } /* extern "C" */ +#endif + + +#endif /* NO_AES */ +#endif /* WOLF_CRYPT_AES_H */ diff --git a/include/wolfssl/wolfcrypt/arc4.h b/include/wolfssl/wolfcrypt/arc4.h new file mode 100644 index 00000000..f14216d3 --- /dev/null +++ b/include/wolfssl/wolfcrypt/arc4.h @@ -0,0 +1,56 @@ +/* arc4.h + * + * Copyright (C) 2006-2017 wolfSSL Inc. All rights reserved. + * + * This file is part of wolfSSL. + * + * Contact licensing@wolfssl.com with any questions or comments. + * + * http://www.wolfssl.com + */ + + + + +#ifndef WOLF_CRYPT_ARC4_H +#define WOLF_CRYPT_ARC4_H + +#include + +#ifdef __cplusplus + extern "C" { +#endif + +#ifdef WOLFSSL_ASYNC_CRYPT + #include +#endif + +enum { + ARC4_ENC_TYPE = 4, /* cipher unique type */ + ARC4_STATE_SIZE = 256 +}; + +/* ARC4 encryption and decryption */ +typedef struct Arc4 { + byte x; + byte y; + byte state[ARC4_STATE_SIZE]; +#ifdef WOLFSSL_ASYNC_CRYPT + WC_ASYNC_DEV asyncDev; +#endif + void* heap; +} Arc4; + +WOLFSSL_API int wc_Arc4Process(Arc4*, byte*, const byte*, word32); +WOLFSSL_API int wc_Arc4SetKey(Arc4*, const byte*, word32); + +WOLFSSL_API int wc_Arc4Init(Arc4*, void*, int); +WOLFSSL_API void wc_Arc4Free(Arc4*); + +#ifdef __cplusplus + } /* extern "C" */ +#endif + + +#endif /* WOLF_CRYPT_ARC4_H */ + diff --git a/include/wolfssl/wolfcrypt/des3.h b/include/wolfssl/wolfcrypt/des3.h new file mode 100644 index 00000000..2ba69280 --- /dev/null +++ b/include/wolfssl/wolfcrypt/des3.h @@ -0,0 +1,118 @@ +/* des3.h + * + * Copyright (C) 2006-2017 wolfSSL Inc. All rights reserved. + * + * This file is part of wolfSSL. + * + * Contact licensing@wolfssl.com with any questions or comments. + * + * http://www.wolfssl.com + */ + + + +#ifndef WOLF_CRYPT_DES3_H +#define WOLF_CRYPT_DES3_H + +#include + +#ifndef NO_DES3 + +#ifdef HAVE_FIPS +/* included for fips @wc_fips */ +#include +#endif + +#ifdef __cplusplus + extern "C" { +#endif + +#ifndef HAVE_FIPS /* to avoid redefinition of macros */ + +#ifdef WOLFSSL_ASYNC_CRYPT + #include +#endif + +enum { + DES_ENC_TYPE = 2, /* cipher unique type */ + DES3_ENC_TYPE = 3, /* cipher unique type */ + DES_BLOCK_SIZE = 8, + DES_KS_SIZE = 32, + + DES_ENCRYPTION = 0, + DES_DECRYPTION = 1 +}; + +#define DES_IVLEN 8 +#define DES_KEYLEN 8 +#define DES3_IVLEN 8 +#define DES3_KEYLEN 24 + + +#if defined(STM32_CRYPTO) +enum { + DES_CBC = 0, + DES_ECB = 1 +}; +#endif + + +/* DES encryption and decryption */ +typedef struct Des { + word32 reg[DES_BLOCK_SIZE / sizeof(word32)]; /* for CBC mode */ + word32 tmp[DES_BLOCK_SIZE / sizeof(word32)]; /* same */ + word32 key[DES_KS_SIZE]; +} Des; + + +/* DES3 encryption and decryption */ +typedef struct Des3 { + word32 key[3][DES_KS_SIZE]; + word32 reg[DES_BLOCK_SIZE / sizeof(word32)]; /* for CBC mode */ + word32 tmp[DES_BLOCK_SIZE / sizeof(word32)]; /* same */ +#ifdef WOLFSSL_ASYNC_CRYPT + const byte* key_raw; + const byte* iv_raw; + WC_ASYNC_DEV asyncDev; +#endif + void* heap; +} Des3; +#endif /* HAVE_FIPS */ + + +WOLFSSL_API int wc_Des_SetKey(Des* des, const byte* key, + const byte* iv, int dir); +WOLFSSL_API void wc_Des_SetIV(Des* des, const byte* iv); +WOLFSSL_API int wc_Des_CbcEncrypt(Des* des, byte* out, + const byte* in, word32 sz); +WOLFSSL_API int wc_Des_CbcDecrypt(Des* des, byte* out, + const byte* in, word32 sz); +WOLFSSL_API int wc_Des_EcbEncrypt(Des* des, byte* out, + const byte* in, word32 sz); +WOLFSSL_API int wc_Des3_EcbEncrypt(Des3* des, byte* out, + const byte* in, word32 sz); + +/* ECB decrypt same process as encrypt but with decrypt key */ +#define wc_Des_EcbDecrypt wc_Des_EcbEncrypt +#define wc_Des3_EcbDecrypt wc_Des3_EcbEncrypt + +WOLFSSL_API int wc_Des3_SetKey(Des3* des, const byte* key, + const byte* iv,int dir); +WOLFSSL_API int wc_Des3_SetIV(Des3* des, const byte* iv); +WOLFSSL_API int wc_Des3_CbcEncrypt(Des3* des, byte* out, + const byte* in,word32 sz); +WOLFSSL_API int wc_Des3_CbcDecrypt(Des3* des, byte* out, + const byte* in,word32 sz); + +/* These are only required when using either: + static memory (WOLFSSL_STATIC_MEMORY) or asynchronous (WOLFSSL_ASYNC_CRYPT) */ +WOLFSSL_API int wc_Des3Init(Des3*, void*, int); +WOLFSSL_API void wc_Des3Free(Des3*); + +#ifdef __cplusplus + } /* extern "C" */ +#endif + +#endif /* NO_DES3 */ +#endif /* WOLF_CRYPT_DES3_H */ + diff --git a/include/wolfssl/wolfcrypt/ecc.h b/include/wolfssl/wolfcrypt/ecc.h new file mode 100644 index 00000000..1b26ca60 --- /dev/null +++ b/include/wolfssl/wolfcrypt/ecc.h @@ -0,0 +1,603 @@ +/* ecc.h + * + * Copyright (C) 2006-2017 wolfSSL Inc. All rights reserved. + * + * This file is part of wolfSSL. + * + * Contact licensing@wolfssl.com with any questions or comments. + * + * http://www.wolfssl.com + */ + + + +#ifndef WOLF_CRYPT_ECC_H +#define WOLF_CRYPT_ECC_H + +#include + +#ifdef HAVE_ECC + +#if defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION >= 2) + #include +#endif /* HAVE_FIPS_VERSION >= 2 */ + +#include +#include + +#ifdef HAVE_X963_KDF + #include +#endif + +#ifdef WOLFSSL_ASYNC_CRYPT + #include + #ifdef WOLFSSL_CERT_GEN + #include + #endif +#endif + +#ifdef WOLFSSL_ATECC508A + #include +#endif /* WOLFSSL_ATECC508A */ + + +#ifdef __cplusplus + extern "C" { +#endif + + +/* Enable curve B parameter if needed */ +#if defined(HAVE_COMP_KEY) || defined(ECC_CACHE_CURVE) + #ifndef USE_ECC_B_PARAM /* Allow someone to force enable */ + #define USE_ECC_B_PARAM + #endif +#endif + + +/* Use this as the key->idx if a custom ecc_set is used for key->dp */ +#define ECC_CUSTOM_IDX (-1) + + +/* Determine max ECC bits based on enabled curves */ +#if defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES) + #define MAX_ECC_BITS 521 +#elif defined(HAVE_ECC512) + #define MAX_ECC_BITS 512 +#elif defined(HAVE_ECC384) + #define MAX_ECC_BITS 384 +#elif defined(HAVE_ECC320) + #define MAX_ECC_BITS 320 +#elif defined(HAVE_ECC239) + #define MAX_ECC_BITS 239 +#elif defined(HAVE_ECC224) + #define MAX_ECC_BITS 224 +#elif !defined(NO_ECC256) + #define MAX_ECC_BITS 256 +#elif defined(HAVE_ECC192) + #define MAX_ECC_BITS 192 +#elif defined(HAVE_ECC160) + #define MAX_ECC_BITS 160 +#elif defined(HAVE_ECC128) + #define MAX_ECC_BITS 128 +#elif defined(HAVE_ECC112) + #define MAX_ECC_BITS 112 +#endif + +/* calculate max ECC bytes */ +#if ((MAX_ECC_BITS * 2) % 8) == 0 + #define MAX_ECC_BYTES (MAX_ECC_BITS / 8) +#else + /* add byte if not aligned */ + #define MAX_ECC_BYTES ((MAX_ECC_BITS / 8) + 1) +#endif + + +enum { + ECC_PUBLICKEY = 1, + ECC_PRIVATEKEY = 2, + ECC_PRIVATEKEY_ONLY = 3, + ECC_MAXNAME = 16, /* MAX CURVE NAME LENGTH */ + SIG_HEADER_SZ = 6, /* ECC signature header size */ + ECC_BUFSIZE = 256, /* for exported keys temp buffer */ + ECC_MINSIZE = 20, /* MIN Private Key size */ + ECC_MAXSIZE = 66, /* MAX Private Key size */ + ECC_MAXSIZE_GEN = 74, /* MAX Buffer size required when generating ECC keys*/ + ECC_MAX_PAD_SZ = 4, /* ECC maximum padding size */ + ECC_MAX_OID_LEN = 16, + ECC_MAX_SIG_SIZE= ((MAX_ECC_BYTES * 2) + ECC_MAX_PAD_SZ + SIG_HEADER_SZ), + + /* max crypto hardware size */ +#ifdef WOLFSSL_ATECC508A + ECC_MAX_CRYPTO_HW_SIZE = ATECC_KEY_SIZE, /* from port/atmel/atmel.h */ +#elif defined(PLUTON_CRYPTO_ECC) + ECC_MAX_CRYPTO_HW_SIZE = 32, +#endif +}; + +/* Curve Types */ +typedef enum ecc_curve_id { + ECC_CURVE_INVALID = -1, + ECC_CURVE_DEF = 0, /* NIST or SECP */ + + /* NIST Prime Curves */ + ECC_SECP192R1, + ECC_PRIME192V2, + ECC_PRIME192V3, + ECC_PRIME239V1, + ECC_PRIME239V2, + ECC_PRIME239V3, + ECC_SECP256R1, + + /* SECP Curves */ + ECC_SECP112R1, + ECC_SECP112R2, + ECC_SECP128R1, + ECC_SECP128R2, + ECC_SECP160R1, + ECC_SECP160R2, + ECC_SECP224R1, + ECC_SECP384R1, + ECC_SECP521R1, + + /* Koblitz */ + ECC_SECP160K1, + ECC_SECP192K1, + ECC_SECP224K1, + ECC_SECP256K1, + + /* Brainpool Curves */ + ECC_BRAINPOOLP160R1, + ECC_BRAINPOOLP192R1, + ECC_BRAINPOOLP224R1, + ECC_BRAINPOOLP256R1, + ECC_BRAINPOOLP320R1, + ECC_BRAINPOOLP384R1, + ECC_BRAINPOOLP512R1, + + /* Twisted Edwards Curves */ +#ifdef HAVE_CURVE25519 + ECC_X25519, +#endif +#ifdef HAVE_X448 + ECC_X448, +#endif + +#ifdef WOLFSSL_CUSTOM_CURVES + ECC_CURVE_CUSTOM, +#endif +} ecc_curve_id; + +#ifdef HAVE_OID_ENCODING +typedef word16 ecc_oid_t; +#else +typedef byte ecc_oid_t; + /* OID encoded with ASN scheme: + first element = (oid[0] * 40) + oid[1] + if any element > 127 then MSB 0x80 indicates additional byte */ +#endif + +/* ECC set type defined a GF(p) curve */ +typedef struct ecc_set_type { + int size; /* The size of the curve in octets */ + int id; /* id of this curve */ + const char* name; /* name of this curve */ + const char* prime; /* prime that defines the field, curve is in (hex) */ + const char* Af; /* fields A param (hex) */ + const char* Bf; /* fields B param (hex) */ + const char* order; /* order of the curve (hex) */ + const char* Gx; /* x coordinate of the base point on curve (hex) */ + const char* Gy; /* y coordinate of the base point on curve (hex) */ + const ecc_oid_t* oid; + word32 oidSz; + word32 oidSum; /* sum of encoded OID bytes */ + int cofactor; +} ecc_set_type; + + +#ifdef ALT_ECC_SIZE + +/* Note on ALT_ECC_SIZE: + * The fast math code uses an array of a fixed size to store the big integers. + * By default, the array is big enough for RSA keys. There is a size, + * FP_MAX_BITS which can be used to make the array smaller when one wants ECC + * but not RSA. Some people want fast math sized for both RSA and ECC, where + * ECC won't use as much as RSA. The flag ALT_ECC_SIZE switches in an alternate + * ecc_point structure that uses an alternate fp_int that has a shorter array + * of fp_digits. + * + * Now, without ALT_ECC_SIZE, the ecc_point has three single item arrays of + * mp_ints for the components of the point. With ALT_ECC_SIZE, the components + * of the point are pointers that are set to each of a three item array of + * alt_fp_ints. While an mp_int will have 4096 bits of digit inside the + * structure, the alt_fp_int will only have 528 bits. A size value was added + * in the ALT case, as well, and is set by mp_init() and alt_fp_init(). The + * functions fp_zero() and fp_copy() use the size parameter. An int needs to + * be initialized before using it instead of just fp_zeroing it, the init will + * call zero. FP_MAX_BITS_ECC defaults to 528, but can be set to change the + * number of bits used in the alternate FP_INT. + * + * Do not enable ALT_ECC_SIZE and disable fast math in the configuration. + */ + +#ifndef USE_FAST_MATH + #error USE_FAST_MATH must be defined to use ALT_ECC_SIZE +#endif + +/* determine max bits required for ECC math */ +#ifndef FP_MAX_BITS_ECC + /* check alignment */ + #if ((MAX_ECC_BITS * 2) % DIGIT_BIT) == 0 + /* max bits is double */ + #define FP_MAX_BITS_ECC (MAX_ECC_BITS * 2) + #else + /* max bits is doubled, plus one digit of fudge */ + #define FP_MAX_BITS_ECC ((MAX_ECC_BITS * 2) + DIGIT_BIT) + #endif +#else + /* verify alignment */ + #if FP_MAX_BITS_ECC % CHAR_BIT + #error FP_MAX_BITS_ECC must be a multiple of CHAR_BIT + #endif +#endif + +/* determine buffer size */ +#define FP_SIZE_ECC (FP_MAX_BITS_ECC/DIGIT_BIT) + + +/* This needs to match the size of the fp_int struct, except the + * fp_digit array will be shorter. */ +typedef struct alt_fp_int { + int used, sign, size; + fp_digit dp[FP_SIZE_ECC]; +} alt_fp_int; +#endif /* ALT_ECC_SIZE */ + + +/* A point on an ECC curve, stored in Jacbobian format such that (x,y,z) => + (x/z^2, y/z^3, 1) when interpreted as affine */ +typedef struct { +#ifndef ALT_ECC_SIZE + mp_int x[1]; /* The x coordinate */ + mp_int y[1]; /* The y coordinate */ + mp_int z[1]; /* The z coordinate */ +#else + mp_int* x; /* The x coordinate */ + mp_int* y; /* The y coordinate */ + mp_int* z; /* The z coordinate */ + alt_fp_int xyz[3]; +#endif +} ecc_point; + +/* ECC Flags */ +enum { + WC_ECC_FLAG_NONE = 0x00, +#ifdef HAVE_ECC_CDH + WC_ECC_FLAG_COFACTOR = 0x01, +#endif +}; + +/* An ECC Key */ +struct ecc_key { + int type; /* Public or Private */ + int idx; /* Index into the ecc_sets[] for the parameters of + this curve if -1, this key is using user supplied + curve in dp */ + int state; + word32 flags; + const ecc_set_type* dp; /* domain parameters, either points to NIST + curves (idx >= 0) or user supplied */ +#ifdef WOLFSSL_CUSTOM_CURVES + int deallocSet; +#endif + void* heap; /* heap hint */ + ecc_point pubkey; /* public key */ + mp_int k; /* private key */ +#ifdef WOLFSSL_ATECC508A + int slot; /* Key Slot Number (-1 unknown) */ + byte pubkey_raw[PUB_KEY_SIZE]; +#endif +#ifdef PLUTON_CRYPTO_ECC + int devId; +#endif +#ifdef WOLFSSL_ASYNC_CRYPT + mp_int* r; /* sign/verify temps */ + mp_int* s; + WC_ASYNC_DEV asyncDev; + #ifdef WOLFSSL_CERT_GEN + CertSignCtx certSignCtx; /* context info for cert sign (MakeSignature) */ + #endif +#endif /* WOLFSSL_ASYNC_CRYPT */ +}; + +#ifndef WC_ECCKEY_TYPE_DEFINED + typedef struct ecc_key ecc_key; + #define WC_ECCKEY_TYPE_DEFINED +#endif + + +/* ECC predefined curve sets */ +extern const ecc_set_type ecc_sets[]; + +WOLFSSL_API +const char* wc_ecc_get_name(int curve_id); + +#ifndef WOLFSSL_ATECC508A + +#ifdef WOLFSSL_PUBLIC_ECC_ADD_DBL + #define ECC_API WOLFSSL_API +#else + #define ECC_API WOLFSSL_LOCAL +#endif + +ECC_API int ecc_mul2add(ecc_point* A, mp_int* kA, + ecc_point* B, mp_int* kB, + ecc_point* C, mp_int* a, mp_int* modulus, void* heap); + +ECC_API int ecc_map(ecc_point*, mp_int*, mp_digit); +ECC_API int ecc_projective_add_point(ecc_point* P, ecc_point* Q, ecc_point* R, + mp_int* a, mp_int* modulus, mp_digit mp); +ECC_API int ecc_projective_dbl_point(ecc_point* P, ecc_point* R, mp_int* a, + mp_int* modulus, mp_digit mp); + +#endif + +WOLFSSL_API +int wc_ecc_make_key(WC_RNG* rng, int keysize, ecc_key* key); +WOLFSSL_API +int wc_ecc_make_key_ex(WC_RNG* rng, int keysize, ecc_key* key, + int curve_id); +WOLFSSL_API +int wc_ecc_make_pub(ecc_key* key, ecc_point* pubOut); +WOLFSSL_API +int wc_ecc_check_key(ecc_key* key); +WOLFSSL_API +int wc_ecc_is_point(ecc_point* ecp, mp_int* a, mp_int* b, mp_int* prime); + +#ifdef HAVE_ECC_DHE +WOLFSSL_API +int wc_ecc_shared_secret(ecc_key* private_key, ecc_key* public_key, byte* out, + word32* outlen); +WOLFSSL_LOCAL +int wc_ecc_shared_secret_gen(ecc_key* private_key, ecc_point* point, + byte* out, word32 *outlen); +WOLFSSL_API +int wc_ecc_shared_secret_ex(ecc_key* private_key, ecc_point* point, + byte* out, word32 *outlen); +#define wc_ecc_shared_secret_ssh wc_ecc_shared_secret_ex /* For backwards compat */ +#endif /* HAVE_ECC_DHE */ + +#ifdef HAVE_ECC_SIGN +WOLFSSL_API +int wc_ecc_sign_hash(const byte* in, word32 inlen, byte* out, word32 *outlen, + WC_RNG* rng, ecc_key* key); +WOLFSSL_API +int wc_ecc_sign_hash_ex(const byte* in, word32 inlen, WC_RNG* rng, + ecc_key* key, mp_int *r, mp_int *s); +#endif /* HAVE_ECC_SIGN */ + +#ifdef HAVE_ECC_VERIFY +WOLFSSL_API +int wc_ecc_verify_hash(const byte* sig, word32 siglen, const byte* hash, + word32 hashlen, int* stat, ecc_key* key); +WOLFSSL_API +int wc_ecc_verify_hash_ex(mp_int *r, mp_int *s, const byte* hash, + word32 hashlen, int* stat, ecc_key* key); +#endif /* HAVE_ECC_VERIFY */ + +WOLFSSL_API +int wc_ecc_init(ecc_key* key); +WOLFSSL_API +int wc_ecc_init_ex(ecc_key* key, void* heap, int devId); +#ifdef WOLFSSL_CUSTOM_CURVES +WOLFSSL_LOCAL +void wc_ecc_free_curve(const ecc_set_type* curve, void* heap); +#endif +WOLFSSL_API +int wc_ecc_free(ecc_key* key); +WOLFSSL_API +int wc_ecc_set_flags(ecc_key* key, word32 flags); +WOLFSSL_API +void wc_ecc_fp_free(void); + +WOLFSSL_API +int wc_ecc_set_curve(ecc_key* key, int keysize, int curve_id); + +WOLFSSL_API +int wc_ecc_is_valid_idx(int n); +WOLFSSL_API +int wc_ecc_get_curve_idx(int curve_id); +WOLFSSL_API +int wc_ecc_get_curve_id(int curve_idx); +#define wc_ecc_get_curve_name_from_id wc_ecc_get_name +WOLFSSL_API +int wc_ecc_get_curve_size_from_id(int curve_id); + +WOLFSSL_API +int wc_ecc_get_curve_idx_from_name(const char* curveName); +WOLFSSL_API +int wc_ecc_get_curve_size_from_name(const char* curveName); +WOLFSSL_API +int wc_ecc_get_curve_id_from_name(const char* curveName); +WOLFSSL_API +int wc_ecc_get_curve_id_from_params(int fieldSize, + const byte* prime, word32 primeSz, const byte* Af, word32 AfSz, + const byte* Bf, word32 BfSz, const byte* order, word32 orderSz, + const byte* Gx, word32 GxSz, const byte* Gy, word32 GySz, int cofactor); + + +WOLFSSL_API +ecc_point* wc_ecc_new_point(void); +WOLFSSL_API +ecc_point* wc_ecc_new_point_h(void* h); +WOLFSSL_API +void wc_ecc_del_point(ecc_point* p); +WOLFSSL_API +void wc_ecc_del_point_h(ecc_point* p, void* h); +WOLFSSL_API +int wc_ecc_copy_point(ecc_point* p, ecc_point *r); +WOLFSSL_API +int wc_ecc_cmp_point(ecc_point* a, ecc_point *b); +WOLFSSL_API +int wc_ecc_point_is_at_infinity(ecc_point *p); + +#ifndef WOLFSSL_ATECC508A +WOLFSSL_API +int wc_ecc_mulmod(mp_int* k, ecc_point *G, ecc_point *R, + mp_int* a, mp_int* modulus, int map); +WOLFSSL_LOCAL +int wc_ecc_mulmod_ex(mp_int* k, ecc_point *G, ecc_point *R, + mp_int* a, mp_int* modulus, int map, void* heap); +#endif /* !WOLFSSL_ATECC508A */ + + +#ifdef HAVE_ECC_KEY_EXPORT +/* ASN key helpers */ +WOLFSSL_API +int wc_ecc_export_x963(ecc_key*, byte* out, word32* outLen); +WOLFSSL_API +int wc_ecc_export_x963_ex(ecc_key*, byte* out, word32* outLen, int compressed); + /* extended functionality with compressed option */ +#endif /* HAVE_ECC_KEY_EXPORT */ + +#ifdef HAVE_ECC_KEY_IMPORT +WOLFSSL_API +int wc_ecc_import_x963(const byte* in, word32 inLen, ecc_key* key); +WOLFSSL_API +int wc_ecc_import_x963_ex(const byte* in, word32 inLen, ecc_key* key, + int curve_id); +WOLFSSL_API +int wc_ecc_import_private_key(const byte* priv, word32 privSz, const byte* pub, + word32 pubSz, ecc_key* key); +WOLFSSL_API +int wc_ecc_import_private_key_ex(const byte* priv, word32 privSz, + const byte* pub, word32 pubSz, ecc_key* key, int curve_id); +WOLFSSL_API +int wc_ecc_rs_to_sig(const char* r, const char* s, byte* out, word32* outlen); +WOLFSSL_API +int wc_ecc_sig_to_rs(const byte* sig, word32 sigLen, byte* r, word32* rLen, + byte* s, word32* sLen); +WOLFSSL_API +int wc_ecc_import_raw(ecc_key* key, const char* qx, const char* qy, + const char* d, const char* curveName); +WOLFSSL_API +int wc_ecc_import_raw_ex(ecc_key* key, const char* qx, const char* qy, + const char* d, int curve_id); +#endif /* HAVE_ECC_KEY_IMPORT */ + +#ifdef HAVE_ECC_KEY_EXPORT +WOLFSSL_API +int wc_ecc_export_private_only(ecc_key* key, byte* out, word32* outLen); +WOLFSSL_API +int wc_ecc_export_public_raw(ecc_key* key, byte* qx, word32* qxLen, + byte* qy, word32* qyLen); +WOLFSSL_API +int wc_ecc_export_private_raw(ecc_key* key, byte* qx, word32* qxLen, + byte* qy, word32* qyLen, byte* d, word32* dLen); +#endif /* HAVE_ECC_KEY_EXPORT */ + +#ifdef HAVE_ECC_KEY_EXPORT + +WOLFSSL_API +int wc_ecc_export_point_der(const int curve_idx, ecc_point* point, + byte* out, word32* outLen); +#endif /* HAVE_ECC_KEY_EXPORT */ + + +#ifdef HAVE_ECC_KEY_IMPORT +WOLFSSL_API +int wc_ecc_import_point_der(byte* in, word32 inLen, const int curve_idx, + ecc_point* point); +#endif /* HAVE_ECC_KEY_IMPORT */ + +/* size helper */ +WOLFSSL_API +int wc_ecc_size(ecc_key* key); +WOLFSSL_API +int wc_ecc_sig_size(ecc_key* key); + +WOLFSSL_API +int wc_ecc_get_oid(word32 oidSum, const byte** oid, word32* oidSz); + +#ifdef WOLFSSL_CUSTOM_CURVES + WOLFSSL_API + int wc_ecc_set_custom_curve(ecc_key* key, const ecc_set_type* dp); +#endif + +#ifdef HAVE_ECC_ENCRYPT +/* ecc encrypt */ + +enum ecEncAlgo { + ecAES_128_CBC = 1, /* default */ + ecAES_256_CBC = 2 +}; + +enum ecKdfAlgo { + ecHKDF_SHA256 = 1, /* default */ + ecHKDF_SHA1 = 2 +}; + +enum ecMacAlgo { + ecHMAC_SHA256 = 1, /* default */ + ecHMAC_SHA1 = 2 +}; + +enum { + KEY_SIZE_128 = 16, + KEY_SIZE_256 = 32, + IV_SIZE_64 = 8, + IV_SIZE_128 = 16, + EXCHANGE_SALT_SZ = 16, + EXCHANGE_INFO_SZ = 23 +}; + +enum ecFlags { + REQ_RESP_CLIENT = 1, + REQ_RESP_SERVER = 2 +}; + + +typedef struct ecEncCtx ecEncCtx; + +WOLFSSL_API +ecEncCtx* wc_ecc_ctx_new(int flags, WC_RNG* rng); +WOLFSSL_API +ecEncCtx* wc_ecc_ctx_new_ex(int flags, WC_RNG* rng, void* heap); +WOLFSSL_API +void wc_ecc_ctx_free(ecEncCtx*); +WOLFSSL_API +int wc_ecc_ctx_reset(ecEncCtx*, WC_RNG*); /* reset for use again w/o alloc/free */ + +WOLFSSL_API +const byte* wc_ecc_ctx_get_own_salt(ecEncCtx*); +WOLFSSL_API +int wc_ecc_ctx_set_peer_salt(ecEncCtx*, const byte* salt); +WOLFSSL_API +int wc_ecc_ctx_set_info(ecEncCtx*, const byte* info, int sz); + +WOLFSSL_API +int wc_ecc_encrypt(ecc_key* privKey, ecc_key* pubKey, const byte* msg, + word32 msgSz, byte* out, word32* outSz, ecEncCtx* ctx); +WOLFSSL_API +int wc_ecc_decrypt(ecc_key* privKey, ecc_key* pubKey, const byte* msg, + word32 msgSz, byte* out, word32* outSz, ecEncCtx* ctx); + +#endif /* HAVE_ECC_ENCRYPT */ + +#ifdef HAVE_X963_KDF +WOLFSSL_API int wc_X963_KDF(enum wc_HashType type, const byte* secret, + word32 secretSz, const byte* sinfo, word32 sinfoSz, + byte* out, word32 outSz); +#endif + +#ifdef ECC_CACHE_CURVE +WOLFSSL_API int wc_ecc_curve_cache_init(void); +WOLFSSL_API void wc_ecc_curve_cache_free(void); +#endif + + +#ifdef __cplusplus + } /* extern "C" */ +#endif + +#endif /* HAVE_ECC */ +#endif /* WOLF_CRYPT_ECC_H */ diff --git a/include/wolfssl/wolfcrypt/hash.h b/include/wolfssl/wolfcrypt/hash.h new file mode 100644 index 00000000..6c561fb5 --- /dev/null +++ b/include/wolfssl/wolfcrypt/hash.h @@ -0,0 +1,153 @@ +/* hash.h + * + * Copyright (C) 2006-2017 wolfSSL Inc. All rights reserved. + * + * This file is part of wolfSSL. + * + * Contact licensing@wolfssl.com with any questions or comments. + * + * http://www.wolfssl.com + */ + + + +#ifndef WOLF_CRYPT_HASH_H +#define WOLF_CRYPT_HASH_H + +#include + +#ifndef NO_MD5 + #include +#endif +#ifndef NO_SHA + #include +#endif +#if defined(WOLFSSL_SHA224) || !defined(NO_SHA256) + #include +#endif +#if defined(WOLFSSL_SHA384) || defined(WOLFSSL_SHA512) + #include +#endif +#ifdef HAVE_BLAKE2 + #include +#endif +#ifdef WOLFSSL_SHA3 + #include +#endif + +#ifdef __cplusplus + extern "C" { +#endif + +#if !defined(HAVE_FIPS) && !defined(NO_OLD_WC_NAMES) + #define MAX_DIGEST_SIZE WC_MAX_DIGEST_SIZE +#endif + + +/* Hash types */ +enum wc_HashType { + WC_HASH_TYPE_NONE = 0, + WC_HASH_TYPE_MD2 = 1, + WC_HASH_TYPE_MD4 = 2, + WC_HASH_TYPE_MD5 = 3, + WC_HASH_TYPE_SHA = 4, /* SHA-1 (not old SHA-0) */ + WC_HASH_TYPE_SHA224 = 9, + WC_HASH_TYPE_SHA256 = 5, + WC_HASH_TYPE_SHA384 = 6, + WC_HASH_TYPE_SHA512 = 7, + WC_HASH_TYPE_MD5_SHA = 8, +}; + +typedef union { + #ifndef NO_MD5 + wc_Md5 md5; + #endif + #ifndef NO_SHA + wc_Sha sha; + #endif + #ifdef WOLFSSL_SHA224 + wc_Sha224 sha224; + #endif + #ifndef NO_SHA256 + wc_Sha256 sha256; + #endif + #ifdef WOLFSSL_SHA384 + wc_Sha384 sha384; + #endif + #ifdef WOLFSSL_SHA512 + wc_Sha512 sha512; + #endif +} wc_HashAlg; + +/* Find largest possible digest size + Note if this gets up to the size of 80 or over check smallstack build */ +#if defined(WOLFSSL_SHA3) + #define WC_MAX_DIGEST_SIZE WC_SHA3_512_DIGEST_SIZE +#elif defined(WOLFSSL_SHA512) + #define WC_MAX_DIGEST_SIZE WC_SHA512_DIGEST_SIZE +#elif defined(HAVE_BLAKE2) + #define WC_MAX_DIGEST_SIZE BLAKE2B_OUTBYTES +#elif defined(WOLFSSL_SHA384) + #define WC_MAX_DIGEST_SIZE WC_SHA384_DIGEST_SIZE +#elif !defined(NO_SHA256) + #define WC_MAX_DIGEST_SIZE WC_SHA256_DIGEST_SIZE +#elif defined(WOLFSSL_SHA224) + #define WC_MAX_DIGEST_SIZE WC_SHA224_DIGEST_SIZE +#elif !defined(NO_SHA) + #define WC_MAX_DIGEST_SIZE WC_SHA_DIGEST_SIZE +#elif !defined(NO_MD5) + #define WC_MAX_DIGEST_SIZE WC_MD5_DIGEST_SIZE +#else + #define WC_MAX_DIGEST_SIZE 64 /* default to max size of 64 */ +#endif + +#if !defined(NO_ASN) || !defined(NO_DH) || defined(HAVE_ECC) +WOLFSSL_API int wc_HashGetOID(enum wc_HashType hash_type); +#endif + +WOLFSSL_API int wc_HashGetDigestSize(enum wc_HashType hash_type); +WOLFSSL_API int wc_Hash(enum wc_HashType hash_type, + const byte* data, word32 data_len, + byte* hash, word32 hash_len); + +/* generic hash operation wrappers */ +WOLFSSL_API int wc_HashInit(wc_HashAlg* hash, enum wc_HashType type); +WOLFSSL_API int wc_HashUpdate(wc_HashAlg* hash, enum wc_HashType type, + const byte* data, word32 dataSz); +WOLFSSL_API int wc_HashFinal(wc_HashAlg* hash, enum wc_HashType type, + byte* out); + + +#ifndef NO_MD5 +#include +WOLFSSL_API int wc_Md5Hash(const byte* data, word32 len, byte* hash); +#endif + +#ifndef NO_SHA +#include +WOLFSSL_API int wc_ShaHash(const byte*, word32, byte*); +#endif + +#ifndef NO_SHA256 +#include +WOLFSSL_API int wc_Sha256Hash(const byte*, word32, byte*); + + #if defined(WOLFSSL_SHA224) + WOLFSSL_API int wc_Sha224Hash(const byte*, word32, byte*); + #endif /* defined(WOLFSSL_SHA224) */ +#endif + +#ifdef WOLFSSL_SHA512 +#include +WOLFSSL_API int wc_Sha512Hash(const byte*, word32, byte*); + + #if defined(WOLFSSL_SHA384) + WOLFSSL_API int wc_Sha384Hash(const byte*, word32, byte*); + #endif /* defined(WOLFSSL_SHA384) */ +#endif /* WOLFSSL_SHA512 */ + +#ifdef __cplusplus + } /* extern "C" */ +#endif + +#endif /* WOLF_CRYPT_HASH_H */ diff --git a/include/wolfssl/wolfcrypt/hmac.h b/include/wolfssl/wolfcrypt/hmac.h new file mode 100644 index 00000000..d3f8b236 --- /dev/null +++ b/include/wolfssl/wolfcrypt/hmac.h @@ -0,0 +1,193 @@ +/* hmac.h + * + * Copyright (C) 2006-2017 wolfSSL Inc. All rights reserved. + * + * This file is part of wolfSSL. + * + * Contact licensing@wolfssl.com with any questions or comments. + * + * http://www.wolfssl.com + */ + + + + +#ifndef NO_HMAC + +#ifndef WOLF_CRYPT_HMAC_H +#define WOLF_CRYPT_HMAC_H + +#include + +#ifdef HAVE_FIPS +/* for fips */ + #include + #define WC_HMAC_BLOCK_SIZE HMAC_BLOCK_SIZE +#endif + + +#ifdef __cplusplus + extern "C" { +#endif +#ifndef HAVE_FIPS + +#ifdef WOLFSSL_ASYNC_CRYPT + #include +#endif + +#ifndef NO_OLD_WC_NAMES + #define HMAC_BLOCK_SIZE WC_HMAC_BLOCK_SIZE +#endif + +enum { + HMAC_FIPS_MIN_KEY = 14, /* 112 bit key length minimum */ + + IPAD = 0x36, + OPAD = 0x5C, + +/* If any hash is not enabled, add the ID here. */ +#ifdef NO_MD5 + WC_MD5 = 0, +#endif +#ifdef NO_SHA + WC_SHA = 1, +#endif +#ifdef NO_SHA256 + WC_SHA256 = 2, +#endif +#ifndef WOLFSSL_SHA512 + WC_SHA512 = 4, +#endif +#ifndef WOLFSSL_SHA384 + WC_SHA384 = 5, +#endif +#ifndef HAVE_BLAKE2 + BLAKE2B_ID = 7, +#endif +#ifndef WOLFSSL_SHA224 + WC_SHA224 = 8, +#endif +#ifndef WOLFSSL_SHA3 + WC_SHA3_224 = 10, + WC_SHA3_256 = 11, + WC_SHA3_384 = 12, + WC_SHA3_512 = 13, +#else + /* These values are used for HMAC, not SHA-3 directly. + * They come from from FIPS PUB 202. */ + WC_SHA3_224_BLOCK_SIZE = 144, + WC_SHA3_256_BLOCK_SIZE = 136, + WC_SHA3_384_BLOCK_SIZE = 104, + WC_SHA3_512_BLOCK_SIZE = 72, +#endif + +/* Select the largest available hash for the buffer size. */ +#if defined(WOLFSSL_SHA3) + WC_HMAC_BLOCK_SIZE = WC_SHA3_224_BLOCK_SIZE + /* SHA3-224 has the largest block size */ +#elif defined(WOLFSSL_SHA512) + WC_HMAC_BLOCK_SIZE = WC_SHA512_BLOCK_SIZE, +#elif defined(HAVE_BLAKE2) + WC_HMAC_BLOCK_SIZE = BLAKE2B_BLOCKBYTES, +#elif defined(WOLFSSL_SHA384) + WC_HMAC_BLOCK_SIZE = WC_SHA384_BLOCK_SIZE +#elif !defined(NO_SHA256) + WC_HMAC_BLOCK_SIZE = WC_SHA256_BLOCK_SIZE +#elif defined(WOLFSSL_SHA224) + WC_HMAC_BLOCK_SIZE = WC_SHA224_BLOCK_SIZE +#elif !defined(NO_SHA) + WC_HMAC_BLOCK_SIZE = WC_SHA_BLOCK_SIZE, +#elif !defined(NO_MD5) + WC_HMAC_BLOCK_SIZE = WC_MD5_BLOCK_SIZE, +#else + #error "You have to have some kind of hash if you want to use HMAC." +#endif +}; + + +/* hash union */ +typedef union { +#ifndef NO_MD5 + wc_Md5 md5; +#endif +#ifndef NO_SHA + wc_Sha sha; +#endif +#ifdef WOLFSSL_SHA224 + wc_Sha224 sha224; +#endif +#ifndef NO_SHA256 + wc_Sha256 sha256; +#endif +#ifdef WOLFSSL_SHA512 +#ifdef WOLFSSL_SHA384 + wc_Sha384 sha384; +#endif + wc_Sha512 sha512; +#endif +#ifdef HAVE_BLAKE2 + Blake2b blake2b; +#endif +#ifdef WOLFSSL_SHA3 + Sha3 sha3; +#endif +} Hash; + +/* Hmac digest */ +typedef struct Hmac { + Hash hash; + word32 ipad[WC_HMAC_BLOCK_SIZE / sizeof(word32)]; /* same block size all*/ + word32 opad[WC_HMAC_BLOCK_SIZE / sizeof(word32)]; + word32 innerHash[WC_MAX_DIGEST_SIZE / sizeof(word32)]; + void* heap; /* heap hint */ + byte macType; /* md5 sha or sha256 */ + byte innerHashKeyed; /* keyed flag */ + +#ifdef WOLFSSL_ASYNC_CRYPT + WC_ASYNC_DEV asyncDev; + word16 keyLen; /* hmac key length (key in ipad) */ + #ifdef HAVE_CAVIUM + byte* data; /* buffered input data for one call */ + word16 dataLen; + #endif /* HAVE_CAVIUM */ +#endif /* WOLFSSL_ASYNC_CRYPT */ +} Hmac; + +#endif /* HAVE_FIPS */ + +/* does init */ +WOLFSSL_API int wc_HmacSetKey(Hmac*, int type, const byte* key, word32 keySz); +WOLFSSL_API int wc_HmacUpdate(Hmac*, const byte*, word32); +WOLFSSL_API int wc_HmacFinal(Hmac*, byte*); +WOLFSSL_API int wc_HmacSizeByType(int type); + +WOLFSSL_API int wc_HmacInit(Hmac* hmac, void* heap, int devId); +WOLFSSL_API void wc_HmacFree(Hmac*); + +WOLFSSL_API int wolfSSL_GetHmacMaxSize(void); + +WOLFSSL_LOCAL int _InitHmac(Hmac* hmac, int type, void* heap); + +#ifdef HAVE_HKDF + +WOLFSSL_API int wc_HKDF_Extract(int type, const byte* salt, word32 saltSz, + const byte* inKey, word32 inKeySz, byte* out); +WOLFSSL_API int wc_HKDF_Expand(int type, const byte* inKey, word32 inKeySz, + const byte* info, word32 infoSz, + byte* out, word32 outSz); + +WOLFSSL_API int wc_HKDF(int type, const byte* inKey, word32 inKeySz, + const byte* salt, word32 saltSz, + const byte* info, word32 infoSz, + byte* out, word32 outSz); + +#endif /* HAVE_HKDF */ + +#ifdef __cplusplus + } /* extern "C" */ +#endif + +#endif /* WOLF_CRYPT_HMAC_H */ + +#endif /* NO_HMAC */ + diff --git a/include/wolfssl/wolfcrypt/integer.h b/include/wolfssl/wolfcrypt/integer.h new file mode 100644 index 00000000..2ab1db1f --- /dev/null +++ b/include/wolfssl/wolfcrypt/integer.h @@ -0,0 +1,387 @@ +/* integer.h + * + * Copyright (C) 2006-2017 wolfSSL Inc. All rights reserved. + * + * This file is part of wolfSSL. + * + * Contact licensing@wolfssl.com with any questions or comments. + * + * http://www.wolfssl.com + */ + + + +/* + * Based on public domain LibTomMath 0.38 by Tom St Denis, tomstdenis@iahu.ca, + * http://math.libtomcrypt.com + */ + + +#ifndef WOLF_CRYPT_INTEGER_H +#define WOLF_CRYPT_INTEGER_H + +/* may optionally use fast math instead, not yet supported on all platforms and + may not be faster on all +*/ +#include /* will set MP_xxBIT if not default */ +#ifdef WOLFSSL_SP_MATH + #include +#elif defined(USE_FAST_MATH) + #include +#else + +#include + +#ifndef CHAR_BIT + #include +#endif + +#include + +/* wolf big int and common functions */ +#include + + +#ifdef WOLFSSL_PUBLIC_MP + #define MP_API WOLFSSL_API +#else + #define MP_API +#endif + +#ifndef MIN + #define MIN(x,y) ((x)<(y)?(x):(y)) +#endif + +#ifndef MAX + #define MAX(x,y) ((x)>(y)?(x):(y)) +#endif + +#ifdef __cplusplus +extern "C" { + +/* C++ compilers don't like assigning void * to mp_digit * */ +#define OPT_CAST(x) (x *) + +#else + +/* C on the other hand doesn't care */ +#define OPT_CAST(x) + +#endif /* __cplusplus */ + + +/* detect 64-bit mode if possible */ +#if defined(__x86_64__) + #if !(defined(MP_64BIT) && defined(MP_16BIT) && defined(MP_8BIT)) + #define MP_64BIT + #endif +#endif +/* if intel compiler doesn't provide 128 bit type don't turn on 64bit */ +#if defined(MP_64BIT) && defined(__INTEL_COMPILER) && !defined(HAVE___UINT128_T) + #undef MP_64BIT +#endif + + +/* allow user to define on mp_digit, mp_word, DIGIT_BIT types */ +#ifndef WOLFSSL_BIGINT_TYPES + +/* some default configurations. + * + * A "mp_digit" must be able to hold DIGIT_BIT + 1 bits + * A "mp_word" must be able to hold 2*DIGIT_BIT + 1 bits + * + * At the very least a mp_digit must be able to hold 7 bits + * [any size beyond that is ok provided it doesn't overflow the data type] + */ +#ifdef MP_8BIT + typedef unsigned char mp_digit; + typedef unsigned short mp_word; +#elif defined(MP_16BIT) || defined(NO_64BIT) + typedef unsigned short mp_digit; + typedef unsigned int mp_word; + #define DIGIT_BIT 12 +#elif defined(MP_64BIT) + /* for GCC only on supported platforms */ + typedef unsigned long long mp_digit; /* 64 bit type, 128 uses mode(TI) */ + typedef unsigned long mp_word __attribute__ ((mode(TI))); + + #define DIGIT_BIT 60 +#else + /* this is the default case, 28-bit digits */ + + #if defined(_MSC_VER) || defined(__BORLANDC__) + typedef unsigned __int64 ulong64; + #else + typedef unsigned long long ulong64; + #endif + + typedef unsigned int mp_digit; /* long could be 64 now, changed TAO */ + typedef ulong64 mp_word; + +#ifdef MP_31BIT + /* this is an extension that uses 31-bit digits */ + #define DIGIT_BIT 31 +#else + /* default case is 28-bit digits, defines MP_28BIT as a handy test macro */ + #define DIGIT_BIT 28 + #define MP_28BIT +#endif +#endif + +#endif /* WOLFSSL_BIGINT_TYPES */ + +/* otherwise the bits per digit is calculated automatically from the size of + a mp_digit */ +#ifndef DIGIT_BIT + #define DIGIT_BIT ((int)((CHAR_BIT * sizeof(mp_digit) - 1))) + /* bits per digit */ +#endif + +#define MP_DIGIT_BIT DIGIT_BIT +#define MP_MASK ((((mp_digit)1)<<((mp_digit)DIGIT_BIT))-((mp_digit)1)) +#define MP_DIGIT_MAX MP_MASK + +/* equalities */ +#define MP_LT -1 /* less than */ +#define MP_EQ 0 /* equal to */ +#define MP_GT 1 /* greater than */ + +#define MP_ZPOS 0 /* positive integer */ +#define MP_NEG 1 /* negative */ + +#define MP_OKAY 0 /* ok result */ +#define MP_MEM -2 /* out of mem */ +#define MP_VAL -3 /* invalid input */ +#define MP_NOT_INF -4 /* point not at infinity */ +#define MP_RANGE MP_NOT_INF + +#define MP_YES 1 /* yes response */ +#define MP_NO 0 /* no response */ + +/* Primality generation flags */ +#define LTM_PRIME_BBS 0x0001 /* BBS style prime */ +#define LTM_PRIME_SAFE 0x0002 /* Safe prime (p-1)/2 == prime */ +#define LTM_PRIME_2MSB_ON 0x0008 /* force 2nd MSB to 1 */ + +typedef int mp_err; + +/* define this to use lower memory usage routines (exptmods mostly) */ +#define MP_LOW_MEM + +/* default precision */ +#ifndef MP_PREC + #ifndef MP_LOW_MEM + #define MP_PREC 32 /* default digits of precision */ + #else + #define MP_PREC 1 /* default digits of precision */ + #endif +#endif + +/* size of comba arrays, should be at least 2 * 2**(BITS_PER_WORD - + BITS_PER_DIGIT*2) */ +#define MP_WARRAY (1 << (sizeof(mp_word) * CHAR_BIT - 2 * DIGIT_BIT + 1)) + +#ifdef HAVE_WOLF_BIGINT + struct WC_BIGINT; +#endif + +/* the mp_int structure */ +typedef struct mp_int { + int used, alloc, sign; + mp_digit *dp; + +#ifdef HAVE_WOLF_BIGINT + struct WC_BIGINT raw; /* unsigned binary (big endian) */ +#endif +} mp_int; +#define MP_INT_DEFINED + +/* callback for mp_prime_random, should fill dst with random bytes and return + how many read [up to len] */ +typedef int ltm_prime_callback(unsigned char *dst, int len, void *dat); + + +#define USED(m) ((m)->used) +#define DIGIT(m,k) ((m)->dp[(k)]) +#define SIGN(m) ((m)->sign) + + +/* ---> Basic Manipulations <--- */ +#define mp_iszero(a) (((a)->used == 0) ? MP_YES : MP_NO) +#define mp_isone(a) \ + (((((a)->used == 1)) && ((a)->dp[0] == 1u)) ? MP_YES : MP_NO) +#define mp_iseven(a) \ + (((a)->used > 0 && (((a)->dp[0] & 1u) == 0u)) ? MP_YES : MP_NO) +#define mp_isodd(a) \ + (((a)->used > 0 && (((a)->dp[0] & 1u) == 1u)) ? MP_YES : MP_NO) +#define mp_isneg(a) (((a)->sign != MP_ZPOS) ? MP_YES : MP_NO) + +/* number of primes */ +#ifdef MP_8BIT + #define PRIME_SIZE 31 +#else + #define PRIME_SIZE 256 +#endif + +#ifndef MAX_INVMOD_SZ + #if defined(WOLFSSL_MYSQL_COMPATIBLE) + #define MAX_INVMOD_SZ 8192 + #else + #define MAX_INVMOD_SZ 4096 + #endif +#endif + +#define mp_prime_random(a, t, size, bbs, cb, dat) \ + mp_prime_random_ex(a, t, ((size) * 8) + 1, (bbs==1)?LTM_PRIME_BBS:0, cb, dat) + +#define mp_read_raw(mp, str, len) mp_read_signed_bin((mp), (str), (len)) +#define mp_raw_size(mp) mp_signed_bin_size(mp) +#define mp_toraw(mp, str) mp_to_signed_bin((mp), (str)) +#define mp_read_mag(mp, str, len) mp_read_unsigned_bin((mp), (str), (len)) +#define mp_mag_size(mp) mp_unsigned_bin_size(mp) +#define mp_tomag(mp, str) mp_to_unsigned_bin((mp), (str)) + +#define MP_RADIX_BIN 2 +#define MP_RADIX_OCT 8 +#define MP_RADIX_DEC 10 +#define MP_RADIX_HEX 16 +#define MP_RADIX_MAX 64 + +#define mp_tobinary(M, S) mp_toradix((M), (S), MP_RADIX_BIN) +#define mp_tooctal(M, S) mp_toradix((M), (S), MP_RADIX_OCT) +#define mp_todecimal(M, S) mp_toradix((M), (S), MP_RADIX_DEC) +#define mp_tohex(M, S) mp_toradix((M), (S), MP_RADIX_HEX) + +#define s_mp_mul(a, b, c) s_mp_mul_digs(a, b, c, (a)->used + (b)->used + 1) + +#if defined(HAVE_ECC) || defined(WOLFSSL_KEY_GEN) || defined(HAVE_COMP_KEY) || \ + defined(WOLFSSL_DEBUG_MATH) || defined(DEBUG_WOLFSSL) +extern const char *mp_s_rmap; +#endif + +/* 6 functions needed by Rsa */ +MP_API int mp_init (mp_int * a); +MP_API void mp_clear (mp_int * a); +MP_API void mp_free (mp_int * a); +MP_API void mp_forcezero(mp_int * a); +MP_API int mp_unsigned_bin_size(mp_int * a); +MP_API int mp_read_unsigned_bin (mp_int * a, const unsigned char *b, int c); +MP_API int mp_to_unsigned_bin_at_pos(int x, mp_int *t, unsigned char *b); +MP_API int mp_to_unsigned_bin (mp_int * a, unsigned char *b); +MP_API int mp_exptmod (mp_int * G, mp_int * X, mp_int * P, mp_int * Y); +/* end functions needed by Rsa */ + +/* functions added to support above needed, removed TOOM and KARATSUBA */ +MP_API int mp_count_bits (mp_int * a); +MP_API int mp_leading_bit (mp_int * a); +MP_API int mp_init_copy (mp_int * a, mp_int * b); +MP_API int mp_copy (mp_int * a, mp_int * b); +MP_API int mp_grow (mp_int * a, int size); +MP_API int mp_div_2d (mp_int * a, int b, mp_int * c, mp_int * d); +MP_API void mp_zero (mp_int * a); +MP_API void mp_clamp (mp_int * a); +MP_API void mp_exch (mp_int * a, mp_int * b); +MP_API void mp_rshd (mp_int * a, int b); +MP_API void mp_rshb (mp_int * a, int b); +MP_API int mp_mod_2d (mp_int * a, int b, mp_int * c); +MP_API int mp_mul_2d (mp_int * a, int b, mp_int * c); +MP_API int mp_lshd (mp_int * a, int b); +MP_API int mp_abs (mp_int * a, mp_int * b); +MP_API int mp_invmod (mp_int * a, mp_int * b, mp_int * c); +int fast_mp_invmod (mp_int * a, mp_int * b, mp_int * c); +MP_API int mp_invmod_slow (mp_int * a, mp_int * b, mp_int * c); +MP_API int mp_cmp_mag (mp_int * a, mp_int * b); +MP_API int mp_cmp (mp_int * a, mp_int * b); +MP_API int mp_cmp_d(mp_int * a, mp_digit b); +MP_API int mp_set (mp_int * a, mp_digit b); +MP_API int mp_is_bit_set (mp_int * a, mp_digit b); +MP_API int mp_mod (mp_int * a, mp_int * b, mp_int * c); +MP_API int mp_div(mp_int * a, mp_int * b, mp_int * c, mp_int * d); +MP_API int mp_div_2(mp_int * a, mp_int * b); +MP_API int mp_add (mp_int * a, mp_int * b, mp_int * c); +int s_mp_add (mp_int * a, mp_int * b, mp_int * c); +int s_mp_sub (mp_int * a, mp_int * b, mp_int * c); +MP_API int mp_sub (mp_int * a, mp_int * b, mp_int * c); +MP_API int mp_reduce_is_2k_l(mp_int *a); +MP_API int mp_reduce_is_2k(mp_int *a); +MP_API int mp_dr_is_modulus(mp_int *a); +MP_API int mp_exptmod_fast (mp_int * G, mp_int * X, mp_int * P, mp_int * Y, + int); +MP_API int mp_montgomery_setup (mp_int * n, mp_digit * rho); +int fast_mp_montgomery_reduce (mp_int * x, mp_int * n, mp_digit rho); +MP_API int mp_montgomery_reduce (mp_int * x, mp_int * n, mp_digit rho); +MP_API void mp_dr_setup(mp_int *a, mp_digit *d); +MP_API int mp_dr_reduce (mp_int * x, mp_int * n, mp_digit k); +MP_API int mp_reduce_2k(mp_int *a, mp_int *n, mp_digit d); +int fast_s_mp_mul_high_digs (mp_int * a, mp_int * b, mp_int * c, int digs); +int s_mp_mul_high_digs (mp_int * a, mp_int * b, mp_int * c, int digs); +MP_API int mp_reduce_2k_setup_l(mp_int *a, mp_int *d); +MP_API int mp_reduce_2k_l(mp_int *a, mp_int *n, mp_int *d); +MP_API int mp_reduce (mp_int * x, mp_int * m, mp_int * mu); +MP_API int mp_reduce_setup (mp_int * a, mp_int * b); +int s_mp_exptmod (mp_int * G, mp_int * X, mp_int * P, mp_int * Y, int redmode); +MP_API int mp_montgomery_calc_normalization (mp_int * a, mp_int * b); +int s_mp_mul_digs (mp_int * a, mp_int * b, mp_int * c, int digs); +int s_mp_sqr (mp_int * a, mp_int * b); +int fast_s_mp_mul_digs (mp_int * a, mp_int * b, mp_int * c, int digs); +int fast_s_mp_sqr (mp_int * a, mp_int * b); +MP_API int mp_init_size (mp_int * a, int size); +MP_API int mp_div_3 (mp_int * a, mp_int *c, mp_digit * d); +MP_API int mp_mul_2(mp_int * a, mp_int * b); +MP_API int mp_mul (mp_int * a, mp_int * b, mp_int * c); +MP_API int mp_sqr (mp_int * a, mp_int * b); +MP_API int mp_mulmod (mp_int * a, mp_int * b, mp_int * c, mp_int * d); +MP_API int mp_submod (mp_int* a, mp_int* b, mp_int* c, mp_int* d); +MP_API int mp_addmod (mp_int* a, mp_int* b, mp_int* c, mp_int* d); +MP_API int mp_mul_d (mp_int * a, mp_digit b, mp_int * c); +MP_API int mp_2expt (mp_int * a, int b); +MP_API int mp_set_bit (mp_int * a, int b); +MP_API int mp_reduce_2k_setup(mp_int *a, mp_digit *d); +MP_API int mp_add_d (mp_int* a, mp_digit b, mp_int* c); +MP_API int mp_set_int (mp_int * a, unsigned long b); +MP_API int mp_sub_d (mp_int * a, mp_digit b, mp_int * c); +/* end support added functions */ + +/* added */ +MP_API int mp_init_multi(mp_int* a, mp_int* b, mp_int* c, mp_int* d, mp_int* e, + mp_int* f); +MP_API int mp_toradix (mp_int *a, char *str, int radix); +MP_API int mp_radix_size (mp_int * a, int radix, int *size); + +#ifdef WOLFSSL_DEBUG_MATH + MP_API void mp_dump(const char* desc, mp_int* a, byte verbose); +#else + #define mp_dump(desc, a, verbose) +#endif + +#if defined(HAVE_ECC) || defined(WOLFSSL_KEY_GEN) + MP_API int mp_sqrmod(mp_int* a, mp_int* b, mp_int* c); +#endif +#if !defined(NO_DSA) || defined(HAVE_ECC) + MP_API int mp_read_radix(mp_int* a, const char* str, int radix); +#endif + +#ifdef WOLFSSL_KEY_GEN + MP_API int mp_prime_is_prime (mp_int * a, int t, int *result); + MP_API int mp_gcd (mp_int * a, mp_int * b, mp_int * c); + MP_API int mp_lcm (mp_int * a, mp_int * b, mp_int * c); + MP_API int mp_rand_prime(mp_int* N, int len, WC_RNG* rng, void* heap); +#endif + +MP_API int mp_cnt_lsb(mp_int *a); +MP_API int mp_mod_d(mp_int* a, mp_digit b, mp_digit* c); + + +/* wolf big int and common functions */ +#include + + +#ifdef __cplusplus + } +#endif + + +#endif /* USE_FAST_MATH */ + +#endif /* WOLF_CRYPT_INTEGER_H */ + diff --git a/include/wolfssl/wolfcrypt/md5.h b/include/wolfssl/wolfcrypt/md5.h new file mode 100644 index 00000000..67e077dc --- /dev/null +++ b/include/wolfssl/wolfcrypt/md5.h @@ -0,0 +1,108 @@ +/* md5.h + * + * Copyright (C) 2006-2017 wolfSSL Inc. All rights reserved. + * + * This file is part of wolfSSL. + * + * Contact licensing@wolfssl.com with any questions or comments. + * + * http://www.wolfssl.com + */ + + + +#ifndef WOLF_CRYPT_MD5_H +#define WOLF_CRYPT_MD5_H + +#include + +#ifndef NO_MD5 + +#ifdef HAVE_FIPS + #define wc_InitMd5 InitMd5 + #define wc_Md5Update Md5Update + #define wc_Md5Final Md5Final + #define wc_Md5Hash Md5Hash +#endif + +#ifdef __cplusplus + extern "C" { +#endif + +#ifndef NO_OLD_WC_NAMES + #define Md5 wc_Md5 + #define MD5 WC_MD5 + #define MD5_BLOCK_SIZE WC_MD5_BLOCK_SIZE + #define MD5_DIGEST_SIZE WC_MD5_DIGEST_SIZE + #define WC_MD5_PAD_SIZE WC_MD5_PAD_SIZE +#endif + +/* in bytes */ +enum { + WC_MD5 = 0, /* hash type unique */ + WC_MD5_BLOCK_SIZE = 64, + WC_MD5_DIGEST_SIZE = 16, + WC_MD5_PAD_SIZE = 56 +}; + +#ifdef WOLFSSL_MICROCHIP_PIC32MZ + #include +#endif +#ifdef STM32_HASH + #include +#endif +#ifdef WOLFSSL_ASYNC_CRYPT + #include +#endif + +#ifdef WOLFSSL_TI_HASH + #include "wolfssl/wolfcrypt/port/ti/ti-hash.h" +#elif defined(WOLFSSL_IMX6_CAAM) + #include "wolfssl/wolfcrypt/port/caam/wolfcaam_sha.h" +#else + +/* MD5 digest */ +typedef struct wc_Md5 { +#ifdef STM32_HASH + STM32_HASH_Context stmCtx; +#else + word32 buffLen; /* in bytes */ + word32 loLen; /* length in bytes */ + word32 hiLen; /* length in bytes */ + word32 buffer[WC_MD5_BLOCK_SIZE / sizeof(word32)]; +#ifdef WOLFSSL_PIC32MZ_HASH + word32 digest[PIC32_DIGEST_SIZE / sizeof(word32)]; +#else + word32 digest[WC_MD5_DIGEST_SIZE / sizeof(word32)]; +#endif + void* heap; +#ifdef WOLFSSL_PIC32MZ_HASH + hashUpdCache cache; /* cache for updates */ +#endif +#endif /* STM32_HASH */ +#ifdef WOLFSSL_ASYNC_CRYPT + WC_ASYNC_DEV asyncDev; +#endif /* WOLFSSL_ASYNC_CRYPT */ +} wc_Md5; + +#endif /* WOLFSSL_TI_HASH */ + +WOLFSSL_API int wc_InitMd5(wc_Md5*); +WOLFSSL_API int wc_InitMd5_ex(wc_Md5*, void*, int); +WOLFSSL_API int wc_Md5Update(wc_Md5*, const byte*, word32); +WOLFSSL_API int wc_Md5Final(wc_Md5*, byte*); +WOLFSSL_API void wc_Md5Free(wc_Md5*); + +WOLFSSL_API int wc_Md5GetHash(wc_Md5*, byte*); +WOLFSSL_API int wc_Md5Copy(wc_Md5*, wc_Md5*); + +#ifdef WOLFSSL_PIC32MZ_HASH +WOLFSSL_API void wc_Md5SizeSet(wc_Md5* md5, word32 len); +#endif + +#ifdef __cplusplus + } /* extern "C" */ +#endif + +#endif /* NO_MD5 */ +#endif /* WOLF_CRYPT_MD5_H */ diff --git a/include/wolfssl/wolfcrypt/mpi_class.h b/include/wolfssl/wolfcrypt/mpi_class.h new file mode 100644 index 00000000..d612969d --- /dev/null +++ b/include/wolfssl/wolfcrypt/mpi_class.h @@ -0,0 +1,1010 @@ +/* mpi_class.h + * + * Copyright (C) 2006-2017 wolfSSL Inc. All rights reserved. + * + * This file is part of wolfSSL. + * + * Contact licensing@wolfssl.com with any questions or comments. + * + * http://www.wolfssl.com + */ + + + + +#if !(defined(LTM1) && defined(LTM2) && defined(LTM3)) +#if defined(LTM2) +#define LTM3 +#endif +#if defined(LTM1) +#define LTM2 +#endif +#define LTM1 + +#if defined(LTM_ALL) +#define BN_ERROR_C +#define BN_FAST_MP_INVMOD_C +#define BN_FAST_MP_MONTGOMERY_REDUCE_C +#define BN_FAST_S_MP_MUL_DIGS_C +#define BN_FAST_S_MP_MUL_HIGH_DIGS_C +#define BN_FAST_S_MP_SQR_C +#define BN_MP_2EXPT_C +#define BN_MP_ABS_C +#define BN_MP_ADD_C +#define BN_MP_ADD_D_C +#define BN_MP_ADDMOD_C +#define BN_MP_AND_C +#define BN_MP_CLAMP_C +#define BN_MP_CLEAR_C +#define BN_MP_CLEAR_MULTI_C +#define BN_MP_CMP_C +#define BN_MP_CMP_D_C +#define BN_MP_CMP_MAG_C +#define BN_MP_CNT_LSB_C +#define BN_MP_COPY_C +#define BN_MP_COUNT_BITS_C +#define BN_MP_DIV_C +#define BN_MP_DIV_2_C +#define BN_MP_DIV_2D_C +#define BN_MP_DIV_3_C +#define BN_MP_DIV_D_C +#define BN_MP_DR_IS_MODULUS_C +#define BN_MP_DR_REDUCE_C +#define BN_MP_DR_SETUP_C +#define BN_MP_EXCH_C +#define BN_MP_EXPT_D_C +#define BN_MP_EXPTMOD_C +#define BN_MP_EXPTMOD_FAST_C +#define BN_MP_EXTEUCLID_C +#define BN_MP_FREAD_C +#define BN_MP_FWRITE_C +#define BN_MP_GCD_C +#define BN_MP_GET_INT_C +#define BN_MP_GROW_C +#define BN_MP_INIT_C +#define BN_MP_INIT_COPY_C +#define BN_MP_INIT_MULTI_C +#define BN_MP_INIT_SET_C +#define BN_MP_INIT_SET_INT_C +#define BN_MP_INIT_SIZE_C +#define BN_MP_INVMOD_C +#define BN_MP_INVMOD_SLOW_C +#define BN_MP_IS_SQUARE_C +#define BN_MP_JACOBI_C +#define BN_MP_KARATSUBA_MUL_C +#define BN_MP_KARATSUBA_SQR_C +#define BN_MP_LCM_C +#define BN_MP_LSHD_C +#define BN_MP_MOD_C +#define BN_MP_MOD_2D_C +#define BN_MP_MOD_D_C +#define BN_MP_MONTGOMERY_CALC_NORMALIZATION_C +#define BN_MP_MONTGOMERY_REDUCE_C +#define BN_MP_MONTGOMERY_SETUP_C +#define BN_MP_MUL_C +#define BN_MP_MUL_2_C +#define BN_MP_MUL_2D_C +#define BN_MP_MUL_D_C +#define BN_MP_MULMOD_C +#define BN_MP_N_ROOT_C +#define BN_MP_NEG_C +#define BN_MP_OR_C +#define BN_MP_PRIME_FERMAT_C +#define BN_MP_PRIME_IS_DIVISIBLE_C +#define BN_MP_PRIME_IS_PRIME_C +#define BN_MP_PRIME_MILLER_RABIN_C +#define BN_MP_PRIME_NEXT_PRIME_C +#define BN_MP_PRIME_RABIN_MILLER_TRIALS_C +#define BN_MP_PRIME_RANDOM_EX_C +#define BN_MP_RADIX_SIZE_C +#define BN_MP_RADIX_SMAP_C +#define BN_MP_RAND_C +#define BN_MP_READ_RADIX_C +#define BN_MP_READ_SIGNED_BIN_C +#define BN_MP_READ_UNSIGNED_BIN_C +#define BN_MP_REDUCE_C +#define BN_MP_REDUCE_2K_C +#define BN_MP_REDUCE_2K_L_C +#define BN_MP_REDUCE_2K_SETUP_C +#define BN_MP_REDUCE_2K_SETUP_L_C +#define BN_MP_REDUCE_IS_2K_C +#define BN_MP_REDUCE_IS_2K_L_C +#define BN_MP_REDUCE_SETUP_C +#define BN_MP_RSHD_C +#define BN_MP_SET_C +#define BN_MP_SET_INT_C +#define BN_MP_SHRINK_C +#define BN_MP_SIGNED_BIN_SIZE_C +#define BN_MP_SQR_C +#define BN_MP_SQRMOD_C +#define BN_MP_SQRT_C +#define BN_MP_SUB_C +#define BN_MP_SUB_D_C +#define BN_MP_SUBMOD_C +#define BN_MP_TO_SIGNED_BIN_C +#define BN_MP_TO_SIGNED_BIN_N_C +#define BN_MP_TO_UNSIGNED_BIN_C +#define BN_MP_TO_UNSIGNED_BIN_N_C +#define BN_MP_TOOM_MUL_C +#define BN_MP_TOOM_SQR_C +#define BN_MP_TORADIX_C +#define BN_MP_TORADIX_N_C +#define BN_MP_UNSIGNED_BIN_SIZE_C +#define BN_MP_XOR_C +#define BN_MP_ZERO_C +#define BN_PRIME_TAB_C +#define BN_REVERSE_C +#define BN_S_MP_ADD_C +#define BN_S_MP_EXPTMOD_C +#define BN_S_MP_MUL_DIGS_C +#define BN_S_MP_MUL_HIGH_DIGS_C +#define BN_S_MP_SQR_C +#define BN_S_MP_SUB_C +#define BNCORE_C +#endif + +#if defined(BN_ERROR_C) + #define BN_MP_ERROR_TO_STRING_C +#endif + +#if defined(BN_FAST_MP_INVMOD_C) + #define BN_MP_ISEVEN_C + #define BN_MP_INIT_MULTI_C + #define BN_MP_COPY_C + #define BN_MP_MOD_C + #define BN_MP_SET_C + #define BN_MP_DIV_2_C + #define BN_MP_ISODD_C + #define BN_MP_SUB_C + #define BN_MP_CMP_C + #define BN_MP_ISZERO_C + #define BN_MP_CMP_D_C + #define BN_MP_ADD_C + #define BN_MP_EXCH_C + #define BN_MP_CLEAR_MULTI_C +#endif + +#if defined(BN_FAST_MP_MONTGOMERY_REDUCE_C) + #define BN_MP_GROW_C + #define BN_MP_RSHD_C + #define BN_MP_CLAMP_C + #define BN_MP_CMP_MAG_C + #define BN_S_MP_SUB_C +#endif + +#if defined(BN_FAST_S_MP_MUL_DIGS_C) + #define BN_MP_GROW_C + #define BN_MP_CLAMP_C +#endif + +#if defined(BN_FAST_S_MP_MUL_HIGH_DIGS_C) + #define BN_MP_GROW_C + #define BN_MP_CLAMP_C +#endif + +#if defined(BN_FAST_S_MP_SQR_C) + #define BN_MP_GROW_C + #define BN_MP_CLAMP_C +#endif + +#if defined(BN_MP_2EXPT_C) + #define BN_MP_ZERO_C + #define BN_MP_GROW_C +#endif + +#if defined(BN_MP_ABS_C) + #define BN_MP_COPY_C +#endif + +#if defined(BN_MP_ADD_C) + #define BN_S_MP_ADD_C + #define BN_MP_CMP_MAG_C + #define BN_S_MP_SUB_C +#endif + +#if defined(BN_MP_ADD_D_C) + #define BN_MP_GROW_C + #define BN_MP_SUB_D_C + #define BN_MP_CLAMP_C +#endif + +#if defined(BN_MP_ADDMOD_C) + #define BN_MP_INIT_C + #define BN_MP_ADD_C + #define BN_MP_CLEAR_C + #define BN_MP_MOD_C +#endif + +#if defined(BN_MP_AND_C) + #define BN_MP_INIT_COPY_C + #define BN_MP_CLAMP_C + #define BN_MP_EXCH_C + #define BN_MP_CLEAR_C +#endif + +#if defined(BN_MP_CLAMP_C) +#endif + +#if defined(BN_MP_CLEAR_C) +#endif + +#if defined(BN_MP_CLEAR_MULTI_C) + #define BN_MP_CLEAR_C +#endif + +#if defined(BN_MP_CMP_C) + #define BN_MP_CMP_MAG_C +#endif + +#if defined(BN_MP_CMP_D_C) +#endif + +#if defined(BN_MP_CMP_MAG_C) +#endif + +#if defined(BN_MP_CNT_LSB_C) + #define BN_MP_ISZERO_C +#endif + +#if defined(BN_MP_COPY_C) + #define BN_MP_GROW_C +#endif + +#if defined(BN_MP_COUNT_BITS_C) +#endif + +#if defined(BN_MP_DIV_C) + #define BN_MP_ISZERO_C + #define BN_MP_CMP_MAG_C + #define BN_MP_COPY_C + #define BN_MP_ZERO_C + #define BN_MP_INIT_MULTI_C + #define BN_MP_SET_C + #define BN_MP_COUNT_BITS_C + #define BN_MP_ABS_C + #define BN_MP_MUL_2D_C + #define BN_MP_CMP_C + #define BN_MP_SUB_C + #define BN_MP_ADD_C + #define BN_MP_DIV_2D_C + #define BN_MP_EXCH_C + #define BN_MP_CLEAR_MULTI_C + #define BN_MP_INIT_SIZE_C + #define BN_MP_INIT_C + #define BN_MP_INIT_COPY_C + #define BN_MP_LSHD_C + #define BN_MP_RSHD_C + #define BN_MP_MUL_D_C + #define BN_MP_CLAMP_C + #define BN_MP_CLEAR_C +#endif + +#if defined(BN_MP_DIV_2_C) + #define BN_MP_GROW_C + #define BN_MP_CLAMP_C +#endif + +#if defined(BN_MP_DIV_2D_C) + #define BN_MP_COPY_C + #define BN_MP_ZERO_C + #define BN_MP_INIT_C + #define BN_MP_MOD_2D_C + #define BN_MP_CLEAR_C + #define BN_MP_RSHD_C + #define BN_MP_CLAMP_C + #define BN_MP_EXCH_C +#endif + +#if defined(BN_MP_DIV_3_C) + #define BN_MP_INIT_SIZE_C + #define BN_MP_CLAMP_C + #define BN_MP_EXCH_C + #define BN_MP_CLEAR_C +#endif + +#if defined(BN_MP_DIV_D_C) + #define BN_MP_ISZERO_C + #define BN_MP_COPY_C + #define BN_MP_DIV_2D_C + #define BN_MP_DIV_3_C + #define BN_MP_INIT_SIZE_C + #define BN_MP_CLAMP_C + #define BN_MP_EXCH_C + #define BN_MP_CLEAR_C +#endif + +#if defined(BN_MP_DR_IS_MODULUS_C) +#endif + +#if defined(BN_MP_DR_REDUCE_C) + #define BN_MP_GROW_C + #define BN_MP_CLAMP_C + #define BN_MP_CMP_MAG_C + #define BN_S_MP_SUB_C +#endif + +#if defined(BN_MP_DR_SETUP_C) +#endif + +#if defined(BN_MP_EXCH_C) +#endif + +#if defined(BN_MP_EXPT_D_C) + #define BN_MP_INIT_COPY_C + #define BN_MP_SET_C + #define BN_MP_SQR_C + #define BN_MP_CLEAR_C + #define BN_MP_MUL_C +#endif + +#if defined(BN_MP_EXPTMOD_C) + #define BN_MP_INIT_C + #define BN_MP_INVMOD_C + #define BN_MP_CLEAR_C + #define BN_MP_ABS_C + #define BN_MP_CLEAR_MULTI_C + #define BN_MP_REDUCE_IS_2K_L_C + #define BN_S_MP_EXPTMOD_C + #define BN_MP_DR_IS_MODULUS_C + #define BN_MP_REDUCE_IS_2K_C + #define BN_MP_ISODD_C + #define BN_MP_EXPTMOD_FAST_C +#endif + +#if defined(BN_MP_EXPTMOD_FAST_C) + #define BN_MP_COUNT_BITS_C + #define BN_MP_INIT_C + #define BN_MP_CLEAR_C + #define BN_MP_MONTGOMERY_SETUP_C + #define BN_FAST_MP_MONTGOMERY_REDUCE_C + #define BN_MP_MONTGOMERY_REDUCE_C + #define BN_MP_DR_SETUP_C + #define BN_MP_DR_REDUCE_C + #define BN_MP_REDUCE_2K_SETUP_C + #define BN_MP_REDUCE_2K_C + #define BN_MP_MONTGOMERY_CALC_NORMALIZATION_C + #define BN_MP_MULMOD_C + #define BN_MP_SET_C + #define BN_MP_MOD_C + #define BN_MP_COPY_C + #define BN_MP_SQR_C + #define BN_MP_MUL_C + #define BN_MP_EXCH_C +#endif + +#if defined(BN_MP_EXTEUCLID_C) + #define BN_MP_INIT_MULTI_C + #define BN_MP_SET_C + #define BN_MP_COPY_C + #define BN_MP_ISZERO_C + #define BN_MP_DIV_C + #define BN_MP_MUL_C + #define BN_MP_SUB_C + #define BN_MP_NEG_C + #define BN_MP_EXCH_C + #define BN_MP_CLEAR_MULTI_C +#endif + +#if defined(BN_MP_FREAD_C) + #define BN_MP_ZERO_C + #define BN_MP_S_RMAP_C + #define BN_MP_MUL_D_C + #define BN_MP_ADD_D_C + #define BN_MP_CMP_D_C +#endif + +#if defined(BN_MP_FWRITE_C) + #define BN_MP_RADIX_SIZE_C + #define BN_MP_TORADIX_C +#endif + +#if defined(BN_MP_GCD_C) + #define BN_MP_ISZERO_C + #define BN_MP_ABS_C + #define BN_MP_ZERO_C + #define BN_MP_INIT_COPY_C + #define BN_MP_CNT_LSB_C + #define BN_MP_DIV_2D_C + #define BN_MP_CMP_MAG_C + #define BN_MP_EXCH_C + #define BN_S_MP_SUB_C + #define BN_MP_MUL_2D_C + #define BN_MP_CLEAR_C +#endif + +#if defined(BN_MP_GET_INT_C) +#endif + +#if defined(BN_MP_GROW_C) +#endif + +#if defined(BN_MP_INIT_C) +#endif + +#if defined(BN_MP_INIT_COPY_C) + #define BN_MP_COPY_C +#endif + +#if defined(BN_MP_INIT_MULTI_C) + #define BN_MP_ERR_C + #define BN_MP_INIT_C + #define BN_MP_CLEAR_C +#endif + +#if defined(BN_MP_INIT_SET_C) + #define BN_MP_INIT_C + #define BN_MP_SET_C +#endif + +#if defined(BN_MP_INIT_SET_INT_C) + #define BN_MP_INIT_C + #define BN_MP_SET_INT_C +#endif + +#if defined(BN_MP_INIT_SIZE_C) + #define BN_MP_INIT_C +#endif + +#if defined(BN_MP_INVMOD_C) + #define BN_MP_ISZERO_C + #define BN_MP_ISODD_C + #define BN_FAST_MP_INVMOD_C + #define BN_MP_INVMOD_SLOW_C +#endif + +#if defined(BN_MP_INVMOD_SLOW_C) + #define BN_MP_ISZERO_C + #define BN_MP_INIT_MULTI_C + #define BN_MP_MOD_C + #define BN_MP_COPY_C + #define BN_MP_ISEVEN_C + #define BN_MP_SET_C + #define BN_MP_DIV_2_C + #define BN_MP_ISODD_C + #define BN_MP_ADD_C + #define BN_MP_SUB_C + #define BN_MP_CMP_C + #define BN_MP_CMP_D_C + #define BN_MP_CMP_MAG_C + #define BN_MP_EXCH_C + #define BN_MP_CLEAR_MULTI_C +#endif + +#if defined(BN_MP_IS_SQUARE_C) + #define BN_MP_MOD_D_C + #define BN_MP_INIT_SET_INT_C + #define BN_MP_MOD_C + #define BN_MP_GET_INT_C + #define BN_MP_SQRT_C + #define BN_MP_SQR_C + #define BN_MP_CMP_MAG_C + #define BN_MP_CLEAR_C +#endif + +#if defined(BN_MP_JACOBI_C) + #define BN_MP_CMP_D_C + #define BN_MP_ISZERO_C + #define BN_MP_INIT_COPY_C + #define BN_MP_CNT_LSB_C + #define BN_MP_DIV_2D_C + #define BN_MP_MOD_C + #define BN_MP_CLEAR_C +#endif + +#if defined(BN_MP_KARATSUBA_MUL_C) + #define BN_MP_MUL_C + #define BN_MP_INIT_SIZE_C + #define BN_MP_CLAMP_C + #define BN_MP_SUB_C + #define BN_MP_ADD_C + #define BN_MP_LSHD_C + #define BN_MP_CLEAR_C +#endif + +#if defined(BN_MP_KARATSUBA_SQR_C) + #define BN_MP_INIT_SIZE_C + #define BN_MP_CLAMP_C + #define BN_MP_SQR_C + #define BN_MP_SUB_C + #define BN_S_MP_ADD_C + #define BN_MP_LSHD_C + #define BN_MP_ADD_C + #define BN_MP_CLEAR_C +#endif + +#if defined(BN_MP_LCM_C) + #define BN_MP_INIT_MULTI_C + #define BN_MP_GCD_C + #define BN_MP_CMP_MAG_C + #define BN_MP_DIV_C + #define BN_MP_MUL_C + #define BN_MP_CLEAR_MULTI_C +#endif + +#if defined(BN_MP_LSHD_C) + #define BN_MP_GROW_C + #define BN_MP_RSHD_C +#endif + +#if defined(BN_MP_MOD_C) + #define BN_MP_INIT_C + #define BN_MP_DIV_C + #define BN_MP_CLEAR_C + #define BN_MP_ADD_C + #define BN_MP_EXCH_C +#endif + +#if defined(BN_MP_MOD_2D_C) + #define BN_MP_ZERO_C + #define BN_MP_COPY_C + #define BN_MP_CLAMP_C +#endif + +#if defined(BN_MP_MOD_D_C) + #define BN_MP_DIV_D_C +#endif + +#if defined(BN_MP_MONTGOMERY_CALC_NORMALIZATION_C) + #define BN_MP_COUNT_BITS_C + #define BN_MP_2EXPT_C + #define BN_MP_SET_C + #define BN_MP_MUL_2_C + #define BN_MP_CMP_MAG_C + #define BN_S_MP_SUB_C +#endif + +#if defined(BN_MP_MONTGOMERY_REDUCE_C) + #define BN_FAST_MP_MONTGOMERY_REDUCE_C + #define BN_MP_GROW_C + #define BN_MP_CLAMP_C + #define BN_MP_RSHD_C + #define BN_MP_CMP_MAG_C + #define BN_S_MP_SUB_C +#endif + +#if defined(BN_MP_MONTGOMERY_SETUP_C) +#endif + +#if defined(BN_MP_MUL_C) + #define BN_MP_TOOM_MUL_C + #define BN_MP_KARATSUBA_MUL_C + #define BN_FAST_S_MP_MUL_DIGS_C + #define BN_S_MP_MUL_C + #define BN_S_MP_MUL_DIGS_C +#endif + +#if defined(BN_MP_MUL_2_C) + #define BN_MP_GROW_C +#endif + +#if defined(BN_MP_MUL_2D_C) + #define BN_MP_COPY_C + #define BN_MP_GROW_C + #define BN_MP_LSHD_C + #define BN_MP_CLAMP_C +#endif + +#if defined(BN_MP_MUL_D_C) + #define BN_MP_GROW_C + #define BN_MP_CLAMP_C +#endif + +#if defined(BN_MP_MULMOD_C) + #define BN_MP_INIT_C + #define BN_MP_MUL_C + #define BN_MP_CLEAR_C + #define BN_MP_MOD_C +#endif + +#if defined(BN_MP_N_ROOT_C) + #define BN_MP_INIT_C + #define BN_MP_SET_C + #define BN_MP_COPY_C + #define BN_MP_EXPT_D_C + #define BN_MP_MUL_C + #define BN_MP_SUB_C + #define BN_MP_MUL_D_C + #define BN_MP_DIV_C + #define BN_MP_CMP_C + #define BN_MP_SUB_D_C + #define BN_MP_EXCH_C + #define BN_MP_CLEAR_C +#endif + +#if defined(BN_MP_NEG_C) + #define BN_MP_COPY_C + #define BN_MP_ISZERO_C +#endif + +#if defined(BN_MP_OR_C) + #define BN_MP_INIT_COPY_C + #define BN_MP_CLAMP_C + #define BN_MP_EXCH_C + #define BN_MP_CLEAR_C +#endif + +#if defined(BN_MP_PRIME_FERMAT_C) + #define BN_MP_CMP_D_C + #define BN_MP_INIT_C + #define BN_MP_EXPTMOD_C + #define BN_MP_CMP_C + #define BN_MP_CLEAR_C +#endif + +#if defined(BN_MP_PRIME_IS_DIVISIBLE_C) + #define BN_MP_MOD_D_C +#endif + +#if defined(BN_MP_PRIME_IS_PRIME_C) + #define BN_MP_CMP_D_C + #define BN_MP_PRIME_IS_DIVISIBLE_C + #define BN_MP_INIT_C + #define BN_MP_SET_C + #define BN_MP_PRIME_MILLER_RABIN_C + #define BN_MP_CLEAR_C +#endif + +#if defined(BN_MP_PRIME_MILLER_RABIN_C) + #define BN_MP_CMP_D_C + #define BN_MP_INIT_COPY_C + #define BN_MP_SUB_D_C + #define BN_MP_CNT_LSB_C + #define BN_MP_DIV_2D_C + #define BN_MP_EXPTMOD_C + #define BN_MP_CMP_C + #define BN_MP_SQRMOD_C + #define BN_MP_CLEAR_C +#endif + +#if defined(BN_MP_PRIME_NEXT_PRIME_C) + #define BN_MP_CMP_D_C + #define BN_MP_SET_C + #define BN_MP_SUB_D_C + #define BN_MP_ISEVEN_C + #define BN_MP_MOD_D_C + #define BN_MP_INIT_C + #define BN_MP_ADD_D_C + #define BN_MP_PRIME_MILLER_RABIN_C + #define BN_MP_CLEAR_C +#endif + +#if defined(BN_MP_PRIME_RABIN_MILLER_TRIALS_C) +#endif + +#if defined(BN_MP_PRIME_RANDOM_EX_C) + #define BN_MP_READ_UNSIGNED_BIN_C + #define BN_MP_PRIME_IS_PRIME_C + #define BN_MP_SUB_D_C + #define BN_MP_DIV_2_C + #define BN_MP_MUL_2_C + #define BN_MP_ADD_D_C +#endif + +#if defined(BN_MP_RADIX_SIZE_C) + #define BN_MP_COUNT_BITS_C + #define BN_MP_INIT_COPY_C + #define BN_MP_ISZERO_C + #define BN_MP_DIV_D_C + #define BN_MP_CLEAR_C +#endif + +#if defined(BN_MP_RADIX_SMAP_C) + #define BN_MP_S_RMAP_C +#endif + +#if defined(BN_MP_RAND_C) + #define BN_MP_ZERO_C + #define BN_MP_ADD_D_C + #define BN_MP_LSHD_C +#endif + +#if defined(BN_MP_READ_RADIX_C) + #define BN_MP_ZERO_C + #define BN_MP_S_RMAP_C + #define BN_MP_RADIX_SMAP_C + #define BN_MP_MUL_D_C + #define BN_MP_ADD_D_C + #define BN_MP_ISZERO_C +#endif + +#if defined(BN_MP_READ_SIGNED_BIN_C) + #define BN_MP_READ_UNSIGNED_BIN_C +#endif + +#if defined(BN_MP_READ_UNSIGNED_BIN_C) + #define BN_MP_GROW_C + #define BN_MP_ZERO_C + #define BN_MP_MUL_2D_C + #define BN_MP_CLAMP_C +#endif + +#if defined(BN_MP_REDUCE_C) + #define BN_MP_REDUCE_SETUP_C + #define BN_MP_INIT_COPY_C + #define BN_MP_RSHD_C + #define BN_MP_MUL_C + #define BN_S_MP_MUL_HIGH_DIGS_C + #define BN_FAST_S_MP_MUL_HIGH_DIGS_C + #define BN_MP_MOD_2D_C + #define BN_S_MP_MUL_DIGS_C + #define BN_MP_SUB_C + #define BN_MP_CMP_D_C + #define BN_MP_SET_C + #define BN_MP_LSHD_C + #define BN_MP_ADD_C + #define BN_MP_CMP_C + #define BN_S_MP_SUB_C + #define BN_MP_CLEAR_C +#endif + +#if defined(BN_MP_REDUCE_2K_C) + #define BN_MP_INIT_C + #define BN_MP_COUNT_BITS_C + #define BN_MP_DIV_2D_C + #define BN_MP_MUL_D_C + #define BN_S_MP_ADD_C + #define BN_MP_CMP_MAG_C + #define BN_S_MP_SUB_C + #define BN_MP_CLEAR_C +#endif + +#if defined(BN_MP_REDUCE_2K_L_C) + #define BN_MP_INIT_C + #define BN_MP_COUNT_BITS_C + #define BN_MP_DIV_2D_C + #define BN_MP_MUL_C + #define BN_S_MP_ADD_C + #define BN_MP_CMP_MAG_C + #define BN_S_MP_SUB_C + #define BN_MP_CLEAR_C +#endif + +#if defined(BN_MP_REDUCE_2K_SETUP_C) + #define BN_MP_INIT_C + #define BN_MP_COUNT_BITS_C + #define BN_MP_2EXPT_C + #define BN_MP_CLEAR_C + #define BN_S_MP_SUB_C +#endif + +#if defined(BN_MP_REDUCE_2K_SETUP_L_C) + #define BN_MP_INIT_C + #define BN_MP_2EXPT_C + #define BN_MP_COUNT_BITS_C + #define BN_S_MP_SUB_C + #define BN_MP_CLEAR_C +#endif + +#if defined(BN_MP_REDUCE_IS_2K_C) + #define BN_MP_REDUCE_2K_C + #define BN_MP_COUNT_BITS_C +#endif + +#if defined(BN_MP_REDUCE_IS_2K_L_C) +#endif + +#if defined(BN_MP_REDUCE_SETUP_C) + #define BN_MP_2EXPT_C + #define BN_MP_DIV_C +#endif + +#if defined(BN_MP_RSHD_C) + #define BN_MP_ZERO_C +#endif + +#if defined(BN_MP_SET_C) + #define BN_MP_ZERO_C +#endif + +#if defined(BN_MP_SET_INT_C) + #define BN_MP_ZERO_C + #define BN_MP_MUL_2D_C + #define BN_MP_CLAMP_C +#endif + +#if defined(BN_MP_SHRINK_C) +#endif + +#if defined(BN_MP_SIGNED_BIN_SIZE_C) + #define BN_MP_UNSIGNED_BIN_SIZE_C +#endif + +#if defined(BN_MP_SQR_C) + #define BN_MP_TOOM_SQR_C + #define BN_MP_KARATSUBA_SQR_C + #define BN_FAST_S_MP_SQR_C + #define BN_S_MP_SQR_C +#endif + +#if defined(BN_MP_SQRMOD_C) + #define BN_MP_INIT_C + #define BN_MP_SQR_C + #define BN_MP_CLEAR_C + #define BN_MP_MOD_C +#endif + +#if defined(BN_MP_SQRT_C) + #define BN_MP_N_ROOT_C + #define BN_MP_ISZERO_C + #define BN_MP_ZERO_C + #define BN_MP_INIT_COPY_C + #define BN_MP_RSHD_C + #define BN_MP_DIV_C + #define BN_MP_ADD_C + #define BN_MP_DIV_2_C + #define BN_MP_CMP_MAG_C + #define BN_MP_EXCH_C + #define BN_MP_CLEAR_C +#endif + +#if defined(BN_MP_SUB_C) + #define BN_S_MP_ADD_C + #define BN_MP_CMP_MAG_C + #define BN_S_MP_SUB_C +#endif + +#if defined(BN_MP_SUB_D_C) + #define BN_MP_GROW_C + #define BN_MP_ADD_D_C + #define BN_MP_CLAMP_C +#endif + +#if defined(BN_MP_SUBMOD_C) + #define BN_MP_INIT_C + #define BN_MP_SUB_C + #define BN_MP_CLEAR_C + #define BN_MP_MOD_C +#endif + +#if defined(BN_MP_TO_SIGNED_BIN_C) + #define BN_MP_TO_UNSIGNED_BIN_C +#endif + +#if defined(BN_MP_TO_SIGNED_BIN_N_C) + #define BN_MP_SIGNED_BIN_SIZE_C + #define BN_MP_TO_SIGNED_BIN_C +#endif + +#if defined(BN_MP_TO_UNSIGNED_BIN_C) + #define BN_MP_INIT_COPY_C + #define BN_MP_ISZERO_C + #define BN_MP_DIV_2D_C + #define BN_MP_CLEAR_C +#endif + +#if defined(BN_MP_TO_UNSIGNED_BIN_N_C) + #define BN_MP_UNSIGNED_BIN_SIZE_C + #define BN_MP_TO_UNSIGNED_BIN_C +#endif + +#if defined(BN_MP_TOOM_MUL_C) + #define BN_MP_INIT_MULTI_C + #define BN_MP_MOD_2D_C + #define BN_MP_COPY_C + #define BN_MP_RSHD_C + #define BN_MP_MUL_C + #define BN_MP_MUL_2_C + #define BN_MP_ADD_C + #define BN_MP_SUB_C + #define BN_MP_DIV_2_C + #define BN_MP_MUL_2D_C + #define BN_MP_MUL_D_C + #define BN_MP_DIV_3_C + #define BN_MP_LSHD_C + #define BN_MP_CLEAR_MULTI_C +#endif + +#if defined(BN_MP_TOOM_SQR_C) + #define BN_MP_INIT_MULTI_C + #define BN_MP_MOD_2D_C + #define BN_MP_COPY_C + #define BN_MP_RSHD_C + #define BN_MP_SQR_C + #define BN_MP_MUL_2_C + #define BN_MP_ADD_C + #define BN_MP_SUB_C + #define BN_MP_DIV_2_C + #define BN_MP_MUL_2D_C + #define BN_MP_MUL_D_C + #define BN_MP_DIV_3_C + #define BN_MP_LSHD_C + #define BN_MP_CLEAR_MULTI_C +#endif + +#if defined(BN_MP_TORADIX_C) + #define BN_MP_ISZERO_C + #define BN_MP_INIT_COPY_C + #define BN_MP_DIV_D_C + #define BN_MP_CLEAR_C + #define BN_MP_S_RMAP_C +#endif + +#if defined(BN_MP_TORADIX_N_C) + #define BN_MP_ISZERO_C + #define BN_MP_INIT_COPY_C + #define BN_MP_DIV_D_C + #define BN_MP_CLEAR_C + #define BN_MP_S_RMAP_C +#endif + +#if defined(BN_MP_UNSIGNED_BIN_SIZE_C) + #define BN_MP_COUNT_BITS_C +#endif + +#if defined(BN_MP_XOR_C) + #define BN_MP_INIT_COPY_C + #define BN_MP_CLAMP_C + #define BN_MP_EXCH_C + #define BN_MP_CLEAR_C +#endif + +#if defined(BN_MP_ZERO_C) +#endif + +#if defined(BN_PRIME_TAB_C) +#endif + +#if defined(BN_REVERSE_C) +#endif + +#if defined(BN_S_MP_ADD_C) + #define BN_MP_GROW_C + #define BN_MP_CLAMP_C +#endif + +#if defined(BN_S_MP_EXPTMOD_C) + #define BN_MP_COUNT_BITS_C + #define BN_MP_INIT_C + #define BN_MP_CLEAR_C + #define BN_MP_REDUCE_SETUP_C + #define BN_MP_REDUCE_C + #define BN_MP_REDUCE_2K_SETUP_L_C + #define BN_MP_REDUCE_2K_L_C + #define BN_MP_MOD_C + #define BN_MP_COPY_C + #define BN_MP_SQR_C + #define BN_MP_MUL_C + #define BN_MP_SET_C + #define BN_MP_EXCH_C +#endif + +#if defined(BN_S_MP_MUL_DIGS_C) + #define BN_FAST_S_MP_MUL_DIGS_C + #define BN_MP_INIT_SIZE_C + #define BN_MP_CLAMP_C + #define BN_MP_EXCH_C + #define BN_MP_CLEAR_C +#endif + +#if defined(BN_S_MP_MUL_HIGH_DIGS_C) + #define BN_FAST_S_MP_MUL_HIGH_DIGS_C + #define BN_MP_INIT_SIZE_C + #define BN_MP_CLAMP_C + #define BN_MP_EXCH_C + #define BN_MP_CLEAR_C +#endif + +#if defined(BN_S_MP_SQR_C) + #define BN_MP_INIT_SIZE_C + #define BN_MP_CLAMP_C + #define BN_MP_EXCH_C + #define BN_MP_CLEAR_C +#endif + +#if defined(BN_S_MP_SUB_C) + #define BN_MP_GROW_C + #define BN_MP_CLAMP_C +#endif + +#if defined(BNCORE_C) +#endif + +#ifdef LTM3 +#define LTM_LAST +#endif +#include "mpi_superclass.h" +#include "mpi_class.h" +#else +#define LTM_LAST +#endif + diff --git a/include/wolfssl/wolfcrypt/mpi_superclass.h b/include/wolfssl/wolfcrypt/mpi_superclass.h new file mode 100644 index 00000000..3f61dfaf --- /dev/null +++ b/include/wolfssl/wolfcrypt/mpi_superclass.h @@ -0,0 +1,87 @@ +/* mpi_superclass.h + * + * Copyright (C) 2006-2017 wolfSSL Inc. All rights reserved. + * + * This file is part of wolfSSL. + * + * Contact licensing@wolfssl.com with any questions or comments. + * + * http://www.wolfssl.com + */ + + + + +/* super class file for PK algos */ + +/* default ... include all MPI */ +#define LTM_ALL + +/* RSA only (does not support DH/DSA/ECC) */ +/* #define SC_RSA_1 */ + +/* For reference.... On an Athlon64 optimizing for speed... + + LTM's mpi.o with all functions [striped] is 142KiB in size. + +*/ + +/* Works for RSA only, mpi.o is 68KiB */ +#ifdef SC_RSA_1 + #define BN_MP_SHRINK_C + #define BN_MP_LCM_C + #define BN_MP_PRIME_RANDOM_EX_C + #define BN_MP_INVMOD_C + #define BN_MP_GCD_C + #define BN_MP_MOD_C + #define BN_MP_MULMOD_C + #define BN_MP_ADDMOD_C + #define BN_MP_EXPTMOD_C + #define BN_MP_SET_INT_C + #define BN_MP_INIT_MULTI_C + #define BN_MP_CLEAR_MULTI_C + #define BN_MP_UNSIGNED_BIN_SIZE_C + #define BN_MP_TO_UNSIGNED_BIN_C + #define BN_MP_MOD_D_C + #define BN_MP_PRIME_RABIN_MILLER_TRIALS_C + #define BN_REVERSE_C + #define BN_PRIME_TAB_C + + /* other modifiers */ + #define BN_MP_DIV_SMALL /* Slower division, not critical */ + + /* here we are on the last pass so we turn things off. The functions classes are still there + * but we remove them specifically from the build. This also invokes tweaks in functions + * like removing support for even moduli, etc... + */ +#ifdef LTM_LAST + #undef BN_MP_TOOM_MUL_C + #undef BN_MP_TOOM_SQR_C + #undef BN_MP_KARATSUBA_MUL_C + #undef BN_MP_KARATSUBA_SQR_C + #undef BN_MP_REDUCE_C + #undef BN_MP_REDUCE_SETUP_C + #undef BN_MP_DR_IS_MODULUS_C + #undef BN_MP_DR_SETUP_C + #undef BN_MP_DR_REDUCE_C + #undef BN_MP_REDUCE_IS_2K_C + #undef BN_MP_REDUCE_2K_SETUP_C + #undef BN_MP_REDUCE_2K_C + #undef BN_S_MP_EXPTMOD_C + #undef BN_MP_DIV_3_C + #undef BN_S_MP_MUL_HIGH_DIGS_C + #undef BN_FAST_S_MP_MUL_HIGH_DIGS_C + #undef BN_FAST_MP_INVMOD_C + + /* To safely undefine these you have to make sure your RSA key won't exceed the Comba threshold + * which is roughly 255 digits [7140 bits for 32-bit machines, 15300 bits for 64-bit machines] + * which means roughly speaking you can handle up to 2536-bit RSA keys with these defined without + * trouble. + */ + #undef BN_S_MP_MUL_DIGS_C + #undef BN_S_MP_SQR_C + #undef BN_MP_MONTGOMERY_REDUCE_C +#endif + +#endif + diff --git a/include/wolfssl/wolfcrypt/pwdbased.h b/include/wolfssl/wolfcrypt/pwdbased.h new file mode 100644 index 00000000..5c187afe --- /dev/null +++ b/include/wolfssl/wolfcrypt/pwdbased.h @@ -0,0 +1,66 @@ +/* pwdbased.h + * + * Copyright (C) 2006-2017 wolfSSL Inc. All rights reserved. + * + * This file is part of wolfSSL. + * + * Contact licensing@wolfssl.com with any questions or comments. + * + * http://www.wolfssl.com + */ + + + +#ifndef WOLF_CRYPT_PWDBASED_H +#define WOLF_CRYPT_PWDBASED_H + +#include + +#ifndef NO_PWDBASED + +#ifndef NO_MD5 + #include /* for hash type */ +#endif + +#include + +#ifdef __cplusplus + extern "C" { +#endif + +/* + * hashType renamed to typeH to avoid shadowing global declaration here: + * wolfssl/wolfcrypt/asn.h line 173 in enum Oid_Types + */ +WOLFSSL_API int wc_PBKDF1(byte* output, const byte* passwd, int pLen, + const byte* salt, int sLen, int iterations, int kLen, + int typeH); +WOLFSSL_API int wc_PBKDF2(byte* output, const byte* passwd, int pLen, + const byte* salt, int sLen, int iterations, int kLen, + int typeH); +WOLFSSL_API int wc_PKCS12_PBKDF(byte* output, const byte* passwd, int pLen, + const byte* salt, int sLen, int iterations, + int kLen, int typeH, int purpose); +WOLFSSL_API int wc_PKCS12_PBKDF_ex(byte* output, const byte* passwd,int passLen, + const byte* salt, int saltLen, int iterations, int kLen, + int hashType, int id, void* heap); + +#ifdef HAVE_SCRYPT +WOLFSSL_API int wc_scrypt(byte* output, const byte* passwd, int passLen, + const byte* salt, int saltLen, int cost, + int blockSize, int parallel, int dkLen); +#endif + +/* helper functions */ +WOLFSSL_LOCAL int GetDigestSize(int typeH); +WOLFSSL_LOCAL int GetPKCS12HashSizes(int typeH, word32* v, word32* u); +WOLFSSL_LOCAL int DoPKCS12Hash(int typeH, byte* buffer, word32 totalLen, + byte* Ai, word32 u, int iterations); + + +#ifdef __cplusplus + } /* extern "C" */ +#endif + +#endif /* NO_PWDBASED */ +#endif /* WOLF_CRYPT_PWDBASED_H */ diff --git a/include/wolfssl/wolfcrypt/random.h b/include/wolfssl/wolfcrypt/random.h new file mode 100644 index 00000000..17bcf7bd --- /dev/null +++ b/include/wolfssl/wolfcrypt/random.h @@ -0,0 +1,182 @@ +/* random.h + * + * Copyright (C) 2006-2017 wolfSSL Inc. All rights reserved. + * + * This file is part of wolfSSL. + * + * Contact licensing@wolfssl.com with any questions or comments. + * + * http://www.wolfssl.com + */ + + + + +#ifndef WOLF_CRYPT_RANDOM_H +#define WOLF_CRYPT_RANDOM_H + +#include + +#ifdef HAVE_FIPS +/* for fips @wc_fips */ +#include +#endif + +#ifdef __cplusplus + extern "C" { +#endif + + /* Maximum generate block length */ +#ifndef RNG_MAX_BLOCK_LEN + #ifdef HAVE_INTEL_QA + #define RNG_MAX_BLOCK_LEN (0xFFFF) + #else + #define RNG_MAX_BLOCK_LEN (0x10000) + #endif +#endif + +/* Size of the BRBG seed */ +#ifndef DRBG_SEED_LEN + #define DRBG_SEED_LEN (440/8) +#endif + + +#if !defined(CUSTOM_RAND_TYPE) + /* To maintain compatibility the default is byte */ + #define CUSTOM_RAND_TYPE byte +#endif + +/* make sure Hash DRBG is enabled, unless WC_NO_HASHDRBG is defined + or CUSTOM_RAND_GENERATE_BLOCK is defined*/ +#if !defined(WC_NO_HASHDRBG) || !defined(CUSTOM_RAND_GENERATE_BLOCK) + #undef HAVE_HASHDRBG + #define HAVE_HASHDRBG + #ifndef WC_RESEED_INTERVAL + #define WC_RESEED_INTERVAL (1000000) + #endif +#endif + + +#ifndef HAVE_FIPS /* avoid redefining structs and macros */ + +/* RNG supports the following sources (in order): + * 1. CUSTOM_RAND_GENERATE_BLOCK: Defines name of function as RNG source and + * bypasses the options below. + * 2. HAVE_INTEL_RDRAND: Uses the Intel RDRAND if supported by CPU. + * 3. HAVE_HASHDRBG (requires SHA256 enabled): Uses SHA256 based P-RNG + * seeded via wc_GenerateSeed. This is the default source. + */ + + /* Seed source can be overriden by defining one of these: + CUSTOM_RAND_GENERATE_SEED + CUSTOM_RAND_GENERATE_SEED_OS + CUSTOM_RAND_GENERATE */ + + +#if defined(CUSTOM_RAND_GENERATE_BLOCK) + /* To use define the following: + * #define CUSTOM_RAND_GENERATE_BLOCK myRngFunc + * extern int myRngFunc(byte* output, word32 sz); + */ +#elif defined(HAVE_HASHDRBG) + #ifdef NO_SHA256 + #error "Hash DRBG requires SHA-256." + #endif /* NO_SHA256 */ + #include +#elif defined(HAVE_WNR) + /* allow whitewood as direct RNG source using wc_GenerateSeed directly */ +#else + #error No RNG source defined! +#endif + +#ifdef HAVE_WNR + #include +#endif + +#ifdef WOLFSSL_ASYNC_CRYPT + #include +#endif + + +#if defined(USE_WINDOWS_API) + #if defined(_WIN64) + typedef unsigned __int64 ProviderHandle; + /* type HCRYPTPROV, avoid #include */ + #else + typedef unsigned long ProviderHandle; + #endif +#endif + + +/* OS specific seeder */ +typedef struct OS_Seed { + #if defined(USE_WINDOWS_API) + ProviderHandle handle; + #else + int fd; + #endif +} OS_Seed; + + +#ifndef WC_RNG_TYPE_DEFINED /* guard on redeclaration */ + typedef struct WC_RNG WC_RNG; + #define WC_RNG_TYPE_DEFINED +#endif + +/* RNG context */ +struct WC_RNG { + OS_Seed seed; + void* heap; +#ifdef HAVE_HASHDRBG + /* Hash-based Deterministic Random Bit Generator */ + struct DRBG* drbg; + byte status; +#endif +#ifdef WOLFSSL_ASYNC_CRYPT + WC_ASYNC_DEV asyncDev; + int devId; +#endif +}; + +#endif /* HAVE_FIPS */ + +/* NO_OLD_RNGNAME removes RNG struct name to prevent possible type conflicts, + * can't be used with CTaoCrypt FIPS */ +#if !defined(NO_OLD_RNGNAME) && !defined(HAVE_FIPS) + #define RNG WC_RNG +#endif + + +WOLFSSL_LOCAL +int wc_GenerateSeed(OS_Seed* os, byte* seed, word32 sz); + + +#ifdef HAVE_WNR + /* Whitewood netRandom client library */ + WOLFSSL_API int wc_InitNetRandom(const char*, wnr_hmac_key, int); + WOLFSSL_API int wc_FreeNetRandom(void); +#endif /* HAVE_WNR */ + + +WOLFSSL_API int wc_InitRng(WC_RNG*); +WOLFSSL_API int wc_InitRng_ex(WC_RNG* rng, void* heap, int devId); +WOLFSSL_API int wc_RNG_GenerateBlock(WC_RNG*, byte*, word32 sz); +WOLFSSL_API int wc_RNG_GenerateByte(WC_RNG*, byte*); +WOLFSSL_API int wc_FreeRng(WC_RNG*); + + +#ifdef HAVE_HASHDRBG + WOLFSSL_LOCAL int wc_RNG_DRBG_Reseed(WC_RNG* rng, const byte* entropy, + word32 entropySz); + WOLFSSL_API int wc_RNG_HealthTest(int reseed, + const byte* entropyA, word32 entropyASz, + const byte* entropyB, word32 entropyBSz, + byte* output, word32 outputSz); +#endif /* HAVE_HASHDRBG */ + +#ifdef __cplusplus + } /* extern "C" */ +#endif + +#endif /* WOLF_CRYPT_RANDOM_H */ + diff --git a/include/wolfssl/wolfcrypt/sha.h b/include/wolfssl/wolfcrypt/sha.h new file mode 100644 index 00000000..416ec626 --- /dev/null +++ b/include/wolfssl/wolfcrypt/sha.h @@ -0,0 +1,126 @@ +/* sha.h + * + * Copyright (C) 2006-2017 wolfSSL Inc. All rights reserved. + * + * This file is part of wolfSSL. + * + * Contact licensing@wolfssl.com with any questions or comments. + * + * http://www.wolfssl.com + */ + + + +#ifndef WOLF_CRYPT_SHA_H +#define WOLF_CRYPT_SHA_H + +#include + +#ifndef NO_SHA + +#ifdef HAVE_FIPS +#define wc_Sha Sha +#define WC_SHA SHA +#define WC_SHA_BLOCK_SIZE SHA_BLOCK_SIZE +#define WC_SHA_DIGEST_SIZE SHA_DIGEST_SIZE +#define WC_SHA_PAD_SIZE SHA_PAD_SIZE + +/* for fips @wc_fips */ +#include +#endif + +#ifdef FREESCALE_LTC_SHA + #include "fsl_ltc.h" +#endif + +#ifdef __cplusplus + extern "C" { +#endif + +#ifndef HAVE_FIPS /* avoid redefining structs */ + +#ifdef WOLFSSL_MICROCHIP_PIC32MZ + #include +#endif +#ifdef STM32_HASH + #include +#endif +#ifdef WOLFSSL_ASYNC_CRYPT + #include +#endif + +#ifndef NO_OLD_WC_NAMES + #define Sha wc_Sha + #define SHA WC_SHA + #define SHA_BLOCK_SIZE WC_SHA_BLOCK_SIZE + #define SHA_DIGEST_SIZE WC_SHA_DIGEST_SIZE + #define SHA_PAD_SIZE WC_SHA_PAD_SIZE +#endif + +/* in bytes */ +enum { + WC_SHA = 1, /* hash type unique */ + WC_SHA_BLOCK_SIZE = 64, + WC_SHA_DIGEST_SIZE = 20, + WC_SHA_PAD_SIZE = 56 +}; + + +#if defined(WOLFSSL_TI_HASH) + #include "wolfssl/wolfcrypt/port/ti/ti-hash.h" + +#elif defined(WOLFSSL_IMX6_CAAM) + #include "wolfssl/wolfcrypt/port/caam/wolfcaam_sha.h" + +#else +/* Sha digest */ +typedef struct wc_Sha { +#ifdef FREESCALE_LTC_SHA + ltc_hash_ctx_t ctx; +#elif defined(STM32_HASH) + STM32_HASH_Context stmCtx; +#else + word32 buffLen; /* in bytes */ + word32 loLen; /* length in bytes */ + word32 hiLen; /* length in bytes */ + word32 buffer[WC_SHA_BLOCK_SIZE / sizeof(word32)]; + #ifdef WOLFSSL_PIC32MZ_HASH + word32 digest[PIC32_DIGEST_SIZE / sizeof(word32)]; + #else + word32 digest[WC_SHA_DIGEST_SIZE / sizeof(word32)]; + #endif + void* heap; + #ifdef WOLFSSL_PIC32MZ_HASH + hashUpdCache cache; /* cache for updates */ + #endif + #ifdef WOLFSSL_ASYNC_CRYPT + WC_ASYNC_DEV asyncDev; + #endif /* WOLFSSL_ASYNC_CRYPT */ +#endif +} wc_Sha; + +#endif /* WOLFSSL_TI_HASH */ + + +#endif /* HAVE_FIPS */ + +WOLFSSL_API int wc_InitSha(wc_Sha*); +WOLFSSL_API int wc_InitSha_ex(wc_Sha* sha, void* heap, int devId); +WOLFSSL_API int wc_ShaUpdate(wc_Sha*, const byte*, word32); +WOLFSSL_API int wc_ShaFinal(wc_Sha*, byte*); +WOLFSSL_API void wc_ShaFree(wc_Sha*); + +WOLFSSL_API int wc_ShaGetHash(wc_Sha*, byte*); +WOLFSSL_API int wc_ShaCopy(wc_Sha*, wc_Sha*); + +#ifdef WOLFSSL_PIC32MZ_HASH +WOLFSSL_API void wc_ShaSizeSet(wc_Sha* sha, word32 len); +#endif + +#ifdef __cplusplus + } /* extern "C" */ +#endif + +#endif /* NO_SHA */ +#endif /* WOLF_CRYPT_SHA_H */ + diff --git a/include/wolfssl/wolfcrypt/sha256.h b/include/wolfssl/wolfcrypt/sha256.h new file mode 100644 index 00000000..2a84253a --- /dev/null +++ b/include/wolfssl/wolfcrypt/sha256.h @@ -0,0 +1,176 @@ +/* sha256.h + * + * Copyright (C) 2006-2017 wolfSSL Inc. All rights reserved. + * + * This file is part of wolfSSL. + * + * Contact licensing@wolfssl.com with any questions or comments. + * + * http://www.wolfssl.com + */ + + + +/* code submitted by raphael.huck@efixo.com */ + +#ifndef WOLF_CRYPT_SHA256_H +#define WOLF_CRYPT_SHA256_H + +#include + +#ifndef NO_SHA256 + +#ifdef HAVE_FIPS + #define wc_Sha256 Sha256 + #define WC_SHA256 SHA256 + #define WC_SHA256_BLOCK_SIZE SHA256_BLOCK_SIZE + #define WC_SHA256_DIGEST_SIZE SHA256_DIGEST_SIZE + #define WC_SHA256_PAD_SIZE SHA256_PAD_SIZE + + #ifdef WOLFSSL_SHA224 + #define wc_Sha224 Sha224 + #define WC_SHA224 SHA224 + #define WC_SHA224_BLOCK_SIZE SHA224_BLOCK_SIZE + #define WC_SHA224_DIGEST_SIZE SHA224_DIGEST_SIZE + #define WC_SHA224_PAD_SIZE SHA224_PAD_SIZE + #endif + + /* for fips @wc_fips */ + #include +#endif + +#ifdef FREESCALE_LTC_SHA + #include "fsl_ltc.h" +#endif + + +#ifdef __cplusplus + extern "C" { +#endif + +#ifndef HAVE_FIPS /* avoid redefinition of structs */ + +#ifdef WOLFSSL_MICROCHIP_PIC32MZ + #include +#endif +#ifdef STM32_HASH + #include +#endif +#ifdef WOLFSSL_ASYNC_CRYPT + #include +#endif + +#if defined(_MSC_VER) + #define SHA256_NOINLINE __declspec(noinline) +#elif defined(__GNUC__) + #define SHA256_NOINLINE __attribute__((noinline)) +#else + #define SHA256_NOINLINE +#endif + +#ifndef NO_OLD_SHA256_NAMES + #define SHA256 WC_SHA256 +#endif +#ifndef NO_OLD_WC_NAMES + #define Sha256 wc_Sha256 + #define SHA256_BLOCK_SIZE WC_SHA256_BLOCK_SIZE + #define SHA256_DIGEST_SIZE WC_SHA256_DIGEST_SIZE + #define SHA256_PAD_SIZE WC_SHA256_PAD_SIZE +#endif + +/* in bytes */ +enum { + WC_SHA256 = 2, /* hash type unique */ + WC_SHA256_BLOCK_SIZE = 64, + WC_SHA256_DIGEST_SIZE = 32, + WC_SHA256_PAD_SIZE = 56 +}; + +#ifdef WOLFSSL_TI_HASH + #include "wolfssl/wolfcrypt/port/ti/ti-hash.h" +#elif defined(WOLFSSL_IMX6_CAAM) + #include "wolfssl/wolfcrypt/port/caam/wolfcaam_sha.h" +#else +/* wc_Sha256 digest */ +typedef struct wc_Sha256 { +#ifdef FREESCALE_LTC_SHA + ltc_hash_ctx_t ctx; +#elif defined(STM32_HASH) + STM32_HASH_Context stmCtx; +#else + /* alignment on digest and buffer speeds up ARMv8 crypto operations */ + ALIGN16 word32 digest[WC_SHA256_DIGEST_SIZE / sizeof(word32)]; + ALIGN16 word32 buffer[WC_SHA256_BLOCK_SIZE / sizeof(word32)]; + word32 buffLen; /* in bytes */ + word32 loLen; /* length in bytes */ + word32 hiLen; /* length in bytes */ + void* heap; +#ifdef USE_INTEL_SPEEDUP + const byte* data; +#endif +#ifdef WOLFSSL_PIC32MZ_HASH + hashUpdCache cache; /* cache for updates */ +#endif +#ifdef WOLFSSL_ASYNC_CRYPT + WC_ASYNC_DEV asyncDev; +#endif /* WOLFSSL_ASYNC_CRYPT */ +#endif +} wc_Sha256; + +#endif + +#endif /* HAVE_FIPS */ + +WOLFSSL_API int wc_InitSha256(wc_Sha256*); +WOLFSSL_API int wc_InitSha256_ex(wc_Sha256*, void*, int); +WOLFSSL_API int wc_Sha256Update(wc_Sha256*, const byte*, word32); +WOLFSSL_API int wc_Sha256Final(wc_Sha256*, byte*); +WOLFSSL_API void wc_Sha256Free(wc_Sha256*); + +WOLFSSL_API int wc_Sha256GetHash(wc_Sha256*, byte*); +WOLFSSL_API int wc_Sha256Copy(wc_Sha256* src, wc_Sha256* dst); + +#ifdef WOLFSSL_PIC32MZ_HASH +WOLFSSL_API void wc_Sha256SizeSet(wc_Sha256*, word32); +#endif + +#ifdef WOLFSSL_SHA224 +#ifndef HAVE_FIPS /* avoid redefinition of structs */ + +#ifndef NO_OLD_WC_NAMES + #define Sha224 wc_Sha224 + #define SHA224 WC_SHA224 + #define SHA224_BLOCK_SIZE WC_SHA224_BLOCK_SIZE + #define SHA224_DIGEST_SIZE WC_SHA224_DIGEST_SIZE + #define SHA224_PAD_SIZE WC_SHA224_PAD_SIZE +#endif + +/* in bytes */ +enum { + WC_SHA224 = 8, /* hash type unique */ + WC_SHA224_BLOCK_SIZE = WC_SHA256_BLOCK_SIZE, + WC_SHA224_DIGEST_SIZE = 28, + WC_SHA224_PAD_SIZE = WC_SHA256_PAD_SIZE +}; + +typedef wc_Sha256 wc_Sha224; +#endif /* HAVE_FIPS */ + +WOLFSSL_API int wc_InitSha224(wc_Sha224*); +WOLFSSL_API int wc_InitSha224_ex(wc_Sha224*, void*, int); +WOLFSSL_API int wc_Sha224Update(wc_Sha224*, const byte*, word32); +WOLFSSL_API int wc_Sha224Final(wc_Sha224*, byte*); +WOLFSSL_API void wc_Sha224Free(wc_Sha224*); + +WOLFSSL_API int wc_Sha224GetHash(wc_Sha224*, byte*); +WOLFSSL_API int wc_Sha224Copy(wc_Sha224* src, wc_Sha224* dst); + +#endif /* WOLFSSL_SHA224 */ + +#ifdef __cplusplus + } /* extern "C" */ +#endif + +#endif /* NO_SHA256 */ +#endif /* WOLF_CRYPT_SHA256_H */ + diff --git a/include/wolfssl/wolfcrypt/wolfmath.h b/include/wolfssl/wolfcrypt/wolfmath.h new file mode 100644 index 00000000..a72818b4 --- /dev/null +++ b/include/wolfssl/wolfcrypt/wolfmath.h @@ -0,0 +1,60 @@ +/* wolfmath.h + * + * Copyright (C) 2006-2017 wolfSSL Inc. All rights reserved. + * + * This file is part of wolfSSL. + * + * Contact licensing@wolfssl.com with any questions or comments. + * + * http://www.wolfssl.com + */ + + +#if defined(HAVE_WOLF_BIGINT) && !defined(WOLF_BIGINT_DEFINED) + /* raw big integer */ + typedef struct WC_BIGINT { + byte* buf; + word32 len; + void* heap; + } WC_BIGINT; + + #define WOLF_BIGINT_DEFINED +#endif + + +/* only define functions if mp_int has been declared */ +#ifdef MP_INT_DEFINED + +#ifndef __WOLFMATH_H__ +#define __WOLFMATH_H__ + + /* timing resistance array */ + #if !defined(WC_NO_CACHE_RESISTANT) && \ + ((defined(HAVE_ECC) && defined(ECC_TIMING_RESISTANT)) || \ + (defined(USE_FAST_MATH) && defined(TFM_TIMING_RESISTANT))) + + extern const wolfssl_word wc_off_on_addr[2]; + #endif + + /* common math functions */ + int get_digit_count(mp_int* a); + mp_digit get_digit(mp_int* a, int n); + int get_rand_digit(WC_RNG* rng, mp_digit* d); + int mp_rand(mp_int* a, int digits, WC_RNG* rng); + + + #ifdef HAVE_WOLF_BIGINT + void wc_bigint_init(WC_BIGINT* a); + int wc_bigint_alloc(WC_BIGINT* a, word32 sz); + int wc_bigint_from_unsigned_bin(WC_BIGINT* a, const byte* in, word32 inlen); + int wc_bigint_to_unsigned_bin(WC_BIGINT* a, byte* out, word32* outlen); + void wc_bigint_zero(WC_BIGINT* a); + void wc_bigint_free(WC_BIGINT* a); + + int wc_mp_to_bigint(mp_int* src, WC_BIGINT* dst); + int wc_bigint_to_mp(WC_BIGINT* src, mp_int* dst); + #endif /* HAVE_WOLF_BIGINT */ + +#endif /* __WOLFMATH_H__ */ + +#endif /* MP_INT_DEFINED */ diff --git a/lib/libwolfssl.a b/lib/libwolfssl.a index 9f20965738310b5d7ad17a1ed8dd567ac009a596..1feb160dc589d5e61a201715efac3b7b6922ec09 100644 GIT binary patch delta 296539 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 delta 254275 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�~L| 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