1 /* LibTomCrypt, modular cryptographic library -- Tom St Denis */
2 /* SPDX-License-Identifier: Unlicense */
10 #define LTC_PAD_MASK (0xF000U)
31 const char *name
, *base
, *prime
;
35 typedef int (*fn_kdf_t
)(const unsigned char *password
, unsigned long password_len
,
36 const unsigned char *salt
, unsigned long salt_len
,
37 int iteration_count
, int hash_idx
,
38 unsigned char *out
, unsigned long *outlen
);
48 /* not used for pbkdf2 */
49 unsigned long blocklen
;
57 ltc_asn1_list
*enc_data
;
60 unsigned long iterations
;
61 /* only used for RC2 */
62 unsigned long key_bits
;
70 /* tomcrypt_cipher.h */
72 void blowfish_enc(ulong32
*data
, unsigned long blocks
, const symmetric_key
*skey
);
73 int blowfish_expand(const unsigned char *key
, int keylen
,
74 const unsigned char *data
, int datalen
,
76 int blowfish_setup_with_data(const unsigned char *key
, int keylen
,
77 const unsigned char *data
, int datalen
,
82 /* a simple macro for making hash "process" functions */
83 #define HASH_PROCESS(func_name, compress_name, state_var, block_size) \
84 int func_name (hash_state * md, const unsigned char *in, unsigned long inlen) \
88 LTC_ARGCHK(md != NULL); \
89 LTC_ARGCHK(in != NULL); \
90 if (md-> state_var .curlen > sizeof(md-> state_var .buf)) { \
91 return CRYPT_INVALID_ARG; \
93 if ((md-> state_var .length + inlen * 8) < md-> state_var .length) { \
94 return CRYPT_HASH_OVERFLOW; \
97 if (md-> state_var .curlen == 0 && inlen >= block_size) { \
98 if ((err = compress_name (md, in)) != CRYPT_OK) { \
101 md-> state_var .length += block_size * 8; \
103 inlen -= block_size; \
105 n = MIN(inlen, (block_size - md-> state_var .curlen)); \
106 XMEMCPY(md-> state_var .buf + md-> state_var.curlen, in, (size_t)n); \
107 md-> state_var .curlen += n; \
110 if (md-> state_var .curlen == block_size) { \
111 if ((err = compress_name (md, md-> state_var .buf)) != CRYPT_OK) { \
114 md-> state_var .length += 8*block_size; \
115 md-> state_var .curlen = 0; \
125 int ocb3_int_ntz(unsigned long x
);
126 void ocb3_int_xor_blocks(unsigned char *out
, const unsigned char *block_a
, const unsigned char *block_b
, unsigned long block_len
);
129 /* tomcrypt_math.h */
131 #if !defined(DESC_DEF_ONLY)
133 #define MP_DIGIT_BIT ltc_mp.bits_per_digit
135 /* some handy macros */
136 #define mp_init(a) ltc_mp.init(a)
137 #define mp_init_multi ltc_init_multi
138 #define mp_clear(a) ltc_mp.deinit(a)
139 #define mp_clear_multi ltc_deinit_multi
140 #define mp_cleanup_multi ltc_cleanup_multi
141 #define mp_init_copy(a, b) ltc_mp.init_copy(a, b)
143 #define mp_neg(a, b) ltc_mp.neg(a, b)
144 #define mp_copy(a, b) ltc_mp.copy(a, b)
146 #define mp_set(a, b) ltc_mp.set_int(a, b)
147 #define mp_set_int(a, b) ltc_mp.set_int(a, b)
148 #define mp_get_int(a) ltc_mp.get_int(a)
149 #define mp_get_digit(a, n) ltc_mp.get_digit(a, n)
150 #define mp_get_digit_count(a) ltc_mp.get_digit_count(a)
151 #define mp_cmp(a, b) ltc_mp.compare(a, b)
152 #define mp_cmp_d(a, b) ltc_mp.compare_d(a, b)
153 #define mp_count_bits(a) ltc_mp.count_bits(a)
154 #define mp_cnt_lsb(a) ltc_mp.count_lsb_bits(a)
155 #define mp_2expt(a, b) ltc_mp.twoexpt(a, b)
157 #define mp_read_radix(a, b, c) ltc_mp.read_radix(a, b, c)
158 #define mp_toradix(a, b, c) ltc_mp.write_radix(a, b, c)
159 #define mp_unsigned_bin_size(a) ltc_mp.unsigned_size(a)
160 #define mp_to_unsigned_bin(a, b) ltc_mp.unsigned_write(a, b)
161 #define mp_read_unsigned_bin(a, b, c) ltc_mp.unsigned_read(a, b, c)
163 #define mp_add(a, b, c) ltc_mp.add(a, b, c)
164 #define mp_add_d(a, b, c) ltc_mp.addi(a, b, c)
165 #define mp_sub(a, b, c) ltc_mp.sub(a, b, c)
166 #define mp_sub_d(a, b, c) ltc_mp.subi(a, b, c)
167 #define mp_mul(a, b, c) ltc_mp.mul(a, b, c)
168 #define mp_mul_d(a, b, c) ltc_mp.muli(a, b, c)
169 #define mp_sqr(a, b) ltc_mp.sqr(a, b)
170 #define mp_sqrtmod_prime(a, b, c) ltc_mp.sqrtmod_prime(a, b, c)
171 #define mp_div(a, b, c, d) ltc_mp.mpdiv(a, b, c, d)
172 #define mp_div_2(a, b) ltc_mp.div_2(a, b)
173 #define mp_mod(a, b, c) ltc_mp.mpdiv(a, b, NULL, c)
174 #define mp_mod_d(a, b, c) ltc_mp.modi(a, b, c)
175 #define mp_gcd(a, b, c) ltc_mp.gcd(a, b, c)
176 #define mp_lcm(a, b, c) ltc_mp.lcm(a, b, c)
178 #define mp_addmod(a, b, c, d) ltc_mp.addmod(a, b, c, d)
179 #define mp_submod(a, b, c, d) ltc_mp.submod(a, b, c, d)
180 #define mp_mulmod(a, b, c, d) ltc_mp.mulmod(a, b, c, d)
181 #define mp_sqrmod(a, b, c) ltc_mp.sqrmod(a, b, c)
182 #define mp_invmod(a, b, c) ltc_mp.invmod(a, b, c)
184 #define mp_montgomery_setup(a, b) ltc_mp.montgomery_setup(a, b)
185 #define mp_montgomery_normalization(a, b) ltc_mp.montgomery_normalization(a, b)
186 #define mp_montgomery_reduce(a, b, c) ltc_mp.montgomery_reduce(a, b, c)
187 #define mp_montgomery_free(a) ltc_mp.montgomery_deinit(a)
189 #define mp_exptmod(a,b,c,d) ltc_mp.exptmod(a,b,c,d)
190 #define mp_prime_is_prime(a, b, c) ltc_mp.isprime(a, b, c)
192 #define mp_iszero(a) (mp_cmp_d(a, 0) == LTC_MP_EQ ? LTC_MP_YES : LTC_MP_NO)
193 #define mp_isodd(a) (mp_get_digit_count(a) > 0 ? (mp_get_digit(a, 0) & 1 ? LTC_MP_YES : LTC_MP_NO) : LTC_MP_NO)
194 #define mp_exch(a, b) do { void *ABC__tmp = a; a = b; b = ABC__tmp; } while(0)
196 #define mp_tohex(a, b) mp_toradix(a, b, 16)
198 #define mp_rand(a, b) ltc_mp.rand(a, b)
203 /* tomcrypt_misc.h */
205 void copy_or_zeromem(const unsigned char* src
, unsigned char* dest
, unsigned long len
, int coz
);
207 int pbes_decrypt(const pbes_arg
*arg
, unsigned char *dec_data
, unsigned long *dec_size
);
209 int pbes1_extract(const ltc_asn1_list
*s
, pbes_arg
*res
);
210 int pbes2_extract(const ltc_asn1_list
*s
, pbes_arg
*res
);
215 int rand_bn_bits(void *N
, int bits
, prng_state
*prng
, int wprng
);
216 int rand_bn_upto(void *N
, void *limit
, prng_state
*prng
, int wprng
);
218 int pk_get_oid(enum ltc_oid_id id
, const char **st
);
219 int pk_oid_str_to_num(const char *OID
, unsigned long *oid
, unsigned long *oidlen
);
220 int pk_oid_num_to_str(const unsigned long *oid
, unsigned long oidlen
, char *OID
, unsigned long *outlen
);
222 /* ---- DH Routines ---- */
224 int rsa_init(rsa_key
*key
);
225 void rsa_shrink_key(rsa_key
*key
);
226 int rsa_make_key_bn_e(prng_state
*prng
, int wprng
, int size
, void *e
,
227 rsa_key
*key
); /* used by op-tee */
228 #endif /* LTC_MRSA */
230 /* ---- DH Routines ---- */
232 extern const ltc_dh_set_type ltc_dh_sets
[];
234 int dh_check_pubkey(const dh_key
*key
);
237 /* ---- ECC Routines ---- */
239 int ecc_set_curve_from_mpis(void *a
, void *b
, void *prime
, void *order
, void *gx
, void *gy
, unsigned long cofactor
, ecc_key
*key
);
240 int ecc_copy_curve(const ecc_key
*srckey
, ecc_key
*key
);
241 int ecc_set_curve_by_size(int size
, ecc_key
*key
);
242 int ecc_import_subject_public_key_info(const unsigned char *in
, unsigned long inlen
, ecc_key
*key
);
245 int ecc_ssh_ecdsa_encode_name(char *buffer
, unsigned long *buflen
, const ecc_key
*key
);
248 /* low level functions */
249 ecc_point
*ltc_ecc_new_point(void);
250 void ltc_ecc_del_point(ecc_point
*p
);
251 int ltc_ecc_set_point_xyz(ltc_mp_digit x
, ltc_mp_digit y
, ltc_mp_digit z
, ecc_point
*p
);
252 int ltc_ecc_copy_point(const ecc_point
*src
, ecc_point
*dst
);
253 int ltc_ecc_is_point(const ltc_ecc_dp
*dp
, void *x
, void *y
);
254 int ltc_ecc_is_point_at_infinity(const ecc_point
*P
, void *modulus
, int *retval
);
255 int ltc_ecc_import_point(const unsigned char *in
, unsigned long inlen
, void *prime
, void *a
, void *b
, void *x
, void *y
);
256 int ltc_ecc_export_point(unsigned char *out
, unsigned long *outlen
, void *x
, void *y
, unsigned long size
, int compressed
);
257 int ltc_ecc_verify_key(const ecc_key
*key
);
259 /* point ops (mp == montgomery digit) */
260 #if !defined(LTC_MECC_ACCEL) || defined(LTM_DESC) || defined(GMP_DESC)
262 int ltc_ecc_projective_dbl_point(const ecc_point
*P
, ecc_point
*R
, void *ma
, void *modulus
, void *mp
);
265 int ltc_ecc_projective_add_point(const ecc_point
*P
, const ecc_point
*Q
, ecc_point
*R
, void *ma
, void *modulus
, void *mp
);
268 #if defined(LTC_MECC_FP)
269 /* optimized point multiplication using fixed point cache (HAC algorithm 14.117) */
270 int ltc_ecc_fp_mulmod(void *k
, ecc_point
*G
, ecc_point
*R
, void *a
, void *modulus
, int map
);
272 /* functions for saving/loading/freeing/adding to fixed point cache */
273 int ltc_ecc_fp_save_state(unsigned char **out
, unsigned long *outlen
);
274 int ltc_ecc_fp_restore_state(unsigned char *in
, unsigned long inlen
);
275 void ltc_ecc_fp_free(void);
276 int ltc_ecc_fp_add_point(ecc_point
*g
, void *modulus
, int lock
);
278 /* lock/unlock all points currently in fixed point cache */
279 void ltc_ecc_fp_tablelock(int lock
);
283 int ltc_ecc_mulmod(void *k
, const ecc_point
*G
, ecc_point
*R
, void *a
, void *modulus
, int map
);
285 #ifdef LTC_ECC_SHAMIR
286 /* kA*A + kB*B = C */
287 int ltc_ecc_mul2add(const ecc_point
*A
, void *kA
,
288 const ecc_point
*B
, void *kB
,
294 /* Shamir's trick with optimized point multiplication using fixed point cache */
295 int ltc_ecc_fp_mul2add(const ecc_point
*A
, void *kA
,
296 const ecc_point
*B
, void *kB
,
305 /* map P to affine from projective */
306 int ltc_ecc_map(ecc_point
*P
, void *modulus
, void *mp
);
307 #endif /* LTC_MECC */
310 int dsa_int_validate_xy(const dsa_key
*key
, int *stat
);
311 int dsa_int_validate_pqg(const dsa_key
*key
, int *stat
);
312 int dsa_int_validate_primes(const dsa_key
*key
, int *stat
);
313 #endif /* LTC_MDSA */
316 #ifdef LTC_CURVE25519
318 int tweetnacl_crypto_sign(
319 unsigned char *sm
,unsigned long long *smlen
,
320 const unsigned char *m
,unsigned long long mlen
,
321 const unsigned char *sk
, const unsigned char *pk
);
322 int tweetnacl_crypto_sign_open(
324 unsigned char *m
,unsigned long long *mlen
,
325 const unsigned char *sm
,unsigned long long smlen
,
326 const unsigned char *pk
);
327 int tweetnacl_crypto_sign_keypair(prng_state
*prng
, int wprng
, unsigned char *pk
,unsigned char *sk
);
328 int tweetnacl_crypto_sk_to_pk(unsigned char *pk
, const unsigned char *sk
);
329 int tweetnacl_crypto_scalarmult(unsigned char *q
, const unsigned char *n
, const unsigned char *p
);
330 int tweetnacl_crypto_scalarmult_base(unsigned char *q
,const unsigned char *n
);
332 typedef int (*sk_to_pk
)(unsigned char *pk
,const unsigned char *sk
);
333 int ec25519_import_pkcs8(const unsigned char *in
, unsigned long inlen
,
334 const void *pwd
, unsigned long pwdlen
,
335 enum ltc_oid_id id
, sk_to_pk fp
,
336 curve25519_key
*key
);
337 int ec25519_export( unsigned char *out
, unsigned long *outlen
,
339 const curve25519_key
*key
);
340 #endif /* LTC_CURVE25519 */
344 #define LTC_ASN1_IS_TYPE(e, t) (((e) != NULL) && ((e)->type == (t)))
347 int der_decode_custom_type_ex(const unsigned char *in
, unsigned long inlen
,
349 ltc_asn1_list
*list
, unsigned long outlen
, unsigned int flags
);
351 int der_encode_asn1_identifier(const ltc_asn1_list
*id
, unsigned char *out
, unsigned long *outlen
);
352 int der_decode_asn1_identifier(const unsigned char *in
, unsigned long *inlen
, ltc_asn1_list
*id
);
353 int der_length_asn1_identifier(const ltc_asn1_list
*id
, unsigned long *idlen
);
355 int der_encode_asn1_length(unsigned long len
, unsigned char* out
, unsigned long* outlen
);
356 int der_decode_asn1_length(const unsigned char *in
, unsigned long *inlen
, unsigned long *outlen
);
357 int der_length_asn1_length(unsigned long len
, unsigned long *outlen
);
359 int der_length_sequence_ex(const ltc_asn1_list
*list
, unsigned long inlen
,
360 unsigned long *outlen
, unsigned long *payloadlen
);
362 extern const ltc_asn1_type der_asn1_tag_to_type_map
[];
363 extern const unsigned long der_asn1_tag_to_type_map_sz
;
365 extern const int der_asn1_type_to_identifier_map
[];
366 extern const unsigned long der_asn1_type_to_identifier_map_sz
;
368 int der_decode_sequence_multi_ex(const unsigned char *in
, unsigned long inlen
, unsigned int flags
, ...);
370 int der_teletex_char_encode(int c
);
371 int der_teletex_value_decode(int v
);
373 int der_utf8_valid_char(const wchar_t c
);
375 typedef int (*public_key_decode_cb
)(const unsigned char *in
, unsigned long inlen
, void *ctx
);
377 int x509_decode_public_key_from_certificate(const unsigned char *in
, unsigned long inlen
,
378 enum ltc_oid_id algorithm
, ltc_asn1_type param_type
,
379 ltc_asn1_list
* parameters
, unsigned long *parameters_len
,
380 public_key_decode_cb callback
, void *ctx
);
382 /* SUBJECT PUBLIC KEY INFO */
383 int x509_encode_subject_public_key_info(unsigned char *out
, unsigned long *outlen
,
384 unsigned int algorithm
, const void* public_key
, unsigned long public_key_len
,
385 ltc_asn1_type parameters_type
, ltc_asn1_list
* parameters
, unsigned long parameters_len
);
387 int x509_decode_subject_public_key_info(const unsigned char *in
, unsigned long inlen
,
388 unsigned int algorithm
, void* public_key
, unsigned long* public_key_len
,
389 ltc_asn1_type parameters_type
, ltc_asn1_list
* parameters
, unsigned long *parameters_len
);
391 int pk_oid_cmp_with_ulong(const char *o1
, const unsigned long *o2
, unsigned long o2size
);
392 int pk_oid_cmp_with_asn1(const char *o1
, const ltc_asn1_list
*o2
);
396 /* tomcrypt_pkcs.h */
400 int pkcs8_decode_flexi(const unsigned char *in
, unsigned long inlen
,
401 const void *pwd
, unsigned long pwdlen
,
402 ltc_asn1_list
**decoded_list
);
404 #endif /* LTC_PKCS_8 */
409 int pkcs12_utf8_to_utf16(const unsigned char *in
, unsigned long inlen
,
410 unsigned char *out
, unsigned long *outlen
);
412 int pkcs12_kdf( int hash_id
,
413 const unsigned char *pw
, unsigned long pwlen
,
414 const unsigned char *salt
, unsigned long saltlen
,
415 unsigned int iterations
, unsigned char purpose
,
416 unsigned char *out
, unsigned long outlen
);
418 #endif /* LTC_PKCS_12 */
420 /* tomcrypt_prng.h */
422 #define LTC_PRNG_EXPORT(which) \
423 int which ## _export(unsigned char *out, unsigned long *outlen, prng_state *prng) \
425 unsigned long len = which ## _desc.export_size; \
427 LTC_ARGCHK(prng != NULL); \
428 LTC_ARGCHK(out != NULL); \
429 LTC_ARGCHK(outlen != NULL); \
431 if (*outlen < len) { \
433 return CRYPT_BUFFER_OVERFLOW; \
436 if (which ## _read(out, len, prng) != len) { \
437 return CRYPT_ERROR_READPRNG; \
444 /* extract a byte portably */
446 #define LTC_BYTE(x, n) ((unsigned char)((x) >> (8 * (n))))
448 #define LTC_BYTE(x, n) (((x) >> (8 * (n))) & 255)