diff options
Diffstat (limited to 'src/ltc/headers')
-rw-r--r-- | src/ltc/headers/tomcrypt_cfg.h | 16 | ||||
-rw-r--r-- | src/ltc/headers/tomcrypt_cipher.h | 44 | ||||
-rw-r--r-- | src/ltc/headers/tomcrypt_custom.h | 15 | ||||
-rw-r--r-- | src/ltc/headers/tomcrypt_hash.h | 3 | ||||
-rw-r--r-- | src/ltc/headers/tomcrypt_mac.h | 30 | ||||
-rw-r--r-- | src/ltc/headers/tomcrypt_macros.h | 37 | ||||
-rw-r--r-- | src/ltc/headers/tomcrypt_math.h | 6 | ||||
-rw-r--r-- | src/ltc/headers/tomcrypt_misc.h | 7 | ||||
-rw-r--r-- | src/ltc/headers/tomcrypt_pk.h | 92 | ||||
-rw-r--r-- | src/ltc/headers/tomcrypt_private.h | 50 |
10 files changed, 200 insertions, 100 deletions
diff --git a/src/ltc/headers/tomcrypt_cfg.h b/src/ltc/headers/tomcrypt_cfg.h index 994a084b..2a024aa4 100644 --- a/src/ltc/headers/tomcrypt_cfg.h +++ b/src/ltc/headers/tomcrypt_cfg.h @@ -3,7 +3,7 @@ /* This is the build config file. * - * With this you can setup what to inlcude/exclude automatically during any build. Just comment + * With this you can setup what to include/exclude automatically during any build. Just comment * out the line that #define's the word for the thing you want to remove. phew! */ @@ -91,6 +91,11 @@ LTC_EXPORT int LTC_CALL XSTRCMP(const char *s1, const char *s2); #define ENDIAN_LITTLE #define ENDIAN_64BITWORD #define LTC_FAST + #if defined(__SSE4_1__) + #if __SSE4_1__ == 1 + #define LTC_AMD64_SSE4_1 + #endif + #endif #endif /* detect PPC32 */ @@ -295,6 +300,15 @@ typedef unsigned long ltc_mp_digit; #define LTC_ALIGN(n) #endif +/* Define `LTC_NO_NULL_TERMINATION_CHECK` in the user code + * before including `tomcrypt.h` to disable this functionality. + */ +#if defined(__GNUC__) && __GNUC__ >= 4 && !defined(LTC_NO_NULL_TERMINATION_CHECK) +# define LTC_NULL_TERMINATED __attribute__((sentinel)) +#else +# define LTC_NULL_TERMINATED +#endif + #if defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__ >= 405) # define LTC_DEPRECATED(s) __attribute__((deprecated("replaced by " #s))) # define PRIVATE_LTC_DEPRECATED_PRAGMA(s) _Pragma(#s) diff --git a/src/ltc/headers/tomcrypt_cipher.h b/src/ltc/headers/tomcrypt_cipher.h index a3ba8f30..06e61247 100644 --- a/src/ltc/headers/tomcrypt_cipher.h +++ b/src/ltc/headers/tomcrypt_cipher.h @@ -35,8 +35,10 @@ struct saferp_key { #ifdef LTC_RIJNDAEL struct rijndael_key { - ulong32 eK[60], dK[60]; + ulong32 *eK; + ulong32 *dK; int Nr; + unsigned char K[(60 + 60 + 4) * sizeof(ulong32)]; }; #endif @@ -688,18 +690,19 @@ extern const struct ltc_cipher_descriptor safer_k64_desc, safer_k128_desc, safer #endif #ifdef LTC_RIJNDAEL - -/* make aes an alias */ -#define aes_setup rijndael_setup -#define aes_ecb_encrypt rijndael_ecb_encrypt -#define aes_ecb_decrypt rijndael_ecb_decrypt -#define aes_test rijndael_test -#define aes_done rijndael_done -#define aes_keysize rijndael_keysize - -#define aes_enc_setup rijndael_enc_setup -#define aes_enc_ecb_encrypt rijndael_enc_ecb_encrypt -#define aes_enc_keysize rijndael_enc_keysize +/* declare aes properly now */ +int aes_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey); +int aes_ecb_encrypt(const unsigned char *pt, unsigned char *ct, const symmetric_key *skey); +int aes_ecb_decrypt(const unsigned char *ct, unsigned char *pt, const symmetric_key *skey); +int aes_test(void); +void aes_done(symmetric_key *skey); +int aes_keysize(int *keysize); +int aes_enc_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey); +int aes_enc_ecb_encrypt(const unsigned char *pt, unsigned char *ct, const symmetric_key *skey); +void aes_enc_done(symmetric_key *skey); +int aes_enc_keysize(int *keysize); +extern const struct ltc_cipher_descriptor aes_desc; +extern const struct ltc_cipher_descriptor aes_enc_desc; int rijndael_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey); int rijndael_ecb_encrypt(const unsigned char *pt, unsigned char *ct, const symmetric_key *skey); @@ -711,8 +714,19 @@ int rijndael_enc_setup(const unsigned char *key, int keylen, int num_rounds, sym int rijndael_enc_ecb_encrypt(const unsigned char *pt, unsigned char *ct, const symmetric_key *skey); void rijndael_enc_done(symmetric_key *skey); int rijndael_enc_keysize(int *keysize); -extern const struct ltc_cipher_descriptor rijndael_desc, aes_desc; -extern const struct ltc_cipher_descriptor rijndael_enc_desc, aes_enc_desc; +extern const struct ltc_cipher_descriptor rijndael_desc; +extern const struct ltc_cipher_descriptor rijndael_enc_desc; +#endif + +#if defined(LTC_AES_NI) && defined(LTC_AMD64_SSE4_1) +int aesni_is_supported(void); +int aesni_setup(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey); +int aesni_ecb_encrypt(const unsigned char *pt, unsigned char *ct, const symmetric_key *skey); +int aesni_ecb_decrypt(const unsigned char *ct, unsigned char *pt, const symmetric_key *skey); +int aesni_test(void); +void aesni_done(symmetric_key *skey); +int aesni_keysize(int *keysize); +extern const struct ltc_cipher_descriptor aesni_desc; #endif #ifdef LTC_XTEA diff --git a/src/ltc/headers/tomcrypt_custom.h b/src/ltc/headers/tomcrypt_custom.h index b13c2e08..f0a65fef 100644 --- a/src/ltc/headers/tomcrypt_custom.h +++ b/src/ltc/headers/tomcrypt_custom.h @@ -114,7 +114,7 @@ #define LTC_NO_MISC #define LTC_BASE64 -#endif +#endif /* LTC_EASY */ /* The minimal set of functionality to run the tests */ #ifdef LTC_MINIMAL @@ -129,7 +129,7 @@ #define LTC_TRY_URANDOM_FIRST #undef LTC_NO_FILE -#endif +#endif /* LTC_MINIMAL */ /* Enable self-test test vector checking */ #ifndef LTC_NO_TEST @@ -179,6 +179,7 @@ #define LTC_RC6 #define LTC_SAFERP #define LTC_RIJNDAEL +#define LTC_AES_NI #define LTC_XTEA /* _TABLES tells it to use tables during setup, _SMALL means to use the smaller scheduled key format * (saves 4KB of ram), _ALL_TABLES enables all tables during setup */ @@ -357,7 +358,7 @@ #define LTC_YARROW_AES 2 #endif -#endif +#endif /* LTC_YARROW */ #ifdef LTC_FORTUNA @@ -553,7 +554,7 @@ #define LTC_ECC_SECP384R1 #define LTC_ECC_SECP521R1 #endif -#endif +#endif /* LTC_MECC */ #if defined(LTC_DER) #ifndef LTC_DER_MAX_RECURSION @@ -690,15 +691,13 @@ #define LTC_MUTEX_UNLOCK(x) #define LTC_MUTEX_DESTROY(x) -#endif +#endif /* LTC_PTHREAD */ /* Debuggers */ /* define this if you use Valgrind, note: it CHANGES the way SOBER-128 and RC4 work (see the code) */ /* #define LTC_VALGRIND */ -#endif - #ifndef LTC_NO_FILE /* buffer size for reading from a file via fread(..) */ #ifndef LTC_FILE_READ_BUFSIZE @@ -739,3 +738,5 @@ #define LTC_ECC_SECP521R1 #undef LTC_ECC521 #endif + +#endif /* TOMCRYPT_CUSTOM_H_ */ diff --git a/src/ltc/headers/tomcrypt_hash.h b/src/ltc/headers/tomcrypt_hash.h index 4eb07126..3c4bcf5a 100644 --- a/src/ltc/headers/tomcrypt_hash.h +++ b/src/ltc/headers/tomcrypt_hash.h @@ -494,7 +494,8 @@ int hash_memory(int hash, const unsigned char *in, unsigned long inlen, unsigned char *out, unsigned long *outlen); int hash_memory_multi(int hash, unsigned char *out, unsigned long *outlen, - const unsigned char *in, unsigned long inlen, ...); + const unsigned char *in, unsigned long inlen, ...) + LTC_NULL_TERMINATED; #ifndef LTC_NO_FILE int hash_filehandle(int hash, FILE *in, unsigned char *out, unsigned long *outlen); diff --git a/src/ltc/headers/tomcrypt_mac.h b/src/ltc/headers/tomcrypt_mac.h index 549903c2..c8f4a322 100644 --- a/src/ltc/headers/tomcrypt_mac.h +++ b/src/ltc/headers/tomcrypt_mac.h @@ -19,7 +19,8 @@ int hmac_memory(int hash, int hmac_memory_multi(int hash, const unsigned char *key, unsigned long keylen, unsigned char *out, unsigned long *outlen, - const unsigned char *in, unsigned long inlen, ...); + const unsigned char *in, unsigned long inlen, ...) + LTC_NULL_TERMINATED; int hmac_file(int hash, const char *fname, const unsigned char *key, unsigned long keylen, unsigned char *out, unsigned long *outlen); @@ -47,7 +48,8 @@ int omac_memory(int cipher, int omac_memory_multi(int cipher, const unsigned char *key, unsigned long keylen, unsigned char *out, unsigned long *outlen, - const unsigned char *in, unsigned long inlen, ...); + const unsigned char *in, unsigned long inlen, ...) + LTC_NULL_TERMINATED; int omac_file(int cipher, const unsigned char *key, unsigned long keylen, const char *filename, @@ -83,7 +85,8 @@ int pmac_memory(int cipher, int pmac_memory_multi(int cipher, const unsigned char *key, unsigned long keylen, unsigned char *out, unsigned long *outlen, - const unsigned char *in, unsigned long inlen, ...); + const unsigned char *in, unsigned long inlen, ...) + LTC_NULL_TERMINATED; int pmac_file(int cipher, const unsigned char *key, unsigned long keylen, @@ -112,7 +115,10 @@ int poly1305_init(poly1305_state *st, const unsigned char *key, unsigned long ke int poly1305_process(poly1305_state *st, const unsigned char *in, unsigned long inlen); int poly1305_done(poly1305_state *st, unsigned char *mac, unsigned long *maclen); int poly1305_memory(const unsigned char *key, unsigned long keylen, const unsigned char *in, unsigned long inlen, unsigned char *mac, unsigned long *maclen); -int poly1305_memory_multi(const unsigned char *key, unsigned long keylen, unsigned char *mac, unsigned long *maclen, const unsigned char *in, unsigned long inlen, ...); +int poly1305_memory_multi(const unsigned char *key, unsigned long keylen, + unsigned char *mac, unsigned long *maclen, + const unsigned char *in, unsigned long inlen, ...) + LTC_NULL_TERMINATED; int poly1305_file(const char *fname, const unsigned char *key, unsigned long keylen, unsigned char *mac, unsigned long *maclen); int poly1305_test(void); #endif /* LTC_POLY1305 */ @@ -123,7 +129,10 @@ int blake2smac_init(blake2smac_state *st, unsigned long outlen, const unsigned c int blake2smac_process(blake2smac_state *st, const unsigned char *in, unsigned long inlen); int blake2smac_done(blake2smac_state *st, unsigned char *mac, unsigned long *maclen); int blake2smac_memory(const unsigned char *key, unsigned long keylen, const unsigned char *in, unsigned long inlen, unsigned char *mac, unsigned long *maclen); -int blake2smac_memory_multi(const unsigned char *key, unsigned long keylen, unsigned char *mac, unsigned long *maclen, const unsigned char *in, unsigned long inlen, ...); +int blake2smac_memory_multi(const unsigned char *key, unsigned long keylen, + unsigned char *mac, unsigned long *maclen, + const unsigned char *in, unsigned long inlen, ...) + LTC_NULL_TERMINATED; int blake2smac_file(const char *fname, const unsigned char *key, unsigned long keylen, unsigned char *mac, unsigned long *maclen); int blake2smac_test(void); #endif /* LTC_BLAKE2SMAC */ @@ -134,7 +143,10 @@ int blake2bmac_init(blake2bmac_state *st, unsigned long outlen, const unsigned c int blake2bmac_process(blake2bmac_state *st, const unsigned char *in, unsigned long inlen); int blake2bmac_done(blake2bmac_state *st, unsigned char *mac, unsigned long *maclen); int blake2bmac_memory(const unsigned char *key, unsigned long keylen, const unsigned char *in, unsigned long inlen, unsigned char *mac, unsigned long *maclen); -int blake2bmac_memory_multi(const unsigned char *key, unsigned long keylen, unsigned char *mac, unsigned long *maclen, const unsigned char *in, unsigned long inlen, ...); +int blake2bmac_memory_multi(const unsigned char *key, unsigned long keylen, + unsigned char *mac, unsigned long *maclen, + const unsigned char *in, unsigned long inlen, ...) + LTC_NULL_TERMINATED; int blake2bmac_file(const char *fname, const unsigned char *key, unsigned long keylen, unsigned char *mac, unsigned long *maclen); int blake2bmac_test(void); #endif /* LTC_BLAKE2BMAC */ @@ -186,7 +198,8 @@ int xcbc_memory(int cipher, int xcbc_memory_multi(int cipher, const unsigned char *key, unsigned long keylen, unsigned char *out, unsigned long *outlen, - const unsigned char *in, unsigned long inlen, ...); + const unsigned char *in, unsigned long inlen, ...) + LTC_NULL_TERMINATED; int xcbc_file(int cipher, const unsigned char *key, unsigned long keylen, const char *filename, @@ -220,7 +233,8 @@ int f9_memory(int cipher, int f9_memory_multi(int cipher, const unsigned char *key, unsigned long keylen, unsigned char *out, unsigned long *outlen, - const unsigned char *in, unsigned long inlen, ...); + const unsigned char *in, unsigned long inlen, ...) + LTC_NULL_TERMINATED; int f9_file(int cipher, const unsigned char *key, unsigned long keylen, const char *fname, diff --git a/src/ltc/headers/tomcrypt_macros.h b/src/ltc/headers/tomcrypt_macros.h index 94aa7c32..257f5238 100644 --- a/src/ltc/headers/tomcrypt_macros.h +++ b/src/ltc/headers/tomcrypt_macros.h @@ -1,6 +1,11 @@ /* LibTomCrypt, modular cryptographic library -- Tom St Denis */ /* SPDX-License-Identifier: Unlicense */ + +#define LTC_TMPVAR__(n, l) n ## l +#define LTC_TMPVAR_(n, l) LTC_TMPVAR__(n, l) +#define LTC_TMPVAR(n) LTC_TMPVAR_(LTC_ ## n ## _, __LINE__) + /* ---- HELPER MACROS ---- */ #ifdef ENDIAN_NEUTRAL @@ -275,20 +280,20 @@ static inline ulong32 ROR(ulong32 word, int i) #ifndef LTC_NO_ROLC #define ROLc(word,i) ({ \ - ulong32 ROLc_tmp = (word); \ + ulong32 LTC_TMPVAR(ROLc) = (word); \ __asm__ ("roll %2, %0" : \ - "=r" (ROLc_tmp) : \ - "0" (ROLc_tmp), \ + "=r" (LTC_TMPVAR(ROLc)) : \ + "0" (LTC_TMPVAR(ROLc)), \ "I" (i)); \ - ROLc_tmp; \ + LTC_TMPVAR(ROLc); \ }) #define RORc(word,i) ({ \ - ulong32 RORc_tmp = (word); \ + ulong32 LTC_TMPVAR(RORc) = (word); \ __asm__ ("rorl %2, %0" : \ - "=r" (RORc_tmp) : \ - "0" (RORc_tmp), \ + "=r" (LTC_TMPVAR(RORc)) : \ + "0" (LTC_TMPVAR(RORc)), \ "I" (i)); \ - RORc_tmp; \ + LTC_TMPVAR(RORc); \ }) #else @@ -393,20 +398,20 @@ static inline ulong64 ROR64(ulong64 word, int i) #ifndef LTC_NO_ROLC #define ROL64c(word,i) ({ \ - ulong64 ROL64c_tmp = word; \ + ulong64 LTC_TMPVAR(ROL64c) = word; \ __asm__ ("rolq %2, %0" : \ - "=r" (ROL64c_tmp) : \ - "0" (ROL64c_tmp), \ + "=r" (LTC_TMPVAR(ROL64c)) : \ + "0" (LTC_TMPVAR(ROL64c)), \ "J" (i)); \ - ROL64c_tmp; \ + LTC_TMPVAR(ROL64c); \ }) #define ROR64c(word,i) ({ \ - ulong64 ROR64c_tmp = word; \ + ulong64 LTC_TMPVAR(ROR64c) = word; \ __asm__ ("rorq %2, %0" : \ - "=r" (ROR64c_tmp) : \ - "0" (ROR64c_tmp), \ + "=r" (LTC_TMPVAR(ROR64c)) : \ + "0" (LTC_TMPVAR(ROR64c)), \ "J" (i)); \ - ROR64c_tmp; \ + LTC_TMPVAR(ROR64c); \ }) #else /* LTC_NO_ROLC */ diff --git a/src/ltc/headers/tomcrypt_math.h b/src/ltc/headers/tomcrypt_math.h index bb49915f..b7dedf6b 100644 --- a/src/ltc/headers/tomcrypt_math.h +++ b/src/ltc/headers/tomcrypt_math.h @@ -502,9 +502,9 @@ typedef struct { extern ltc_math_descriptor ltc_mp; -int ltc_init_multi(void **a, ...); -void ltc_deinit_multi(void *a, ...); -void ltc_cleanup_multi(void **a, ...); +int ltc_init_multi(void **a, ...) LTC_NULL_TERMINATED; +void ltc_deinit_multi(void *a, ...) LTC_NULL_TERMINATED; +void ltc_cleanup_multi(void **a, ...) LTC_NULL_TERMINATED; #ifdef LTM_DESC extern const ltc_math_descriptor ltm_desc; diff --git a/src/ltc/headers/tomcrypt_misc.h b/src/ltc/headers/tomcrypt_misc.h index ae861fe3..3a2b7b12 100644 --- a/src/ltc/headers/tomcrypt_misc.h +++ b/src/ltc/headers/tomcrypt_misc.h @@ -93,7 +93,7 @@ const char *error_to_string(int err); extern const char *crypt_build_settings; /* ---- HMM ---- */ -int crypt_fsa(void *mp, ...); +int crypt_fsa(void *mp, ...) LTC_NULL_TERMINATED; /* ---- Dynamic language support ---- */ int crypt_get_constant(const char* namein, int *valueout); @@ -146,6 +146,7 @@ enum padding_type { LTC_PAD_ISO_10126 = 0x1000U, #endif LTC_PAD_ANSI_X923 = 0x2000U, + LTC_PAD_SSH = 0x3000U, /* The following padding modes don't contain the padding * length as last byte of the padding. */ @@ -171,8 +172,8 @@ typedef enum ssh_data_type_ { } ssh_data_type; /* VA list handy helpers with tuples of <type, data> */ -int ssh_encode_sequence_multi(unsigned char *out, unsigned long *outlen, ...); -int ssh_decode_sequence_multi(const unsigned char *in, unsigned long *inlen, ...); +int ssh_encode_sequence_multi(unsigned char *out, unsigned long *outlen, ...) LTC_NULL_TERMINATED; +int ssh_decode_sequence_multi(const unsigned char *in, unsigned long *inlen, ...) LTC_NULL_TERMINATED; #endif /* LTC_SSH */ int compare_testvector(const void* is, const unsigned long is_len, const void* should, const unsigned long should_len, const char* what, int which); diff --git a/src/ltc/headers/tomcrypt_pk.h b/src/ltc/headers/tomcrypt_pk.h index 167789e4..903e118d 100644 --- a/src/ltc/headers/tomcrypt_pk.h +++ b/src/ltc/headers/tomcrypt_pk.h @@ -355,13 +355,31 @@ int ed25519_import_pkcs8(const unsigned char *in, unsigned long inlen, const void *pwd, unsigned long pwdlen, curve25519_key *key); -int ed25519_sign(const unsigned char *msg, unsigned long msglen, - unsigned char *sig, unsigned long *siglen, +int ed25519_sign(const unsigned char *msg, unsigned long msglen, + unsigned char *sig, unsigned long *siglen, const curve25519_key *private_key); - +int ed25519ctx_sign(const unsigned char *msg, unsigned long msglen, + unsigned char *sig, unsigned long *siglen, + const unsigned char *ctx, unsigned long ctxlen, + const curve25519_key *private_key); +int ed25519ph_sign(const unsigned char *msg, unsigned long msglen, + unsigned char *sig, unsigned long *siglen, + const unsigned char *ctx, unsigned long ctxlen, + const curve25519_key *private_key); int ed25519_verify(const unsigned char *msg, unsigned long msglen, const unsigned char *sig, unsigned long siglen, - int *stat, const curve25519_key *public_key); + int *stat, + const curve25519_key *public_key); +int ed25519ctx_verify(const unsigned char *msg, unsigned long msglen, + const unsigned char *sig, unsigned long siglen, + const unsigned char *ctx, unsigned long ctxlen, + int *stat, + const curve25519_key *public_key); +int ed25519ph_verify(const unsigned char *msg, unsigned long msglen, + const unsigned char *sig, unsigned long siglen, + const unsigned char *ctx, unsigned long ctxlen, + int *stat, + const curve25519_key *public_key); /** X25519 Key-Exchange API */ int x25519_make_key(prng_state *prng, int wprng, curve25519_key *key); @@ -530,43 +548,43 @@ typedef struct ltc_asn1_list_ { struct ltc_asn1_list_ *prev, *next, *child, *parent; } ltc_asn1_list; -#define LTC_SET_ASN1(list, index, Type, Data, Size) \ - do { \ - int LTC_MACRO_temp = (index); \ - ltc_asn1_list *LTC_MACRO_list = (list); \ - LTC_MACRO_list[LTC_MACRO_temp].type = (Type); \ - LTC_MACRO_list[LTC_MACRO_temp].data = (void*)(Data); \ - LTC_MACRO_list[LTC_MACRO_temp].size = (Size); \ - LTC_MACRO_list[LTC_MACRO_temp].used = 0; \ - LTC_MACRO_list[LTC_MACRO_temp].optional = 0; \ - LTC_MACRO_list[LTC_MACRO_temp].klass = 0; \ - LTC_MACRO_list[LTC_MACRO_temp].pc = 0; \ - LTC_MACRO_list[LTC_MACRO_temp].tag = 0; \ +#define LTC_SET_ASN1(list, index, Type, Data, Size) \ + do { \ + int LTC_TMPVAR(SA) = (index); \ + ltc_asn1_list *LTC_TMPVAR(SA_list) = (list); \ + LTC_TMPVAR(SA_list)[LTC_TMPVAR(SA)].type = (Type); \ + LTC_TMPVAR(SA_list)[LTC_TMPVAR(SA)].data = (void*)(Data); \ + LTC_TMPVAR(SA_list)[LTC_TMPVAR(SA)].size = (Size); \ + LTC_TMPVAR(SA_list)[LTC_TMPVAR(SA)].used = 0; \ + LTC_TMPVAR(SA_list)[LTC_TMPVAR(SA)].optional = 0; \ + LTC_TMPVAR(SA_list)[LTC_TMPVAR(SA)].klass = 0; \ + LTC_TMPVAR(SA_list)[LTC_TMPVAR(SA)].pc = 0; \ + LTC_TMPVAR(SA_list)[LTC_TMPVAR(SA)].tag = 0; \ } while (0) -#define LTC_SET_ASN1_IDENTIFIER(list, index, Class, Pc, Tag) \ - do { \ - int LTC_MACRO_temp = (index); \ - ltc_asn1_list *LTC_MACRO_list = (list); \ - LTC_MACRO_list[LTC_MACRO_temp].type = LTC_ASN1_CUSTOM_TYPE; \ - LTC_MACRO_list[LTC_MACRO_temp].klass = (Class); \ - LTC_MACRO_list[LTC_MACRO_temp].pc = (Pc); \ - LTC_MACRO_list[LTC_MACRO_temp].tag = (Tag); \ +#define LTC_SET_ASN1_IDENTIFIER(list, index, Class, Pc, Tag) \ + do { \ + int LTC_TMPVAR(SAI) = (index); \ + ltc_asn1_list *LTC_TMPVAR(SAI_list) = (list); \ + LTC_TMPVAR(SAI_list)[LTC_TMPVAR(SAI)].type = LTC_ASN1_CUSTOM_TYPE; \ + LTC_TMPVAR(SAI_list)[LTC_TMPVAR(SAI)].klass = (Class); \ + LTC_TMPVAR(SAI_list)[LTC_TMPVAR(SAI)].pc = (Pc); \ + LTC_TMPVAR(SAI_list)[LTC_TMPVAR(SAI)].tag = (Tag); \ } while (0) -#define LTC_SET_ASN1_CUSTOM_CONSTRUCTED(list, index, Class, Tag, Data) \ - do { \ - int LTC_MACRO_temp##__LINE__ = (index); \ - LTC_SET_ASN1(list, LTC_MACRO_temp##__LINE__, LTC_ASN1_CUSTOM_TYPE, Data, 1); \ - LTC_SET_ASN1_IDENTIFIER(list, LTC_MACRO_temp##__LINE__, Class, LTC_ASN1_PC_CONSTRUCTED, Tag); \ +#define LTC_SET_ASN1_CUSTOM_CONSTRUCTED(list, index, Class, Tag, Data) \ + do { \ + int LTC_TMPVAR(SACC) = (index); \ + LTC_SET_ASN1(list, LTC_TMPVAR(SACC), LTC_ASN1_CUSTOM_TYPE, Data, 1); \ + LTC_SET_ASN1_IDENTIFIER(list, LTC_TMPVAR(SACC), Class, LTC_ASN1_PC_CONSTRUCTED, Tag); \ } while (0) -#define LTC_SET_ASN1_CUSTOM_PRIMITIVE(list, index, Class, Tag, Type, Data, Size) \ - do { \ - int LTC_MACRO_temp##__LINE__ = (index); \ - LTC_SET_ASN1(list, LTC_MACRO_temp##__LINE__, LTC_ASN1_CUSTOM_TYPE, Data, Size); \ - LTC_SET_ASN1_IDENTIFIER(list, LTC_MACRO_temp##__LINE__, Class, LTC_ASN1_PC_PRIMITIVE, Tag); \ - list[LTC_MACRO_temp##__LINE__].used = (int)(Type); \ +#define LTC_SET_ASN1_CUSTOM_PRIMITIVE(list, index, Class, Tag, Type, Data, Size) \ + do { \ + int LTC_TMPVAR(SACP) = (index); \ + LTC_SET_ASN1(list, LTC_TMPVAR(SACP), LTC_ASN1_CUSTOM_TYPE, Data, Size); \ + LTC_SET_ASN1_IDENTIFIER(list, LTC_TMPVAR(SACP), Class, LTC_ASN1_PC_PRIMITIVE, Tag); \ + list[LTC_TMPVAR(SACP)].used = (int)(Type); \ } while (0) extern const char* der_asn1_class_to_string_map[]; @@ -636,8 +654,8 @@ int der_encode_setof(const ltc_asn1_list *list, unsigned long inlen, unsigned char *out, unsigned long *outlen); /* VA list handy helpers with triplets of <type, size, data> */ -int der_encode_sequence_multi(unsigned char *out, unsigned long *outlen, ...); -int der_decode_sequence_multi(const unsigned char *in, unsigned long inlen, ...); +int der_encode_sequence_multi(unsigned char *out, unsigned long *outlen, ...) LTC_NULL_TERMINATED; +int der_decode_sequence_multi(const unsigned char *in, unsigned long inlen, ...) LTC_NULL_TERMINATED; /* FLEXI DECODER handle unknown list decoder */ int der_decode_sequence_flexi(const unsigned char *in, unsigned long *inlen, ltc_asn1_list **out); diff --git a/src/ltc/headers/tomcrypt_private.h b/src/ltc/headers/tomcrypt_private.h index 7c1e1724..aa251e2a 100644 --- a/src/ltc/headers/tomcrypt_private.h +++ b/src/ltc/headers/tomcrypt_private.h @@ -9,17 +9,25 @@ #define LTC_PAD_MASK (0xF000U) +/* `NULL` as defined by the standard is not guaranteed to be of a pointer + * type. In order to make sure that in vararg API's a pointer type is used, + * define our own version and use that one internally. + */ +#ifndef LTC_NULL + #define LTC_NULL ((void *)0) +#endif + /* * Internal Enums */ enum ltc_oid_id { - PKA_RSA, - PKA_DSA, - PKA_EC, - PKA_EC_PRIMEF, - PKA_X25519, - PKA_ED25519, + LTC_OID_RSA, + LTC_OID_DSA, + LTC_OID_EC, + LTC_OID_EC_PRIMEF, + LTC_OID_X25519, + LTC_OID_ED25519, }; /* @@ -69,6 +77,10 @@ typedef struct /* tomcrypt_cipher.h */ +#if defined(LTC_AES_NI) && defined(LTC_AMD64_SSE4_1) +#define LTC_HAS_AES_NI +#endif + void blowfish_enc(ulong32 *data, unsigned long blocks, const symmetric_key *skey); int blowfish_expand(const unsigned char *key, int keylen, const unsigned char *data, int datalen, @@ -90,7 +102,8 @@ int func_name (hash_state * md, const unsigned char *in, unsigned long inlen) if (md-> state_var .curlen > sizeof(md-> state_var .buf)) { \ return CRYPT_INVALID_ARG; \ } \ - if ((md-> state_var .length + inlen * 8) < md-> state_var .length) { \ + if (((md-> state_var .length + inlen * 8) < md-> state_var .length) \ + || ((inlen * 8) < inlen)) { \ return CRYPT_HASH_OVERFLOW; \ } \ while (inlen > 0) { \ @@ -202,6 +215,17 @@ void ocb3_int_xor_blocks(unsigned char *out, const unsigned char *block_a, const /* tomcrypt_misc.h */ +typedef enum { + /** Use `\r\n` as line separator */ + BASE64_PEM_CRLF = 1, + /** Create output with 72 chars line length */ + BASE64_PEM_SSH = 2, +} base64_pem_flags; + +int base64_encode_pem(const unsigned char *in, unsigned long inlen, + char *out, unsigned long *outlen, + unsigned int flags); + void copy_or_zeromem(const unsigned char* src, unsigned char* dest, unsigned long len, int coz); int pbes_decrypt(const pbes_arg *arg, unsigned char *dec_data, unsigned long *dec_size); @@ -225,6 +249,7 @@ int rsa_init(rsa_key *key); void rsa_shrink_key(rsa_key *key); int rsa_make_key_bn_e(prng_state *prng, int wprng, int size, void *e, rsa_key *key); /* used by op-tee */ +int rsa_import_pkcs1(const unsigned char *in, unsigned long inlen, rsa_key *key); #endif /* LTC_MRSA */ /* ---- DH Routines ---- */ @@ -318,16 +343,19 @@ int dsa_int_validate_primes(const dsa_key *key, int *stat); int tweetnacl_crypto_sign( unsigned char *sm,unsigned long long *smlen, const unsigned char *m,unsigned long long mlen, - const unsigned char *sk, const unsigned char *pk); + const unsigned char *sk,const unsigned char *pk, + const unsigned char *ctx,unsigned long long cs); int tweetnacl_crypto_sign_open( int *stat, unsigned char *m,unsigned long long *mlen, const unsigned char *sm,unsigned long long smlen, + const unsigned char *ctx, unsigned long long cs, const unsigned char *pk); int tweetnacl_crypto_sign_keypair(prng_state *prng, int wprng, unsigned char *pk,unsigned char *sk); int tweetnacl_crypto_sk_to_pk(unsigned char *pk, const unsigned char *sk); int tweetnacl_crypto_scalarmult(unsigned char *q, const unsigned char *n, const unsigned char *p); int tweetnacl_crypto_scalarmult_base(unsigned char *q,const unsigned char *n); +int tweetnacl_crypto_ph(unsigned char *out, const unsigned char *msg, unsigned long long msglen); typedef int (*sk_to_pk)(unsigned char *pk ,const unsigned char *sk); int ec25519_import_pkcs8(const unsigned char *in, unsigned long inlen, @@ -337,6 +365,9 @@ int ec25519_import_pkcs8(const unsigned char *in, unsigned long inlen, int ec25519_export( unsigned char *out, unsigned long *outlen, int which, const curve25519_key *key); +int ec25519_crypto_ctx( unsigned char *out, unsigned long *outlen, + unsigned char flag, + const unsigned char *ctx, unsigned long ctxlen); #endif /* LTC_CURVE25519 */ #ifdef LTC_DER @@ -365,7 +396,8 @@ extern const unsigned long der_asn1_tag_to_type_map_sz; extern const int der_asn1_type_to_identifier_map[]; extern const unsigned long der_asn1_type_to_identifier_map_sz; -int der_decode_sequence_multi_ex(const unsigned char *in, unsigned long inlen, unsigned int flags, ...); +int der_decode_sequence_multi_ex(const unsigned char *in, unsigned long inlen, unsigned int flags, ...) + LTC_NULL_TERMINATED; int der_teletex_char_encode(int c); int der_teletex_value_decode(int v); |