]> Dogcows Code - chaz/p5-File-KDBX-XS/blob - libtomcrypt/src/headers/tomcrypt_pk.h
initial commit
[chaz/p5-File-KDBX-XS] / libtomcrypt / src / headers / tomcrypt_pk.h
1 /* LibTomCrypt, modular cryptographic library -- Tom St Denis */
2 /* SPDX-License-Identifier: Unlicense */
3
4 /* ---- NUMBER THEORY ---- */
5
6 enum public_key_type {
7 /* Refers to the public key */
8 PK_PUBLIC = 0x0000,
9 /* Refers to the private key */
10 PK_PRIVATE = 0x0001,
11
12 /* Indicates standard output formats that can be read e.g. by OpenSSL or GnuTLS */
13 PK_STD = 0x1000,
14 /* Indicates compressed public ECC key */
15 PK_COMPRESSED = 0x2000,
16 /* Indicates ECC key with the curve specified by OID */
17 PK_CURVEOID = 0x4000
18 };
19
20 int rand_prime(void *N, long len, prng_state *prng, int wprng);
21
22 /* ---- RSA ---- */
23 #ifdef LTC_MRSA
24
25 /** RSA PKCS style key */
26 typedef struct Rsa_key {
27 /** Type of key, PK_PRIVATE or PK_PUBLIC */
28 int type;
29 /** The public exponent */
30 void *e;
31 /** The private exponent */
32 void *d;
33 /** The modulus */
34 void *N;
35 /** The p factor of N */
36 void *p;
37 /** The q factor of N */
38 void *q;
39 /** The 1/q mod p CRT param */
40 void *qP;
41 /** The d mod (p - 1) CRT param */
42 void *dP;
43 /** The d mod (q - 1) CRT param */
44 void *dQ;
45 } rsa_key;
46
47 int rsa_make_key(prng_state *prng, int wprng, int size, long e, rsa_key *key);
48 int rsa_make_key_ubin_e(prng_state *prng, int wprng, int size,
49 const unsigned char *e, unsigned long elen, rsa_key *key);
50 int rsa_get_size(const rsa_key *key);
51
52 int rsa_exptmod(const unsigned char *in, unsigned long inlen,
53 unsigned char *out, unsigned long *outlen, int which,
54 const rsa_key *key);
55
56 void rsa_free(rsa_key *key);
57
58 /* These use PKCS #1 v2.0 padding */
59 #define rsa_encrypt_key(in, inlen, out, outlen, lparam, lparamlen, prng, prng_idx, hash_idx, key) \
60 rsa_encrypt_key_ex(in, inlen, out, outlen, lparam, lparamlen, prng, prng_idx, hash_idx, LTC_PKCS_1_OAEP, key)
61
62 #define rsa_decrypt_key(in, inlen, out, outlen, lparam, lparamlen, hash_idx, stat, key) \
63 rsa_decrypt_key_ex(in, inlen, out, outlen, lparam, lparamlen, hash_idx, LTC_PKCS_1_OAEP, stat, key)
64
65 #define rsa_sign_hash(in, inlen, out, outlen, prng, prng_idx, hash_idx, saltlen, key) \
66 rsa_sign_hash_ex(in, inlen, out, outlen, LTC_PKCS_1_PSS, prng, prng_idx, hash_idx, saltlen, key)
67
68 #define rsa_verify_hash(sig, siglen, hash, hashlen, hash_idx, saltlen, stat, key) \
69 rsa_verify_hash_ex(sig, siglen, hash, hashlen, LTC_PKCS_1_PSS, hash_idx, saltlen, stat, key)
70
71 #define rsa_sign_saltlen_get_max(hash_idx, key) \
72 rsa_sign_saltlen_get_max_ex(LTC_PKCS_1_PSS, hash_idx, key)
73
74 /* These can be switched between PKCS #1 v2.x and PKCS #1 v1.5 paddings */
75 int rsa_encrypt_key_ex(const unsigned char *in, unsigned long inlen,
76 unsigned char *out, unsigned long *outlen,
77 const unsigned char *lparam, unsigned long lparamlen,
78 prng_state *prng, int prng_idx,
79 int hash_idx, int padding,
80 const rsa_key *key);
81
82 int rsa_decrypt_key_ex(const unsigned char *in, unsigned long inlen,
83 unsigned char *out, unsigned long *outlen,
84 const unsigned char *lparam, unsigned long lparamlen,
85 int hash_idx, int padding,
86 int *stat, const rsa_key *key);
87
88 int rsa_sign_hash_ex(const unsigned char *in, unsigned long inlen,
89 unsigned char *out, unsigned long *outlen,
90 int padding,
91 prng_state *prng, int prng_idx,
92 int hash_idx, unsigned long saltlen,
93 const rsa_key *key);
94
95 int rsa_verify_hash_ex(const unsigned char *sig, unsigned long siglen,
96 const unsigned char *hash, unsigned long hashlen,
97 int padding,
98 int hash_idx, unsigned long saltlen,
99 int *stat, const rsa_key *key);
100
101 int rsa_sign_saltlen_get_max_ex(int padding, int hash_idx, const rsa_key *key);
102
103 /* PKCS #1 import/export */
104 int rsa_export(unsigned char *out, unsigned long *outlen, int type, const rsa_key *key);
105 int rsa_import(const unsigned char *in, unsigned long inlen, rsa_key *key);
106
107 int rsa_import_x509(const unsigned char *in, unsigned long inlen, rsa_key *key);
108 int rsa_import_pkcs8(const unsigned char *in, unsigned long inlen,
109 const void *passwd, unsigned long passwdlen, rsa_key *key);
110
111 int rsa_set_key(const unsigned char *N, unsigned long Nlen,
112 const unsigned char *e, unsigned long elen,
113 const unsigned char *d, unsigned long dlen,
114 rsa_key *key);
115 int rsa_set_factors(const unsigned char *p, unsigned long plen,
116 const unsigned char *q, unsigned long qlen,
117 rsa_key *key);
118 int rsa_set_crt_params(const unsigned char *dP, unsigned long dPlen,
119 const unsigned char *dQ, unsigned long dQlen,
120 const unsigned char *qP, unsigned long qPlen,
121 rsa_key *key);
122 #endif
123
124 /* ---- DH Routines ---- */
125 #ifdef LTC_MDH
126
127 typedef struct {
128 int type;
129 void *x;
130 void *y;
131 void *base;
132 void *prime;
133 } dh_key;
134
135 int dh_get_groupsize(const dh_key *key);
136
137 int dh_export(unsigned char *out, unsigned long *outlen, int type, const dh_key *key);
138 int dh_import(const unsigned char *in, unsigned long inlen, dh_key *key);
139
140 int dh_set_pg(const unsigned char *p, unsigned long plen,
141 const unsigned char *g, unsigned long glen,
142 dh_key *key);
143 int dh_set_pg_dhparam(const unsigned char *dhparam, unsigned long dhparamlen, dh_key *key);
144 int dh_set_pg_groupsize(int groupsize, dh_key *key);
145
146 int dh_set_key(const unsigned char *in, unsigned long inlen, int type, dh_key *key);
147 int dh_generate_key(prng_state *prng, int wprng, dh_key *key);
148
149 int dh_shared_secret(const dh_key *private_key, const dh_key *public_key,
150 unsigned char *out, unsigned long *outlen);
151
152 void dh_free(dh_key *key);
153
154 int dh_export_key(void *out, unsigned long *outlen, int type, const dh_key *key);
155 #endif /* LTC_MDH */
156
157
158 /* ---- ECC Routines ---- */
159 #ifdef LTC_MECC
160
161 /* size of our temp buffers for exported keys */
162 #define ECC_BUF_SIZE 256
163
164 /* max private key size */
165 #define ECC_MAXSIZE 66
166
167 /** Structure defines a GF(p) curve */
168 typedef struct {
169 /** The prime that defines the field the curve is in (encoded in hex) */
170 const char *prime;
171
172 /** The fields A param (hex) */
173 const char *A;
174
175 /** The fields B param (hex) */
176 const char *B;
177
178 /** The order of the curve (hex) */
179 const char *order;
180
181 /** The x co-ordinate of the base point on the curve (hex) */
182 const char *Gx;
183
184 /** The y co-ordinate of the base point on the curve (hex) */
185 const char *Gy;
186
187 /** The co-factor */
188 unsigned long cofactor;
189
190 /** The OID */
191 const char *OID;
192 } ltc_ecc_curve;
193
194 /** A point on a ECC curve, stored in Jacbobian format such that (x,y,z) => (x/z^2, y/z^3, 1) when interpretted as affine */
195 typedef struct {
196 /** The x co-ordinate */
197 void *x;
198
199 /** The y co-ordinate */
200 void *y;
201
202 /** The z co-ordinate */
203 void *z;
204 } ecc_point;
205
206 /** ECC key's domain parameters */
207 typedef struct {
208 /** The size of the curve in octets */
209 int size;
210 /** The prime that defines the field the curve is in */
211 void *prime;
212 /** The fields A param */
213 void *A;
214 /** The fields B param */
215 void *B;
216 /** The order of the curve */
217 void *order;
218 /** The base point G on the curve */
219 ecc_point base;
220 /** The co-factor */
221 unsigned long cofactor;
222 /** The OID */
223 unsigned long oid[16];
224 unsigned long oidlen;
225 } ltc_ecc_dp;
226
227 /** An ECC key */
228 typedef struct {
229 /** Type of key, PK_PRIVATE or PK_PUBLIC */
230 int type;
231
232 /** Structure with domain parameters */
233 ltc_ecc_dp dp;
234
235 /** Structure with the public key */
236 ecc_point pubkey;
237
238 /** The private key */
239 void *k;
240 } ecc_key;
241
242 /** Formats of ECC signatures */
243 typedef enum ecc_signature_type_ {
244 /* ASN.1 encoded, ANSI X9.62 */
245 LTC_ECCSIG_ANSIX962 = 0x0,
246 /* raw R, S values */
247 LTC_ECCSIG_RFC7518 = 0x1,
248 /* raw R, S, V (+27) values */
249 LTC_ECCSIG_ETH27 = 0x2,
250 /* SSH + ECDSA signature format defined by RFC5656 */
251 LTC_ECCSIG_RFC5656 = 0x3,
252 } ecc_signature_type;
253
254 /** the ECC params provided */
255 extern const ltc_ecc_curve ltc_ecc_curves[];
256
257 void ecc_sizes(int *low, int *high);
258 int ecc_get_size(const ecc_key *key);
259
260 int ecc_find_curve(const char* name_or_oid, const ltc_ecc_curve** cu);
261 int ecc_set_curve(const ltc_ecc_curve *cu, ecc_key *key);
262 int ecc_generate_key(prng_state *prng, int wprng, ecc_key *key);
263 int ecc_set_key(const unsigned char *in, unsigned long inlen, int type, ecc_key *key);
264 int ecc_get_key(unsigned char *out, unsigned long *outlen, int type, const ecc_key *key);
265 int ecc_get_oid_str(char *out, unsigned long *outlen, const ecc_key *key);
266
267 int ecc_make_key(prng_state *prng, int wprng, int keysize, ecc_key *key);
268 int ecc_make_key_ex(prng_state *prng, int wprng, ecc_key *key, const ltc_ecc_curve *cu);
269 void ecc_free(ecc_key *key);
270
271 int ecc_export(unsigned char *out, unsigned long *outlen, int type, const ecc_key *key);
272 int ecc_import(const unsigned char *in, unsigned long inlen, ecc_key *key);
273 int ecc_import_ex(const unsigned char *in, unsigned long inlen, ecc_key *key, const ltc_ecc_curve *cu);
274
275 int ecc_ansi_x963_export(const ecc_key *key, unsigned char *out, unsigned long *outlen);
276 int ecc_ansi_x963_import(const unsigned char *in, unsigned long inlen, ecc_key *key);
277 int ecc_ansi_x963_import_ex(const unsigned char *in, unsigned long inlen, ecc_key *key, const ltc_ecc_curve *cu);
278
279 int ecc_export_openssl(unsigned char *out, unsigned long *outlen, int type, const ecc_key *key);
280 int ecc_import_openssl(const unsigned char *in, unsigned long inlen, ecc_key *key);
281 int ecc_import_pkcs8(const unsigned char *in, unsigned long inlen, const void *pwd, unsigned long pwdlen, ecc_key *key);
282 int ecc_import_x509(const unsigned char *in, unsigned long inlen, ecc_key *key);
283
284 int ecc_shared_secret(const ecc_key *private_key, const ecc_key *public_key,
285 unsigned char *out, unsigned long *outlen);
286
287 int ecc_encrypt_key(const unsigned char *in, unsigned long inlen,
288 unsigned char *out, unsigned long *outlen,
289 prng_state *prng, int wprng, int hash,
290 const ecc_key *key);
291
292 int ecc_decrypt_key(const unsigned char *in, unsigned long inlen,
293 unsigned char *out, unsigned long *outlen,
294 const ecc_key *key);
295
296 #define ecc_sign_hash_rfc7518(in_, inlen_, out_, outlen_, prng_, wprng_, key_) \
297 ecc_sign_hash_ex(in_, inlen_, out_, outlen_, prng_, wprng_, LTC_ECCSIG_RFC7518, NULL, key_)
298
299 #define ecc_sign_hash(in_, inlen_, out_, outlen_, prng_, wprng_, key_) \
300 ecc_sign_hash_ex(in_, inlen_, out_, outlen_, prng_, wprng_, LTC_ECCSIG_ANSIX962, NULL, key_)
301
302 #define ecc_verify_hash_rfc7518(sig_, siglen_, hash_, hashlen_, stat_, key_) \
303 ecc_verify_hash_ex(sig_, siglen_, hash_, hashlen_, LTC_ECCSIG_RFC7518, stat_, key_)
304
305 #define ecc_verify_hash(sig_, siglen_, hash_, hashlen_, stat_, key_) \
306 ecc_verify_hash_ex(sig_, siglen_, hash_, hashlen_, LTC_ECCSIG_ANSIX962, stat_, key_)
307
308 int ecc_sign_hash_ex(const unsigned char *in, unsigned long inlen,
309 unsigned char *out, unsigned long *outlen,
310 prng_state *prng, int wprng, ecc_signature_type sigformat,
311 int *recid, const ecc_key *key);
312
313 int ecc_verify_hash_ex(const unsigned char *sig, unsigned long siglen,
314 const unsigned char *hash, unsigned long hashlen,
315 ecc_signature_type sigformat, int *stat, const ecc_key *key);
316
317 int ecc_recover_key(const unsigned char *sig, unsigned long siglen,
318 const unsigned char *hash, unsigned long hashlen,
319 int recid, ecc_signature_type sigformat, ecc_key *key);
320
321 #endif
322
323 #ifdef LTC_CURVE25519
324
325 typedef struct {
326 /** The key type, PK_PRIVATE or PK_PUBLIC */
327 enum public_key_type type;
328
329 /** The PK-algorithm, PKA_ED25519 or PKA_X25519 */
330 /** This was supposed to be:
331 * enum public_key_algorithms algo;
332 * but that enum is now in tomcrypt_private.h
333 */
334 int algo;
335
336 /** The private key */
337 unsigned char priv[32];
338
339 /** The public key */
340 unsigned char pub[32];
341 } curve25519_key;
342
343
344 /** Ed25519 Signature API */
345 int ed25519_make_key(prng_state *prng, int wprng, curve25519_key *key);
346
347 int ed25519_export( unsigned char *out, unsigned long *outlen,
348 int which,
349 const curve25519_key *key);
350
351 int ed25519_import(const unsigned char *in, unsigned long inlen, curve25519_key *key);
352 int ed25519_import_raw(const unsigned char *in, unsigned long inlen, int which, curve25519_key *key);
353 int ed25519_import_x509(const unsigned char *in, unsigned long inlen, curve25519_key *key);
354 int ed25519_import_pkcs8(const unsigned char *in, unsigned long inlen,
355 const void *pwd, unsigned long pwdlen,
356 curve25519_key *key);
357
358 int ed25519_sign(const unsigned char *msg, unsigned long msglen,
359 unsigned char *sig, unsigned long *siglen,
360 const curve25519_key *private_key);
361
362 int ed25519_verify(const unsigned char *msg, unsigned long msglen,
363 const unsigned char *sig, unsigned long siglen,
364 int *stat, const curve25519_key *public_key);
365
366 /** X25519 Key-Exchange API */
367 int x25519_make_key(prng_state *prng, int wprng, curve25519_key *key);
368
369 int x25519_export( unsigned char *out, unsigned long *outlen,
370 int which,
371 const curve25519_key *key);
372
373 int x25519_import(const unsigned char *in, unsigned long inlen, curve25519_key *key);
374 int x25519_import_raw(const unsigned char *in, unsigned long inlen, int which, curve25519_key *key);
375 int x25519_import_x509(const unsigned char *in, unsigned long inlen, curve25519_key *key);
376 int x25519_import_pkcs8(const unsigned char *in, unsigned long inlen,
377 const void *pwd, unsigned long pwdlen,
378 curve25519_key *key);
379
380 int x25519_shared_secret(const curve25519_key *private_key,
381 const curve25519_key *public_key,
382 unsigned char *out, unsigned long *outlen);
383
384 #endif /* LTC_CURVE25519 */
385
386 #ifdef LTC_MDSA
387
388 /* Max diff between group and modulus size in bytes (max case: L=8192bits, N=256bits) */
389 #define LTC_MDSA_DELTA 992
390
391 /* Max DSA group size in bytes */
392 #define LTC_MDSA_MAX_GROUP 64
393
394 /* Max DSA modulus size in bytes (the actual DSA size, max 8192 bits) */
395 #define LTC_MDSA_MAX_MODULUS 1024
396
397 /** DSA key structure */
398 typedef struct {
399 /** The key type, PK_PRIVATE or PK_PUBLIC */
400 int type;
401
402 /** The order of the sub-group used in octets */
403 int qord;
404
405 /** The generator */
406 void *g;
407
408 /** The prime used to generate the sub-group */
409 void *q;
410
411 /** The large prime that generats the field the contains the sub-group */
412 void *p;
413
414 /** The private key */
415 void *x;
416
417 /** The public key */
418 void *y;
419 } dsa_key;
420
421 int dsa_make_key(prng_state *prng, int wprng, int group_size, int modulus_size, dsa_key *key);
422
423 int dsa_set_pqg(const unsigned char *p, unsigned long plen,
424 const unsigned char *q, unsigned long qlen,
425 const unsigned char *g, unsigned long glen,
426 dsa_key *key);
427 int dsa_set_pqg_dsaparam(const unsigned char *dsaparam, unsigned long dsaparamlen, dsa_key *key);
428 int dsa_generate_pqg(prng_state *prng, int wprng, int group_size, int modulus_size, dsa_key *key);
429
430 int dsa_set_key(const unsigned char *in, unsigned long inlen, int type, dsa_key *key);
431 int dsa_generate_key(prng_state *prng, int wprng, dsa_key *key);
432
433 void dsa_free(dsa_key *key);
434
435 int dsa_sign_hash_raw(const unsigned char *in, unsigned long inlen,
436 void *r, void *s,
437 prng_state *prng, int wprng, const dsa_key *key);
438
439 int dsa_sign_hash(const unsigned char *in, unsigned long inlen,
440 unsigned char *out, unsigned long *outlen,
441 prng_state *prng, int wprng, const dsa_key *key);
442
443 int dsa_verify_hash_raw( void *r, void *s,
444 const unsigned char *hash, unsigned long hashlen,
445 int *stat, const dsa_key *key);
446
447 int dsa_verify_hash(const unsigned char *sig, unsigned long siglen,
448 const unsigned char *hash, unsigned long hashlen,
449 int *stat, const dsa_key *key);
450
451 int dsa_encrypt_key(const unsigned char *in, unsigned long inlen,
452 unsigned char *out, unsigned long *outlen,
453 prng_state *prng, int wprng, int hash,
454 const dsa_key *key);
455
456 int dsa_decrypt_key(const unsigned char *in, unsigned long inlen,
457 unsigned char *out, unsigned long *outlen,
458 const dsa_key *key);
459
460 int dsa_import(const unsigned char *in, unsigned long inlen, dsa_key *key);
461 int dsa_export(unsigned char *out, unsigned long *outlen, int type, const dsa_key *key);
462 int dsa_verify_key(const dsa_key *key, int *stat);
463 int dsa_shared_secret(void *private_key, void *base,
464 const dsa_key *public_key,
465 unsigned char *out, unsigned long *outlen);
466 #endif /* LTC_MDSA */
467
468 #ifdef LTC_DER
469 /* DER handling */
470
471 typedef enum ltc_asn1_type_ {
472 /* 0 */
473 LTC_ASN1_EOL,
474 LTC_ASN1_BOOLEAN,
475 LTC_ASN1_INTEGER,
476 LTC_ASN1_SHORT_INTEGER,
477 LTC_ASN1_BIT_STRING,
478 /* 5 */
479 LTC_ASN1_OCTET_STRING,
480 LTC_ASN1_NULL,
481 LTC_ASN1_OBJECT_IDENTIFIER,
482 LTC_ASN1_IA5_STRING,
483 LTC_ASN1_PRINTABLE_STRING,
484 /* 10 */
485 LTC_ASN1_UTF8_STRING,
486 LTC_ASN1_UTCTIME,
487 LTC_ASN1_CHOICE,
488 LTC_ASN1_SEQUENCE,
489 LTC_ASN1_SET,
490 /* 15 */
491 LTC_ASN1_SETOF,
492 LTC_ASN1_RAW_BIT_STRING,
493 LTC_ASN1_TELETEX_STRING,
494 LTC_ASN1_GENERALIZEDTIME,
495 LTC_ASN1_CUSTOM_TYPE,
496 } ltc_asn1_type;
497
498 typedef enum {
499 LTC_ASN1_CL_UNIVERSAL = 0x0,
500 LTC_ASN1_CL_APPLICATION = 0x1,
501 LTC_ASN1_CL_CONTEXT_SPECIFIC = 0x2,
502 LTC_ASN1_CL_PRIVATE = 0x3,
503 } ltc_asn1_class;
504
505 typedef enum {
506 LTC_ASN1_PC_PRIMITIVE = 0x0,
507 LTC_ASN1_PC_CONSTRUCTED = 0x1,
508 } ltc_asn1_pc;
509
510 /** A LTC ASN.1 list type */
511 typedef struct ltc_asn1_list_ {
512 /** The LTC ASN.1 enumerated type identifier */
513 ltc_asn1_type type;
514 /** The data to encode or place for decoding */
515 void *data;
516 /** The size of the input or resulting output */
517 unsigned long size;
518 /** The used flag
519 * 1. This is used by the CHOICE ASN.1 type to indicate which choice was made
520 * 2. This is used by the ASN.1 decoder to indicate if an element is used
521 * 3. This is used by the flexi-decoder to indicate the first byte of the identifier */
522 int used;
523 /** Flag used to indicate optional items in ASN.1 sequences */
524 int optional;
525 /** ASN.1 identifier */
526 ltc_asn1_class klass;
527 ltc_asn1_pc pc;
528 ulong64 tag;
529 /** prev/next entry in the list */
530 struct ltc_asn1_list_ *prev, *next, *child, *parent;
531 } ltc_asn1_list;
532
533 #define LTC_SET_ASN1(list, index, Type, Data, Size) \
534 do { \
535 int LTC_MACRO_temp = (index); \
536 ltc_asn1_list *LTC_MACRO_list = (list); \
537 LTC_MACRO_list[LTC_MACRO_temp].type = (Type); \
538 LTC_MACRO_list[LTC_MACRO_temp].data = (void*)(Data); \
539 LTC_MACRO_list[LTC_MACRO_temp].size = (Size); \
540 LTC_MACRO_list[LTC_MACRO_temp].used = 0; \
541 LTC_MACRO_list[LTC_MACRO_temp].optional = 0; \
542 LTC_MACRO_list[LTC_MACRO_temp].klass = 0; \
543 LTC_MACRO_list[LTC_MACRO_temp].pc = 0; \
544 LTC_MACRO_list[LTC_MACRO_temp].tag = 0; \
545 } while (0)
546
547 #define LTC_SET_ASN1_IDENTIFIER(list, index, Class, Pc, Tag) \
548 do { \
549 int LTC_MACRO_temp = (index); \
550 ltc_asn1_list *LTC_MACRO_list = (list); \
551 LTC_MACRO_list[LTC_MACRO_temp].type = LTC_ASN1_CUSTOM_TYPE; \
552 LTC_MACRO_list[LTC_MACRO_temp].klass = (Class); \
553 LTC_MACRO_list[LTC_MACRO_temp].pc = (Pc); \
554 LTC_MACRO_list[LTC_MACRO_temp].tag = (Tag); \
555 } while (0)
556
557 #define LTC_SET_ASN1_CUSTOM_CONSTRUCTED(list, index, Class, Tag, Data) \
558 do { \
559 int LTC_MACRO_temp##__LINE__ = (index); \
560 LTC_SET_ASN1(list, LTC_MACRO_temp##__LINE__, LTC_ASN1_CUSTOM_TYPE, Data, 1); \
561 LTC_SET_ASN1_IDENTIFIER(list, LTC_MACRO_temp##__LINE__, Class, LTC_ASN1_PC_CONSTRUCTED, Tag); \
562 } while (0)
563
564 #define LTC_SET_ASN1_CUSTOM_PRIMITIVE(list, index, Class, Tag, Type, Data, Size) \
565 do { \
566 int LTC_MACRO_temp##__LINE__ = (index); \
567 LTC_SET_ASN1(list, LTC_MACRO_temp##__LINE__, LTC_ASN1_CUSTOM_TYPE, Data, Size); \
568 LTC_SET_ASN1_IDENTIFIER(list, LTC_MACRO_temp##__LINE__, Class, LTC_ASN1_PC_PRIMITIVE, Tag); \
569 list[LTC_MACRO_temp##__LINE__].used = (int)(Type); \
570 } while (0)
571
572 extern const char* der_asn1_class_to_string_map[];
573 extern const unsigned long der_asn1_class_to_string_map_sz;
574
575 extern const char* der_asn1_pc_to_string_map[];
576 extern const unsigned long der_asn1_pc_to_string_map_sz;
577
578 extern const char* der_asn1_tag_to_string_map[];
579 extern const unsigned long der_asn1_tag_to_string_map_sz;
580
581 /* SEQUENCE */
582 int der_encode_sequence_ex(const ltc_asn1_list *list, unsigned long inlen,
583 unsigned char *out, unsigned long *outlen, int type_of);
584
585 #define der_encode_sequence(list, inlen, out, outlen) der_encode_sequence_ex(list, inlen, out, outlen, LTC_ASN1_SEQUENCE)
586
587 /** The supported bitmap for all the
588 * decoders with a `flags` argument.
589 */
590 enum ltc_der_seq {
591 LTC_DER_SEQ_ZERO = 0x0u,
592
593 /** Bit0 - [0]=Unordered (SET or SETOF)
594 * [1]=Ordered (SEQUENCE) */
595 LTC_DER_SEQ_UNORDERED = LTC_DER_SEQ_ZERO,
596 LTC_DER_SEQ_ORDERED = 0x1u,
597
598 /** Bit1 - [0]=Relaxed
599 * [1]=Strict */
600 LTC_DER_SEQ_RELAXED = LTC_DER_SEQ_ZERO,
601 LTC_DER_SEQ_STRICT = 0x2u,
602
603 /** Alternative naming */
604 LTC_DER_SEQ_SET = LTC_DER_SEQ_UNORDERED,
605 LTC_DER_SEQ_SEQUENCE = LTC_DER_SEQ_ORDERED,
606 };
607
608 int der_decode_sequence_ex(const unsigned char *in, unsigned long inlen,
609 ltc_asn1_list *list, unsigned long outlen, unsigned int flags);
610
611 #define der_decode_sequence(in, inlen, list, outlen) der_decode_sequence_ex(in, inlen, list, outlen, LTC_DER_SEQ_SEQUENCE | LTC_DER_SEQ_RELAXED)
612 #define der_decode_sequence_strict(in, inlen, list, outlen) der_decode_sequence_ex(in, inlen, list, outlen, LTC_DER_SEQ_SEQUENCE | LTC_DER_SEQ_STRICT)
613
614 int der_length_sequence(const ltc_asn1_list *list, unsigned long inlen,
615 unsigned long *outlen);
616
617
618 /* Custom-types */
619 int der_encode_custom_type(const ltc_asn1_list *root,
620 unsigned char *out, unsigned long *outlen);
621
622 int der_decode_custom_type(const unsigned char *in, unsigned long inlen,
623 ltc_asn1_list *root);
624
625 int der_length_custom_type(const ltc_asn1_list *root,
626 unsigned long *outlen,
627 unsigned long *payloadlen);
628
629 /* SET */
630 #define der_decode_set(in, inlen, list, outlen) der_decode_sequence_ex(in, inlen, list, outlen, LTC_DER_SEQ_SET)
631 #define der_length_set der_length_sequence
632 int der_encode_set(const ltc_asn1_list *list, unsigned long inlen,
633 unsigned char *out, unsigned long *outlen);
634
635 int der_encode_setof(const ltc_asn1_list *list, unsigned long inlen,
636 unsigned char *out, unsigned long *outlen);
637
638 /* VA list handy helpers with triplets of <type, size, data> */
639 int der_encode_sequence_multi(unsigned char *out, unsigned long *outlen, ...);
640 int der_decode_sequence_multi(const unsigned char *in, unsigned long inlen, ...);
641
642 /* FLEXI DECODER handle unknown list decoder */
643 int der_decode_sequence_flexi(const unsigned char *in, unsigned long *inlen, ltc_asn1_list **out);
644 #define der_free_sequence_flexi der_sequence_free
645 void der_sequence_free(ltc_asn1_list *in);
646 void der_sequence_shrink(ltc_asn1_list *in);
647
648 /* BOOLEAN */
649 int der_length_boolean(unsigned long *outlen);
650 int der_encode_boolean(int in,
651 unsigned char *out, unsigned long *outlen);
652 int der_decode_boolean(const unsigned char *in, unsigned long inlen,
653 int *out);
654 /* INTEGER */
655 int der_encode_integer(void *num, unsigned char *out, unsigned long *outlen);
656 int der_decode_integer(const unsigned char *in, unsigned long inlen, void *num);
657 int der_length_integer(void *num, unsigned long *outlen);
658
659 /* INTEGER -- handy for 0..2^32-1 values */
660 int der_decode_short_integer(const unsigned char *in, unsigned long inlen, unsigned long *num);
661 int der_encode_short_integer(unsigned long num, unsigned char *out, unsigned long *outlen);
662 int der_length_short_integer(unsigned long num, unsigned long *outlen);
663
664 /* BIT STRING */
665 int der_encode_bit_string(const unsigned char *in, unsigned long inlen,
666 unsigned char *out, unsigned long *outlen);
667 int der_decode_bit_string(const unsigned char *in, unsigned long inlen,
668 unsigned char *out, unsigned long *outlen);
669 int der_encode_raw_bit_string(const unsigned char *in, unsigned long inlen,
670 unsigned char *out, unsigned long *outlen);
671 int der_decode_raw_bit_string(const unsigned char *in, unsigned long inlen,
672 unsigned char *out, unsigned long *outlen);
673 int der_length_bit_string(unsigned long nbits, unsigned long *outlen);
674
675 /* OCTET STRING */
676 int der_encode_octet_string(const unsigned char *in, unsigned long inlen,
677 unsigned char *out, unsigned long *outlen);
678 int der_decode_octet_string(const unsigned char *in, unsigned long inlen,
679 unsigned char *out, unsigned long *outlen);
680 int der_length_octet_string(unsigned long noctets, unsigned long *outlen);
681
682 /* OBJECT IDENTIFIER */
683 int der_encode_object_identifier(const unsigned long *words, unsigned long nwords,
684 unsigned char *out, unsigned long *outlen);
685 int der_decode_object_identifier(const unsigned char *in, unsigned long inlen,
686 unsigned long *words, unsigned long *outlen);
687 int der_length_object_identifier(const unsigned long *words, unsigned long nwords, unsigned long *outlen);
688 unsigned long der_object_identifier_bits(unsigned long x);
689
690 /* IA5 STRING */
691 int der_encode_ia5_string(const unsigned char *in, unsigned long inlen,
692 unsigned char *out, unsigned long *outlen);
693 int der_decode_ia5_string(const unsigned char *in, unsigned long inlen,
694 unsigned char *out, unsigned long *outlen);
695 int der_length_ia5_string(const unsigned char *octets, unsigned long noctets, unsigned long *outlen);
696
697 int der_ia5_char_encode(int c);
698 int der_ia5_value_decode(int v);
699
700 /* TELETEX STRING */
701 int der_decode_teletex_string(const unsigned char *in, unsigned long inlen,
702 unsigned char *out, unsigned long *outlen);
703 int der_length_teletex_string(const unsigned char *octets, unsigned long noctets, unsigned long *outlen);
704
705 /* PRINTABLE STRING */
706 int der_encode_printable_string(const unsigned char *in, unsigned long inlen,
707 unsigned char *out, unsigned long *outlen);
708 int der_decode_printable_string(const unsigned char *in, unsigned long inlen,
709 unsigned char *out, unsigned long *outlen);
710 int der_length_printable_string(const unsigned char *octets, unsigned long noctets, unsigned long *outlen);
711
712 int der_printable_char_encode(int c);
713 int der_printable_value_decode(int v);
714
715 /* UTF-8 */
716 #if (defined(SIZE_MAX) || __STDC_VERSION__ >= 199901L || defined(WCHAR_MAX) || defined(__WCHAR_MAX__) || defined(_WCHAR_T) || defined(_WCHAR_T_DEFINED) || defined (__WCHAR_TYPE__)) && !defined(LTC_NO_WCHAR)
717 #if defined(__WCHAR_MAX__)
718 #define LTC_WCHAR_MAX __WCHAR_MAX__
719 #else
720 #include <wchar.h>
721 #define LTC_WCHAR_MAX WCHAR_MAX
722 #endif
723 /* please note that it might happen that LTC_WCHAR_MAX is undefined */
724 #else
725 typedef ulong32 wchar_t;
726 #define LTC_WCHAR_MAX 0xFFFFFFFF
727 #endif
728
729 int der_encode_utf8_string(const wchar_t *in, unsigned long inlen,
730 unsigned char *out, unsigned long *outlen);
731
732 int der_decode_utf8_string(const unsigned char *in, unsigned long inlen,
733 wchar_t *out, unsigned long *outlen);
734 unsigned long der_utf8_charsize(const wchar_t c);
735 int der_length_utf8_string(const wchar_t *in, unsigned long noctets, unsigned long *outlen);
736
737
738 /* CHOICE */
739 int der_decode_choice(const unsigned char *in, unsigned long *inlen,
740 ltc_asn1_list *list, unsigned long outlen);
741
742 /* UTCTime */
743 typedef struct {
744 unsigned YY, /* year */
745 MM, /* month */
746 DD, /* day */
747 hh, /* hour */
748 mm, /* minute */
749 ss, /* second */
750 off_dir, /* timezone offset direction 0 == +, 1 == - */
751 off_hh, /* timezone offset hours */
752 off_mm; /* timezone offset minutes */
753 } ltc_utctime;
754
755 int der_encode_utctime(const ltc_utctime *utctime,
756 unsigned char *out, unsigned long *outlen);
757
758 int der_decode_utctime(const unsigned char *in, unsigned long *inlen,
759 ltc_utctime *out);
760
761 int der_length_utctime(const ltc_utctime *utctime, unsigned long *outlen);
762
763 /* GeneralizedTime */
764 typedef struct {
765 unsigned YYYY, /* year */
766 MM, /* month */
767 DD, /* day */
768 hh, /* hour */
769 mm, /* minute */
770 ss, /* second */
771 fs, /* fractional seconds */
772 off_dir, /* timezone offset direction 0 == +, 1 == - */
773 off_hh, /* timezone offset hours */
774 off_mm; /* timezone offset minutes */
775 } ltc_generalizedtime;
776
777 int der_encode_generalizedtime(const ltc_generalizedtime *gtime,
778 unsigned char *out, unsigned long *outlen);
779
780 int der_decode_generalizedtime(const unsigned char *in, unsigned long *inlen,
781 ltc_generalizedtime *out);
782
783 int der_length_generalizedtime(const ltc_generalizedtime *gtime, unsigned long *outlen);
784
785 #endif
This page took 0.065682 seconds and 4 git commands to generate.