Mercurial > dropbear
comparison libtomcrypt/src/headers/tomcrypt_pk.h @ 389:5ff8218bcee9
propagate from branch 'au.asn.ucc.matt.ltm.dropbear' (head 2af95f00ebd5bb7a28b3817db1218442c935388e)
to branch 'au.asn.ucc.matt.dropbear' (head ecd779509ef23a8cdf64888904fc9b31d78aa933)
author | Matt Johnston <matt@ucc.asn.au> |
---|---|
date | Thu, 11 Jan 2007 03:14:55 +0000 |
parents | 0cbe8f6dbf9e |
children | f849a5ca2efc |
comparison
equal
deleted
inserted
replaced
388:fb54020f78e1 | 389:5ff8218bcee9 |
---|---|
1 /* ---- NUMBER THEORY ---- */ | |
2 | |
3 enum { | |
4 PK_PUBLIC=0, | |
5 PK_PRIVATE=1 | |
6 }; | |
7 | |
8 int rand_prime(void *N, long len, prng_state *prng, int wprng); | |
9 | |
10 /* ---- RSA ---- */ | |
11 #ifdef MRSA | |
12 | |
13 /* Min and Max RSA key sizes (in bits) */ | |
14 #define MIN_RSA_SIZE 1024 | |
15 #define MAX_RSA_SIZE 4096 | |
16 | |
17 /** RSA PKCS style key */ | |
18 typedef struct Rsa_key { | |
19 /** Type of key, PK_PRIVATE or PK_PUBLIC */ | |
20 int type; | |
21 /** The public exponent */ | |
22 void *e; | |
23 /** The private exponent */ | |
24 void *d; | |
25 /** The modulus */ | |
26 void *N; | |
27 /** The p factor of N */ | |
28 void *p; | |
29 /** The q factor of N */ | |
30 void *q; | |
31 /** The 1/q mod p CRT param */ | |
32 void *qP; | |
33 /** The d mod (p - 1) CRT param */ | |
34 void *dP; | |
35 /** The d mod (q - 1) CRT param */ | |
36 void *dQ; | |
37 } rsa_key; | |
38 | |
39 int rsa_make_key(prng_state *prng, int wprng, int size, long e, rsa_key *key); | |
40 | |
41 int rsa_exptmod(const unsigned char *in, unsigned long inlen, | |
42 unsigned char *out, unsigned long *outlen, int which, | |
43 rsa_key *key); | |
44 | |
45 void rsa_free(rsa_key *key); | |
46 | |
47 /* These use PKCS #1 v2.0 padding */ | |
48 #define rsa_encrypt_key(_in, _inlen, _out, _outlen, _lparam, _lparamlen, _prng, _prng_idx, _hash_idx, _key) \ | |
49 rsa_encrypt_key_ex(_in, _inlen, _out, _outlen, _lparam, _lparamlen, _prng, _prng_idx, _hash_idx, LTC_PKCS_1_OAEP, _key) | |
50 | |
51 #define rsa_decrypt_key(_in, _inlen, _out, _outlen, _lparam, _lparamlen, _hash_idx, _stat, _key) \ | |
52 rsa_decrypt_key_ex(_in, _inlen, _out, _outlen, _lparam, _lparamlen, _hash_idx, LTC_PKCS_1_OAEP, _stat, _key) | |
53 | |
54 #define rsa_sign_hash(_in, _inlen, _out, _outlen, _prng, _prng_idx, _hash_idx, _saltlen, _key) \ | |
55 rsa_sign_hash_ex(_in, _inlen, _out, _outlen, LTC_PKCS_1_PSS, _prng, _prng_idx, _hash_idx, _saltlen, _key) | |
56 | |
57 #define rsa_verify_hash(_sig, _siglen, _hash, _hashlen, _hash_idx, _saltlen, _stat, _key) \ | |
58 rsa_verify_hash_ex(_sig, _siglen, _hash, _hashlen, LTC_PKCS_1_PSS, _hash_idx, _saltlen, _stat, _key) | |
59 | |
60 /* These can be switched between PKCS #1 v2.x and PKCS #1 v1.5 paddings */ | |
61 int rsa_encrypt_key_ex(const unsigned char *in, unsigned long inlen, | |
62 unsigned char *out, unsigned long *outlen, | |
63 const unsigned char *lparam, unsigned long lparamlen, | |
64 prng_state *prng, int prng_idx, int hash_idx, int padding, rsa_key *key); | |
65 | |
66 int rsa_decrypt_key_ex(const unsigned char *in, unsigned long inlen, | |
67 unsigned char *out, unsigned long *outlen, | |
68 const unsigned char *lparam, unsigned long lparamlen, | |
69 int hash_idx, int padding, | |
70 int *stat, rsa_key *key); | |
71 | |
72 int rsa_sign_hash_ex(const unsigned char *in, unsigned long inlen, | |
73 unsigned char *out, unsigned long *outlen, | |
74 int padding, | |
75 prng_state *prng, int prng_idx, | |
76 int hash_idx, unsigned long saltlen, | |
77 rsa_key *key); | |
78 | |
79 int rsa_verify_hash_ex(const unsigned char *sig, unsigned long siglen, | |
80 const unsigned char *hash, unsigned long hashlen, | |
81 int padding, | |
82 int hash_idx, unsigned long saltlen, | |
83 int *stat, rsa_key *key); | |
84 | |
85 /* PKCS #1 import/export */ | |
86 int rsa_export(unsigned char *out, unsigned long *outlen, int type, rsa_key *key); | |
87 int rsa_import(const unsigned char *in, unsigned long inlen, rsa_key *key); | |
88 | |
89 #endif | |
90 | |
91 /* ---- Katja ---- */ | |
92 #ifdef MKAT | |
93 | |
94 /* Min and Max KAT key sizes (in bits) */ | |
95 #define MIN_KAT_SIZE 1024 | |
96 #define MAX_KAT_SIZE 4096 | |
97 | |
98 /** Katja PKCS style key */ | |
99 typedef struct KAT_key { | |
100 /** Type of key, PK_PRIVATE or PK_PUBLIC */ | |
101 int type; | |
102 /** The private exponent */ | |
103 void *d; | |
104 /** The modulus */ | |
105 void *N; | |
106 /** The p factor of N */ | |
107 void *p; | |
108 /** The q factor of N */ | |
109 void *q; | |
110 /** The 1/q mod p CRT param */ | |
111 void *qP; | |
112 /** The d mod (p - 1) CRT param */ | |
113 void *dP; | |
114 /** The d mod (q - 1) CRT param */ | |
115 void *dQ; | |
116 /** The pq param */ | |
117 void *pq; | |
118 } katja_key; | |
119 | |
120 int katja_make_key(prng_state *prng, int wprng, int size, katja_key *key); | |
121 | |
122 int katja_exptmod(const unsigned char *in, unsigned long inlen, | |
123 unsigned char *out, unsigned long *outlen, int which, | |
124 katja_key *key); | |
125 | |
126 void katja_free(katja_key *key); | |
127 | |
128 /* These use PKCS #1 v2.0 padding */ | |
129 int katja_encrypt_key(const unsigned char *in, unsigned long inlen, | |
130 unsigned char *out, unsigned long *outlen, | |
131 const unsigned char *lparam, unsigned long lparamlen, | |
132 prng_state *prng, int prng_idx, int hash_idx, katja_key *key); | |
133 | |
134 int katja_decrypt_key(const unsigned char *in, unsigned long inlen, | |
135 unsigned char *out, unsigned long *outlen, | |
136 const unsigned char *lparam, unsigned long lparamlen, | |
137 int hash_idx, int *stat, | |
138 katja_key *key); | |
139 | |
140 /* PKCS #1 import/export */ | |
141 int katja_export(unsigned char *out, unsigned long *outlen, int type, katja_key *key); | |
142 int katja_import(const unsigned char *in, unsigned long inlen, katja_key *key); | |
143 | |
144 #endif | |
145 | |
146 /* ---- ECC Routines ---- */ | |
147 #ifdef MECC | |
148 | |
149 /* size of our temp buffers for exported keys */ | |
150 #define ECC_BUF_SIZE 256 | |
151 | |
152 /* max private key size */ | |
153 #define ECC_MAXSIZE 66 | |
154 | |
155 /** Structure defines a NIST GF(p) curve */ | |
156 typedef struct { | |
157 /** The size of the curve in octets */ | |
158 int size; | |
159 | |
160 /** name of curve */ | |
161 char *name; | |
162 | |
163 /** The prime that defines the field the curve is in (encoded in hex) */ | |
164 char *prime; | |
165 | |
166 /** The fields B param (hex) */ | |
167 char *B; | |
168 | |
169 /** The order of the curve (hex) */ | |
170 char *order; | |
171 | |
172 /** The x co-ordinate of the base point on the curve (hex) */ | |
173 char *Gx; | |
174 | |
175 /** The y co-ordinate of the base point on the curve (hex) */ | |
176 char *Gy; | |
177 } ltc_ecc_set_type; | |
178 | |
179 /** 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 */ | |
180 typedef struct { | |
181 /** The x co-ordinate */ | |
182 void *x; | |
183 | |
184 /** The y co-ordinate */ | |
185 void *y; | |
186 | |
187 /** The z co-ordinate */ | |
188 void *z; | |
189 } ecc_point; | |
190 | |
191 /** An ECC key */ | |
192 typedef struct { | |
193 /** Type of key, PK_PRIVATE or PK_PUBLIC */ | |
194 int type; | |
195 | |
196 /** Index into the ltc_ecc_sets[] for the parameters of this curve; if -1, then this key is using user supplied curve in dp */ | |
197 int idx; | |
198 | |
199 /** pointer to domain parameters; either points to NIST curves (identified by idx >= 0) or user supplied curve */ | |
200 const ltc_ecc_set_type *dp; | |
201 | |
202 /** The public key */ | |
203 ecc_point pubkey; | |
204 | |
205 /** The private key */ | |
206 void *k; | |
207 } ecc_key; | |
208 | |
209 /** the ECC params provided */ | |
210 extern const ltc_ecc_set_type ltc_ecc_sets[]; | |
211 | |
212 int ecc_test(void); | |
213 void ecc_sizes(int *low, int *high); | |
214 int ecc_get_size(ecc_key *key); | |
215 | |
216 int ecc_make_key(prng_state *prng, int wprng, int keysize, ecc_key *key); | |
217 int ecc_make_key_ex(prng_state *prng, int wprng, ecc_key *key, const ltc_ecc_set_type *dp); | |
218 void ecc_free(ecc_key *key); | |
219 | |
220 int ecc_export(unsigned char *out, unsigned long *outlen, int type, ecc_key *key); | |
221 int ecc_import(const unsigned char *in, unsigned long inlen, ecc_key *key); | |
222 int ecc_import_ex(const unsigned char *in, unsigned long inlen, ecc_key *key, const ltc_ecc_set_type *dp); | |
223 | |
224 int ecc_ansi_x963_export(ecc_key *key, unsigned char *out, unsigned long *outlen); | |
225 int ecc_ansi_x963_import(const unsigned char *in, unsigned long inlen, ecc_key *key); | |
226 int ecc_ansi_x963_import_ex(const unsigned char *in, unsigned long inlen, ecc_key *key, ltc_ecc_set_type *dp); | |
227 | |
228 int ecc_shared_secret(ecc_key *private_key, ecc_key *public_key, | |
229 unsigned char *out, unsigned long *outlen); | |
230 | |
231 int ecc_encrypt_key(const unsigned char *in, unsigned long inlen, | |
232 unsigned char *out, unsigned long *outlen, | |
233 prng_state *prng, int wprng, int hash, | |
234 ecc_key *key); | |
235 | |
236 int ecc_decrypt_key(const unsigned char *in, unsigned long inlen, | |
237 unsigned char *out, unsigned long *outlen, | |
238 ecc_key *key); | |
239 | |
240 int ecc_sign_hash(const unsigned char *in, unsigned long inlen, | |
241 unsigned char *out, unsigned long *outlen, | |
242 prng_state *prng, int wprng, ecc_key *key); | |
243 | |
244 int ecc_verify_hash(const unsigned char *sig, unsigned long siglen, | |
245 const unsigned char *hash, unsigned long hashlen, | |
246 int *stat, ecc_key *key); | |
247 | |
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_is_valid_idx(int n); | |
252 | |
253 /* point ops (mp == montgomery digit) */ | |
254 #if !defined(MECC_ACCEL) || defined(LTM_DESC) || defined(GMP_DESC) | |
255 /* R = 2P */ | |
256 int ltc_ecc_projective_dbl_point(ecc_point *P, ecc_point *R, void *modulus, void *mp); | |
257 | |
258 /* R = P + Q */ | |
259 int ltc_ecc_projective_add_point(ecc_point *P, ecc_point *Q, ecc_point *R, void *modulus, void *mp); | |
260 #endif | |
261 | |
262 #if defined(MECC_FP) | |
263 int ltc_ecc_fp_mulmod(void *k, ecc_point *G, ecc_point *R, void *modulus, int map); | |
264 int ltc_ecc_fp_save_state(unsigned char **out, unsigned long *outlen); | |
265 int ltc_ecc_fp_restore_state(unsigned char *in, unsigned long inlen); | |
266 void ltc_ecc_fp_free(void); | |
267 #endif | |
268 | |
269 /* R = kG */ | |
270 int ltc_ecc_mulmod(void *k, ecc_point *G, ecc_point *R, void *modulus, int map); | |
271 | |
272 #ifdef LTC_ECC_SHAMIR | |
273 /* kA*A + kB*B = C */ | |
274 int ltc_ecc_mul2add(ecc_point *A, void *kA, | |
275 ecc_point *B, void *kB, | |
276 ecc_point *C, | |
277 void *modulus); | |
278 | |
279 #ifdef MECC_FP | |
280 int ltc_ecc_fp_mul2add(ecc_point *A, void *kA, | |
281 ecc_point *B, void *kB, | |
282 ecc_point *C, void *modulus); | |
283 #endif | |
284 | |
285 #endif | |
286 | |
287 | |
288 /* map P to affine from projective */ | |
289 int ltc_ecc_map(ecc_point *P, void *modulus, void *mp); | |
290 | |
291 #endif | |
292 | |
293 #ifdef MDSA | |
294 | |
295 /* Max diff between group and modulus size in bytes */ | |
296 #define MDSA_DELTA 512 | |
297 | |
298 /* Max DSA group size in bytes (default allows 4k-bit groups) */ | |
299 #define MDSA_MAX_GROUP 512 | |
300 | |
301 /** DSA key structure */ | |
302 typedef struct { | |
303 /** The key type, PK_PRIVATE or PK_PUBLIC */ | |
304 int type; | |
305 | |
306 /** The order of the sub-group used in octets */ | |
307 int qord; | |
308 | |
309 /** The generator */ | |
310 void *g; | |
311 | |
312 /** The prime used to generate the sub-group */ | |
313 void *q; | |
314 | |
315 /** The large prime that generats the field the contains the sub-group */ | |
316 void *p; | |
317 | |
318 /** The private key */ | |
319 void *x; | |
320 | |
321 /** The public key */ | |
322 void *y; | |
323 } dsa_key; | |
324 | |
325 int dsa_make_key(prng_state *prng, int wprng, int group_size, int modulus_size, dsa_key *key); | |
326 void dsa_free(dsa_key *key); | |
327 | |
328 int dsa_sign_hash_raw(const unsigned char *in, unsigned long inlen, | |
329 void *r, void *s, | |
330 prng_state *prng, int wprng, dsa_key *key); | |
331 | |
332 int dsa_sign_hash(const unsigned char *in, unsigned long inlen, | |
333 unsigned char *out, unsigned long *outlen, | |
334 prng_state *prng, int wprng, dsa_key *key); | |
335 | |
336 int dsa_verify_hash_raw( void *r, void *s, | |
337 const unsigned char *hash, unsigned long hashlen, | |
338 int *stat, dsa_key *key); | |
339 | |
340 int dsa_verify_hash(const unsigned char *sig, unsigned long siglen, | |
341 const unsigned char *hash, unsigned long hashlen, | |
342 int *stat, dsa_key *key); | |
343 | |
344 int dsa_encrypt_key(const unsigned char *in, unsigned long inlen, | |
345 unsigned char *out, unsigned long *outlen, | |
346 prng_state *prng, int wprng, int hash, | |
347 dsa_key *key); | |
348 | |
349 int dsa_decrypt_key(const unsigned char *in, unsigned long inlen, | |
350 unsigned char *out, unsigned long *outlen, | |
351 dsa_key *key); | |
352 | |
353 int dsa_import(const unsigned char *in, unsigned long inlen, dsa_key *key); | |
354 int dsa_export(unsigned char *out, unsigned long *outlen, int type, dsa_key *key); | |
355 int dsa_verify_key(dsa_key *key, int *stat); | |
356 | |
357 int dsa_shared_secret(void *private_key, void *base, | |
358 dsa_key *public_key, | |
359 unsigned char *out, unsigned long *outlen); | |
360 #endif | |
361 | |
362 #ifdef LTC_DER | |
363 /* DER handling */ | |
364 | |
365 enum { | |
366 LTC_ASN1_EOL, | |
367 LTC_ASN1_BOOLEAN, | |
368 LTC_ASN1_INTEGER, | |
369 LTC_ASN1_SHORT_INTEGER, | |
370 LTC_ASN1_BIT_STRING, | |
371 LTC_ASN1_OCTET_STRING, | |
372 LTC_ASN1_NULL, | |
373 LTC_ASN1_OBJECT_IDENTIFIER, | |
374 LTC_ASN1_IA5_STRING, | |
375 LTC_ASN1_PRINTABLE_STRING, | |
376 LTC_ASN1_UTF8_STRING, | |
377 LTC_ASN1_UTCTIME, | |
378 LTC_ASN1_CHOICE, | |
379 LTC_ASN1_SEQUENCE, | |
380 LTC_ASN1_SET, | |
381 LTC_ASN1_SETOF | |
382 }; | |
383 | |
384 /** A LTC ASN.1 list type */ | |
385 typedef struct ltc_asn1_list_ { | |
386 /** The LTC ASN.1 enumerated type identifier */ | |
387 int type; | |
388 /** The data to encode or place for decoding */ | |
389 void *data; | |
390 /** The size of the input or resulting output */ | |
391 unsigned long size; | |
392 /** The used flag, this is used by the CHOICE ASN.1 type to indicate which choice was made */ | |
393 int used; | |
394 /** prev/next entry in the list */ | |
395 struct ltc_asn1_list_ *prev, *next, *child, *parent; | |
396 } ltc_asn1_list; | |
397 | |
398 #define LTC_SET_ASN1(list, index, Type, Data, Size) \ | |
399 do { \ | |
400 int LTC_MACRO_temp = (index); \ | |
401 ltc_asn1_list *LTC_MACRO_list = (list); \ | |
402 LTC_MACRO_list[LTC_MACRO_temp].type = (Type); \ | |
403 LTC_MACRO_list[LTC_MACRO_temp].data = (void*)(Data); \ | |
404 LTC_MACRO_list[LTC_MACRO_temp].size = (Size); \ | |
405 LTC_MACRO_list[LTC_MACRO_temp].used = 0; \ | |
406 } while (0); | |
407 | |
408 /* SEQUENCE */ | |
409 int der_encode_sequence_ex(ltc_asn1_list *list, unsigned long inlen, | |
410 unsigned char *out, unsigned long *outlen, int type_of); | |
411 | |
412 #define der_encode_sequence(list, inlen, out, outlen) der_encode_sequence_ex(list, inlen, out, outlen, LTC_ASN1_SEQUENCE) | |
413 | |
414 int der_decode_sequence_ex(const unsigned char *in, unsigned long inlen, | |
415 ltc_asn1_list *list, unsigned long outlen, int ordered); | |
416 | |
417 #define der_decode_sequence(in, inlen, list, outlen) der_decode_sequence_ex(in, inlen, list, outlen, 1) | |
418 | |
419 int der_length_sequence(ltc_asn1_list *list, unsigned long inlen, | |
420 unsigned long *outlen); | |
421 | |
422 /* SET */ | |
423 #define der_decode_set(in, inlen, list, outlen) der_decode_sequence_ex(in, inlen, list, outlen, 0) | |
424 #define der_length_set der_length_sequence | |
425 int der_encode_set(ltc_asn1_list *list, unsigned long inlen, | |
426 unsigned char *out, unsigned long *outlen); | |
427 | |
428 int der_encode_setof(ltc_asn1_list *list, unsigned long inlen, | |
429 unsigned char *out, unsigned long *outlen); | |
430 | |
431 /* VA list handy helpers with triplets of <type, size, data> */ | |
432 int der_encode_sequence_multi(unsigned char *out, unsigned long *outlen, ...); | |
433 int der_decode_sequence_multi(const unsigned char *in, unsigned long inlen, ...); | |
434 | |
435 /* FLEXI DECODER handle unknown list decoder */ | |
436 int der_decode_sequence_flexi(const unsigned char *in, unsigned long *inlen, ltc_asn1_list **out); | |
437 void der_free_sequence_flexi(ltc_asn1_list *list); | |
438 void der_sequence_free(ltc_asn1_list *in); | |
439 | |
440 /* BOOLEAN */ | |
441 int der_length_boolean(unsigned long *outlen); | |
442 int der_encode_boolean(int in, | |
443 unsigned char *out, unsigned long *outlen); | |
444 int der_decode_boolean(const unsigned char *in, unsigned long inlen, | |
445 int *out); | |
446 /* INTEGER */ | |
447 int der_encode_integer(void *num, unsigned char *out, unsigned long *outlen); | |
448 int der_decode_integer(const unsigned char *in, unsigned long inlen, void *num); | |
449 int der_length_integer(void *num, unsigned long *len); | |
450 | |
451 /* INTEGER -- handy for 0..2^32-1 values */ | |
452 int der_decode_short_integer(const unsigned char *in, unsigned long inlen, unsigned long *num); | |
453 int der_encode_short_integer(unsigned long num, unsigned char *out, unsigned long *outlen); | |
454 int der_length_short_integer(unsigned long num, unsigned long *outlen); | |
455 | |
456 /* BIT STRING */ | |
457 int der_encode_bit_string(const unsigned char *in, unsigned long inlen, | |
458 unsigned char *out, unsigned long *outlen); | |
459 int der_decode_bit_string(const unsigned char *in, unsigned long inlen, | |
460 unsigned char *out, unsigned long *outlen); | |
461 int der_length_bit_string(unsigned long nbits, unsigned long *outlen); | |
462 | |
463 /* OCTET STRING */ | |
464 int der_encode_octet_string(const unsigned char *in, unsigned long inlen, | |
465 unsigned char *out, unsigned long *outlen); | |
466 int der_decode_octet_string(const unsigned char *in, unsigned long inlen, | |
467 unsigned char *out, unsigned long *outlen); | |
468 int der_length_octet_string(unsigned long noctets, unsigned long *outlen); | |
469 | |
470 /* OBJECT IDENTIFIER */ | |
471 int der_encode_object_identifier(unsigned long *words, unsigned long nwords, | |
472 unsigned char *out, unsigned long *outlen); | |
473 int der_decode_object_identifier(const unsigned char *in, unsigned long inlen, | |
474 unsigned long *words, unsigned long *outlen); | |
475 int der_length_object_identifier(unsigned long *words, unsigned long nwords, unsigned long *outlen); | |
476 unsigned long der_object_identifier_bits(unsigned long x); | |
477 | |
478 /* IA5 STRING */ | |
479 int der_encode_ia5_string(const unsigned char *in, unsigned long inlen, | |
480 unsigned char *out, unsigned long *outlen); | |
481 int der_decode_ia5_string(const unsigned char *in, unsigned long inlen, | |
482 unsigned char *out, unsigned long *outlen); | |
483 int der_length_ia5_string(const unsigned char *octets, unsigned long noctets, unsigned long *outlen); | |
484 | |
485 int der_ia5_char_encode(int c); | |
486 int der_ia5_value_decode(int v); | |
487 | |
488 /* Printable STRING */ | |
489 int der_encode_printable_string(const unsigned char *in, unsigned long inlen, | |
490 unsigned char *out, unsigned long *outlen); | |
491 int der_decode_printable_string(const unsigned char *in, unsigned long inlen, | |
492 unsigned char *out, unsigned long *outlen); | |
493 int der_length_printable_string(const unsigned char *octets, unsigned long noctets, unsigned long *outlen); | |
494 | |
495 int der_printable_char_encode(int c); | |
496 int der_printable_value_decode(int v); | |
497 | |
498 /* UTF-8 */ | |
499 #if (defined(SIZE_MAX) || __STDC_VERSION__ >= 199901L || defined(WCHAR_MAX) || defined(_WCHAR_T) || defined(_WCHAR_T_DEFINED)) && !defined(LTC_NO_WCHAR) | |
500 #include <wchar.h> | |
501 #else | |
502 typedef ulong32 wchar_t; | |
503 #endif | |
504 | |
505 int der_encode_utf8_string(const wchar_t *in, unsigned long inlen, | |
506 unsigned char *out, unsigned long *outlen); | |
507 | |
508 int der_decode_utf8_string(const unsigned char *in, unsigned long inlen, | |
509 wchar_t *out, unsigned long *outlen); | |
510 unsigned long der_utf8_charsize(const wchar_t c); | |
511 int der_length_utf8_string(const wchar_t *in, unsigned long noctets, unsigned long *outlen); | |
512 | |
513 | |
514 /* CHOICE */ | |
515 int der_decode_choice(const unsigned char *in, unsigned long *inlen, | |
516 ltc_asn1_list *list, unsigned long outlen); | |
517 | |
518 /* UTCTime */ | |
519 typedef struct { | |
520 unsigned YY, /* year */ | |
521 MM, /* month */ | |
522 DD, /* day */ | |
523 hh, /* hour */ | |
524 mm, /* minute */ | |
525 ss, /* second */ | |
526 off_dir, /* timezone offset direction 0 == +, 1 == - */ | |
527 off_hh, /* timezone offset hours */ | |
528 off_mm; /* timezone offset minutes */ | |
529 } ltc_utctime; | |
530 | |
531 int der_encode_utctime(ltc_utctime *utctime, | |
532 unsigned char *out, unsigned long *outlen); | |
533 | |
534 int der_decode_utctime(const unsigned char *in, unsigned long *inlen, | |
535 ltc_utctime *out); | |
536 | |
537 int der_length_utctime(ltc_utctime *utctime, unsigned long *outlen); | |
538 | |
539 | |
540 #endif | |
541 | |
542 /* $Source: /cvs/libtom/libtomcrypt/src/headers/tomcrypt_pk.h,v $ */ | |
543 /* $Revision: 1.77 $ */ | |
544 /* $Date: 2006/12/03 00:39:56 $ */ |