comparison src/pk/rsa/rsa_export.c @ 209:39d5d58461d6 libtomcrypt-orig LTC_1.05

Import of libtomcrypt 1.05
author Matt Johnston <matt@ucc.asn.au>
date Wed, 06 Jul 2005 03:53:40 +0000
parents 1c15b283127b
children
comparison
equal deleted inserted replaced
191:1c15b283127b 209:39d5d58461d6
25 @param key The RSA key to export 25 @param key The RSA key to export
26 @return CRYPT_OK if successful 26 @return CRYPT_OK if successful
27 */ 27 */
28 int rsa_export(unsigned char *out, unsigned long *outlen, int type, rsa_key *key) 28 int rsa_export(unsigned char *out, unsigned long *outlen, int type, rsa_key *key)
29 { 29 {
30 int err, x; 30 int err;
31 unsigned long zero=0;
31 32
32 LTC_ARGCHK(out != NULL); 33 LTC_ARGCHK(out != NULL);
33 LTC_ARGCHK(outlen != NULL); 34 LTC_ARGCHK(outlen != NULL);
34 LTC_ARGCHK(key != NULL); 35 LTC_ARGCHK(key != NULL);
35 36
36 /* type valid? */ 37 /* type valid? */
37 if (!(key->type == PK_PRIVATE) && (type == PK_PRIVATE)) { 38 if (!(key->type == PK_PRIVATE) && (type == PK_PRIVATE)) {
38 return CRYPT_PK_INVALID_TYPE; 39 return CRYPT_PK_INVALID_TYPE;
39 } 40 }
40 if (*outlen < 4) {
41 return CRYPT_BUFFER_OVERFLOW;
42 }
43
44 /* Mental Note: push space for the header 0x30 0x82 LL LL (LL = length of packet EXcluding 4 bytes)
45 * we assume LL > 255 which is true since the smallest RSA key has a 128-byte modulus (1024-bit)
46 */
47 *outlen -= 4;
48 41
49 if (type == PK_PRIVATE) { 42 if (type == PK_PRIVATE) {
50 /* private key */ 43 /* private key */
51 mp_int zero;
52
53 /* first INTEGER == 0 to signify two-prime RSA */
54 if ((err = mp_init(&zero)) != MP_OKAY) {
55 return mpi_to_ltc_error(err);
56 }
57
58 /* output is 44 /* output is
59 Version, n, e, d, p, q, d mod (p-1), d mod (q - 1), 1/q mod p 45 Version, n, e, d, p, q, d mod (p-1), d mod (q - 1), 1/q mod p
60 */ 46 */
61 if ((err = der_put_multi_integer( 47 if ((err = der_encode_sequence_multi(out, outlen,
62 out+4, outlen, &zero, &key->N, &key->e, 48 LTC_ASN1_SHORT_INTEGER, 1UL, &zero,
63 &key->d, &key->p, &key->q, &key->dP, 49 LTC_ASN1_INTEGER, 1UL, &key->N,
64 &key->dQ, &key->qP, NULL)) != CRYPT_OK) { 50 LTC_ASN1_INTEGER, 1UL, &key->e,
65 mp_clear(&zero); 51 LTC_ASN1_INTEGER, 1UL, &key->d,
52 LTC_ASN1_INTEGER, 1UL, &key->p,
53 LTC_ASN1_INTEGER, 1UL, &key->q,
54 LTC_ASN1_INTEGER, 1UL, &key->dP,
55 LTC_ASN1_INTEGER, 1UL, &key->dQ,
56 LTC_ASN1_INTEGER, 1UL, &key->qP,
57 LTC_ASN1_EOL, 0UL, NULL)) != CRYPT_OK) {
66 return err; 58 return err;
67 } 59 }
68 60
69 /* clear zero and return */ 61 /* clear zero and return */
70 mp_clear(&zero); 62 return CRYPT_OK;
71 } else { 63 } else {
72 /* public key */ 64 /* public key */
73 if ((err = der_put_multi_integer(out+4, outlen, &key->N, &key->e, NULL)) != CRYPT_OK) { 65 return der_encode_sequence_multi(out, outlen,
74 return err; 66 LTC_ASN1_INTEGER, 1UL, &key->N,
75 } 67 LTC_ASN1_INTEGER, 1UL, &key->e,
68 LTC_ASN1_EOL, 0UL, NULL);
76 } 69 }
77
78 /* store the header */
79 out[0] = 0x30;
80 if (*outlen < 256) {
81 /* shift the output up one byte if the header is only 3 bytes */
82 for (x = 0; x < *outlen; x++) {
83 out[x+3] = out[x+4];
84 }
85 out[1] = 0x81;
86 out[2] = (*outlen & 255);
87 *outlen += 3;
88 } else {
89 out[1] = 0x82;
90 out[2] = (*outlen >> 8) & 255;
91 out[3] = (*outlen & 255);
92 *outlen += 4;
93 }
94 return err;
95 } 70 }
96 71
97 #endif /* MRSA */ 72 #endif /* MRSA */
98 73
74 /* $Source: /cvs/libtom/libtomcrypt/src/pk/rsa/rsa_export.c,v $ */
75 /* $Revision: 1.11 $ */
76 /* $Date: 2005/06/04 01:42:48 $ */