summaryrefslogtreecommitdiff
path: root/src/ltc/headers
diff options
context:
space:
mode:
Diffstat (limited to 'src/ltc/headers')
-rw-r--r--src/ltc/headers/tomcrypt_cfg.h16
-rw-r--r--src/ltc/headers/tomcrypt_cipher.h44
-rw-r--r--src/ltc/headers/tomcrypt_custom.h15
-rw-r--r--src/ltc/headers/tomcrypt_hash.h3
-rw-r--r--src/ltc/headers/tomcrypt_mac.h30
-rw-r--r--src/ltc/headers/tomcrypt_macros.h37
-rw-r--r--src/ltc/headers/tomcrypt_math.h6
-rw-r--r--src/ltc/headers/tomcrypt_misc.h7
-rw-r--r--src/ltc/headers/tomcrypt_pk.h92
-rw-r--r--src/ltc/headers/tomcrypt_private.h50
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);