Home | History | Annotate | Download | only in headers
      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 $ */
    545