rsa.c
上传用户:lyxiangda
上传日期:2007-01-12
资源大小:3042k
文件大小:13k
源码类别:

CA认证

开发平台:

WINDOWS

  1. /*
  2.  * The contents of this file are subject to the Mozilla Public
  3.  * License Version 1.1 (the "License"); you may not use this file
  4.  * except in compliance with the License. You may obtain a copy of
  5.  * the License at http://www.mozilla.org/MPL/
  6.  * 
  7.  * Software distributed under the License is distributed on an "AS
  8.  * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
  9.  * implied. See the License for the specific language governing
  10.  * rights and limitations under the License.
  11.  * 
  12.  * The Original Code is the Netscape security libraries.
  13.  * 
  14.  * The Initial Developer of the Original Code is Netscape
  15.  * Communications Corporation.  Portions created by Netscape are 
  16.  * Copyright (C) 1994-2000 Netscape Communications Corporation.  All
  17.  * Rights Reserved.
  18.  * 
  19.  * Contributor(s):
  20.  * 
  21.  * Alternatively, the contents of this file may be used under the
  22.  * terms of the GNU General Public License Version 2 or later (the
  23.  * "GPL"), in which case the provisions of the GPL are applicable 
  24.  * instead of those above.  If you wish to allow use of your 
  25.  * version of this file only under the terms of the GPL and not to
  26.  * allow others to use your version of this file under the MPL,
  27.  * indicate your decision by deleting the provisions above and
  28.  * replace them with the notice and other provisions required by
  29.  * the GPL.  If you do not delete the provisions above, a recipient
  30.  * may use your version of this file under either the MPL or the
  31.  * GPL.
  32.  *
  33.  */
  34. /*
  35.  * RSA key generation, public key op, private key op.
  36.  *
  37.  * $Id: rsa.c,v 1.17 2000/10/02 17:39:37 mcgreer%netscape.com Exp $
  38.  */
  39. #include "secerr.h"
  40. #include "blapi.h"
  41. #include "mpi.h"
  42. #include "mpprime.h"
  43. #include "secmpi.h"
  44. #include "secitem.h"
  45. /*
  46. ** RSA encryption/decryption. When encrypting/decrypting the output
  47. ** buffer must be at least the size of the public key modulus.
  48. */
  49. static SECStatus
  50. rsa_keygen_from_primes(mp_int *p, mp_int *q, mp_int *e, RSAPrivateKey *key)
  51. {
  52.     mp_int n, d, phi;
  53.     mp_int psub1, qsub1, tmp;
  54.     mp_err   err = MP_OKAY;
  55.     SECStatus rv = SECSuccess;
  56.     MP_DIGITS(&n)     = 0;
  57.     MP_DIGITS(&d)     = 0;
  58.     MP_DIGITS(&phi)   = 0;
  59.     MP_DIGITS(&psub1) = 0;
  60.     MP_DIGITS(&qsub1) = 0;
  61.     MP_DIGITS(&tmp)   = 0;
  62.     CHECK_MPI_OK( mp_init(&n)     );
  63.     CHECK_MPI_OK( mp_init(&d)     );
  64.     CHECK_MPI_OK( mp_init(&phi)   );
  65.     CHECK_MPI_OK( mp_init(&psub1) );
  66.     CHECK_MPI_OK( mp_init(&qsub1) );
  67.     CHECK_MPI_OK( mp_init(&tmp)   );
  68.     /* 1.  Compute n = p*q */
  69.     CHECK_MPI_OK( mp_mul(p, q, &n) );
  70.     /* 2.  Compute phi = (p-1)*(q-1) */
  71.     CHECK_MPI_OK( mp_sub_d(p, 1, &psub1) );
  72.     CHECK_MPI_OK( mp_sub_d(q, 1, &qsub1) );
  73.     CHECK_MPI_OK( mp_mul(&psub1, &qsub1, &phi) );
  74.     /* 3.  Compute d = e**-1 mod(phi) using extended Euclidean algorithm */
  75.     CHECK_MPI_OK( mp_xgcd(e, &phi, &tmp, &d, NULL) );
  76.     CHECK_MPI_OK( mp_mod(&d, &phi, &d) );
  77.     /*     Verify that phi(n) and e have no common divisors */
  78.     if (mp_cmp_d(&tmp, 1) != 0) { 
  79. PORT_SetError(SEC_ERROR_NEED_RANDOM);
  80. rv = SECFailure;
  81. goto cleanup;
  82.     }
  83.     MPINT_TO_SECITEM(&n, &key->modulus, key->arena);
  84.     MPINT_TO_SECITEM(&d, &key->privateExponent, key->arena);
  85.     /* 4.  Compute exponent1 = d mod (p-1) */
  86.     CHECK_MPI_OK( mp_mod(&d, &psub1, &tmp) );
  87.     MPINT_TO_SECITEM(&tmp, &key->exponent1, key->arena);
  88.     /* 5.  Compute exponent2 = d mod (q-1) */
  89.     CHECK_MPI_OK( mp_mod(&d, &qsub1, &tmp) );
  90.     MPINT_TO_SECITEM(&tmp, &key->exponent2, key->arena);
  91.     /* 6.  Compute coefficient = q**-1 mod p */
  92.     CHECK_MPI_OK( mp_invmod(q, p, &tmp) );
  93.     MPINT_TO_SECITEM(&tmp, &key->coefficient, key->arena);
  94. cleanup:
  95.     mp_clear(&n);
  96.     mp_clear(&d);
  97.     mp_clear(&phi);
  98.     mp_clear(&psub1);
  99.     mp_clear(&qsub1);
  100.     mp_clear(&tmp);
  101.     if (err) {
  102. MP_TO_SEC_ERROR(err);
  103. rv = SECFailure;
  104.     }
  105.     return rv;
  106. }
  107. /*
  108. ** Generate and return a new RSA public and private key.
  109. ** Both keys are encoded in a single RSAPrivateKey structure.
  110. ** "cx" is the random number generator context
  111. ** "keySizeInBits" is the size of the key to be generated, in bits.
  112. **    512, 1024, etc.
  113. ** "publicExponent" when not NULL is a pointer to some data that
  114. **    represents the public exponent to use. The data is a byte
  115. **    encoded integer, in "big endian" order.
  116. */
  117. RSAPrivateKey *
  118. RSA_NewKey(int keySizeInBits, SECItem *publicExponent)
  119. {
  120.     unsigned char *pb = NULL, *qb = NULL;
  121.     unsigned int primeLen;
  122.     unsigned long counter;
  123.     mp_int p, q, e;
  124.     mp_err   err = MP_OKAY;
  125.     SECStatus rv = SECSuccess;
  126.     int prerr = 0;
  127.     RSAPrivateKey *key = NULL;
  128.     PRArenaPool *arena = NULL;
  129.     /* Require key size to be a multiple of 16 bits. */
  130.     if (!publicExponent || keySizeInBits % 16 != 0) {
  131. PORT_SetError(SEC_ERROR_INVALID_ARGS);
  132. return NULL;
  133.     }
  134.     /* length of primes p and q (in bytes) */
  135.     primeLen = keySizeInBits / (2 * BITS_PER_BYTE);
  136.     MP_DIGITS(&p) = 0;
  137.     MP_DIGITS(&q) = 0;
  138.     MP_DIGITS(&e) = 0;
  139.     CHECK_MPI_OK( mp_init(&p) );
  140.     CHECK_MPI_OK( mp_init(&q) );
  141.     CHECK_MPI_OK( mp_init(&e) );
  142.     /* 1. Allocate arena & key */
  143.     arena = PORT_NewArena(NSS_FREEBL_DEFAULT_CHUNKSIZE);
  144.     if (!arena) {
  145. PORT_SetError(SEC_ERROR_NO_MEMORY);
  146. return NULL;
  147.     }
  148.     key = (RSAPrivateKey *)PORT_ArenaZAlloc(arena, sizeof(RSAPrivateKey));
  149.     if (!key) {
  150. PORT_SetError(SEC_ERROR_NO_MEMORY);
  151. PORT_FreeArena(arena, PR_TRUE);
  152. return NULL;
  153.     }
  154.     key->arena = arena;
  155.     /* 2.  Set the version number (PKCS1 v1.5 says it should be zero) */
  156.     SECITEM_AllocItem(arena, &key->version, 1);
  157.     key->version.data[0] = 0;
  158.     /* 3.  Set the public exponent */
  159.     SECITEM_CopyItem(arena, &key->publicExponent, publicExponent);
  160.     SECITEM_TO_MPINT(*publicExponent, &e);
  161.     /* 4.  Generate primes p and q */
  162.     pb = PORT_Alloc(primeLen);
  163.     qb = PORT_Alloc(primeLen);
  164.     do {
  165. CHECK_SEC_OK( RNG_GenerateGlobalRandomBytes(pb, primeLen) );
  166. CHECK_SEC_OK( RNG_GenerateGlobalRandomBytes(qb, primeLen) );
  167. pb[0]          |= 0x80; /* set high-order bit */
  168. pb[primeLen-1] |= 0x01; /* set low-order bit  */
  169. qb[0]          |= 0x80; /* set high-order bit */
  170. qb[primeLen-1] |= 0x01; /* set low-order bit  */
  171. CHECK_MPI_OK( mp_read_unsigned_octets(&p, pb, primeLen) );
  172. CHECK_MPI_OK( mp_read_unsigned_octets(&q, qb, primeLen) );
  173. CHECK_MPI_OK( mpp_make_prime(&p, primeLen * 8, PR_FALSE, &counter) );
  174. CHECK_MPI_OK( mpp_make_prime(&q, primeLen * 8, PR_FALSE, &counter) );
  175. rv = rsa_keygen_from_primes(&p, &q, &e, key);
  176. if (rv == SECSuccess)
  177.     break; /* generated two good primes */
  178. prerr = PORT_GetError();
  179.     } while (prerr == SEC_ERROR_NEED_RANDOM); /* loop until have primes */
  180.     MPINT_TO_SECITEM(&p, &key->prime1, arena);
  181.     MPINT_TO_SECITEM(&q, &key->prime2, arena);
  182. cleanup:
  183.     mp_clear(&p);
  184.     mp_clear(&q);
  185.     mp_clear(&e);
  186.     if (pb)
  187. PORT_ZFree(pb, primeLen);
  188.     if (qb)
  189. PORT_ZFree(qb, primeLen);
  190.     if (err) {
  191. MP_TO_SEC_ERROR(err);
  192. rv = SECFailure;
  193.     }
  194.     if (rv && arena) {
  195. PORT_FreeArena(arena, PR_TRUE);
  196.     }
  197.     return key;
  198. }
  199. static unsigned int
  200. rsa_modulusLen(SECItem *modulus)
  201. {
  202.     unsigned char byteZero = modulus->data[0];
  203.     unsigned int modLen = modulus->len - !byteZero;
  204.     return modLen;
  205. }
  206. /*
  207. ** Perform a raw public-key operation 
  208. ** Length of input and output buffers are equal to key's modulus len.
  209. */
  210. SECStatus 
  211. RSA_PublicKeyOp(RSAPublicKey  *key, 
  212.                 unsigned char *output, 
  213.                 unsigned char *input)
  214. {
  215.     unsigned int modLen;
  216.     mp_int n, e, m, c;
  217.     mp_err err   = MP_OKAY;
  218.     SECStatus rv = SECSuccess;
  219.     if (!key || !output || !input) {
  220. PORT_SetError(SEC_ERROR_INVALID_ARGS);
  221. return SECFailure;
  222.     }
  223.     MP_DIGITS(&n) = 0;
  224.     MP_DIGITS(&e) = 0;
  225.     MP_DIGITS(&m) = 0;
  226.     MP_DIGITS(&c) = 0;
  227.     CHECK_MPI_OK( mp_init(&n) );
  228.     CHECK_MPI_OK( mp_init(&e) );
  229.     CHECK_MPI_OK( mp_init(&m) );
  230.     CHECK_MPI_OK( mp_init(&c) );
  231.     modLen = rsa_modulusLen(&key->modulus);
  232.     /* 1.  Obtain public key (n, e) */
  233.     SECITEM_TO_MPINT(key->modulus, &n);
  234.     SECITEM_TO_MPINT(key->publicExponent, &e);
  235.     /* 2.  Represent message as integer in range [0..n-1] */
  236.     CHECK_MPI_OK( mp_read_unsigned_octets(&m, input, modLen) );
  237.     /* 3.  Compute c = m**e mod n */
  238. #ifdef USE_MPI_EXPT_D
  239.     /* XXX see which is faster */
  240.     if (MP_USED(&e) == 1) {
  241. CHECK_MPI_OK( mp_exptmod_d(&m, MP_DIGIT(&e, 0), &n, &c) );
  242.     } else
  243. #endif
  244.     CHECK_MPI_OK( mp_exptmod(&m, &e, &n, &c) );
  245.     /* 4.  result c is ciphertext */
  246.     err = mp_to_fixlen_octets(&c, output, modLen);
  247.     if (err >= 0) err = MP_OKAY;
  248. cleanup:
  249.     mp_clear(&n);
  250.     mp_clear(&e);
  251.     mp_clear(&m);
  252.     mp_clear(&c);
  253.     if (err) {
  254. MP_TO_SEC_ERROR(err);
  255. rv = SECFailure;
  256.     }
  257.     return rv;
  258. }
  259. /*
  260. **  RSA Private key operation (no CRT).
  261. */
  262. static SECStatus 
  263. rsa_PrivateKeyOp(RSAPrivateKey *key, 
  264.                  unsigned char *output, 
  265.                  unsigned char *input)
  266. {
  267.     mp_int n, d, m, c;
  268.     mp_err   err = MP_OKAY;
  269.     SECStatus rv = SECSuccess;
  270.     unsigned int modLen;
  271.     modLen = rsa_modulusLen(&key->modulus);
  272.     MP_DIGITS(&n) = 0;
  273.     MP_DIGITS(&d) = 0;
  274.     MP_DIGITS(&m) = 0;
  275.     MP_DIGITS(&c) = 0;
  276.     CHECK_MPI_OK( mp_init(&n) );
  277.     CHECK_MPI_OK( mp_init(&d) );
  278.     CHECK_MPI_OK( mp_init(&m) );
  279.     CHECK_MPI_OK( mp_init(&c) );
  280.     /* copy private key parameters into mp integers */
  281.     SECITEM_TO_MPINT(key->modulus,         &n); /* n */
  282.     SECITEM_TO_MPINT(key->privateExponent, &d); /* d */
  283.     /* copy input into mp integer c */
  284.     OCTETS_TO_MPINT(input, &c, modLen);
  285.     /* 1. m = c**d mod n */
  286.     CHECK_MPI_OK( mp_exptmod(&c, &d, &n, &m) );
  287.     /* m is the output */
  288.     err = mp_to_fixlen_octets(&m, output, modLen);
  289.     if (err >= 0) err = MP_OKAY;
  290. cleanup:
  291.     mp_clear(&n);
  292.     mp_clear(&d);
  293.     mp_clear(&m);
  294.     mp_clear(&c);
  295.     if (err) {
  296. MP_TO_SEC_ERROR(err);
  297. rv = SECFailure;
  298.     }
  299.     return rv;
  300. }
  301. /*
  302. **  RSA Private key operation using CRT.
  303. */
  304. static SECStatus 
  305. rsa_PrivateKeyOpCRT(RSAPrivateKey *key, 
  306.                     unsigned char *output, 
  307.                     unsigned char *input)
  308. {
  309.     mp_int p, q, d_p, d_q, qInv;
  310.     mp_int m, m1, m2, b2, h, c, ctmp;
  311.     mp_err   err = MP_OKAY;
  312.     SECStatus rv = SECSuccess;
  313.     unsigned int modLen;
  314.     modLen = rsa_modulusLen(&key->modulus);
  315.     MP_DIGITS(&p)    = 0;
  316.     MP_DIGITS(&q)    = 0;
  317.     MP_DIGITS(&d_p)  = 0;
  318.     MP_DIGITS(&d_q)  = 0;
  319.     MP_DIGITS(&qInv) = 0;
  320.     MP_DIGITS(&m)    = 0;
  321.     MP_DIGITS(&m1)   = 0;
  322.     MP_DIGITS(&m2)   = 0;
  323.     MP_DIGITS(&b2)   = 0;
  324.     MP_DIGITS(&h)    = 0;
  325.     MP_DIGITS(&c)    = 0;
  326.     MP_DIGITS(&ctmp) = 0;
  327.     CHECK_MPI_OK( mp_init(&p)    );
  328.     CHECK_MPI_OK( mp_init(&q)    );
  329.     CHECK_MPI_OK( mp_init(&d_p)  );
  330.     CHECK_MPI_OK( mp_init(&d_q)  );
  331.     CHECK_MPI_OK( mp_init(&qInv) );
  332.     CHECK_MPI_OK( mp_init(&m)    );
  333.     CHECK_MPI_OK( mp_init(&m1)   );
  334.     CHECK_MPI_OK( mp_init(&m2)   );
  335.     CHECK_MPI_OK( mp_init(&b2)   );
  336.     CHECK_MPI_OK( mp_init(&h)    );
  337.     CHECK_MPI_OK( mp_init(&c)    );
  338.     CHECK_MPI_OK( mp_init(&ctmp) );
  339.     /* copy private key parameters into mp integers */
  340.     SECITEM_TO_MPINT(key->prime1,      &p);    /* p */
  341.     SECITEM_TO_MPINT(key->prime2,      &q);    /* q */
  342.     SECITEM_TO_MPINT(key->exponent1,   &d_p);  /* d_p  = d mod (p-1) */
  343.     SECITEM_TO_MPINT(key->exponent2,   &d_q);  /* d_p  = d mod (q-1) */
  344.     SECITEM_TO_MPINT(key->coefficient, &qInv); /* qInv = q**-1 mod p */
  345.     /* copy input into mp integer c */
  346.     OCTETS_TO_MPINT(input, &c, modLen);
  347.     /* 1. m1 = c**d_p mod p */
  348.     CHECK_MPI_OK( mp_mod(&c, &p, &ctmp) );
  349.     CHECK_MPI_OK( mp_exptmod(&ctmp, &d_p, &p, &m1) );
  350.     /* 2. m2 = c**d_q mod q */
  351.     CHECK_MPI_OK( mp_mod(&c, &q, &ctmp) );
  352.     CHECK_MPI_OK( mp_exptmod(&ctmp, &d_q, &q, &m2) );
  353.     /* 3.  h = (m1 - m2) * qInv mod p */
  354.     CHECK_MPI_OK( mp_submod(&m1, &m2, &p, &h) );
  355.     CHECK_MPI_OK( mp_mulmod(&h, &qInv, &p, &h)  );
  356.     /* 4.  m = m2 + h * q */
  357.     CHECK_MPI_OK( mp_mul(&h, &q, &m) );
  358.     CHECK_MPI_OK( mp_add(&m, &m2, &m) );
  359.     /* m is the output */
  360.     err = mp_to_fixlen_octets(&m, output, modLen);
  361.     if (err >= 0) err = MP_OKAY;
  362. cleanup:
  363.     mp_clear(&p);
  364.     mp_clear(&q);
  365.     mp_clear(&d_p);
  366.     mp_clear(&d_q);
  367.     mp_clear(&qInv);
  368.     mp_clear(&m);
  369.     mp_clear(&m1);
  370.     mp_clear(&m2);
  371.     mp_clear(&b2);
  372.     mp_clear(&h);
  373.     mp_clear(&c);
  374.     if (err) {
  375. MP_TO_SEC_ERROR(err);
  376. rv = SECFailure;
  377.     }
  378.     return rv;
  379. }
  380. /*
  381. ** Perform a raw private-key operation 
  382. ** Length of input and output buffers are equal to key's modulus len.
  383. */
  384. SECStatus 
  385. RSA_PrivateKeyOp(RSAPrivateKey *key, 
  386.                  unsigned char *output, 
  387.                  unsigned char *input)
  388. {
  389.     unsigned int modLen;
  390.     unsigned int offset;
  391.     if (!key || !output || !input) {
  392. PORT_SetError(SEC_ERROR_INVALID_ARGS);
  393. return SECFailure;
  394.     }
  395.     /* check input out of range (needs to be in range [0..n-1]) */
  396.     modLen = rsa_modulusLen(&key->modulus);
  397.     offset = (key->modulus.data[0] == 0) ? 1 : 0; /* may be leading 0 */
  398.     if (memcmp(input, key->modulus.data + offset, modLen) >= 0) {
  399. PORT_SetError(SEC_ERROR_INVALID_ARGS);
  400. return SECFailure;
  401.     }
  402.     if ( key->prime1.len      == 0 ||
  403.          key->prime2.len      == 0 ||
  404.          key->exponent1.len   == 0 ||
  405.          key->exponent2.len   == 0 ||
  406.          key->coefficient.len == 0) {
  407. return rsa_PrivateKeyOp(key, output, input);
  408.     } else {
  409. return rsa_PrivateKeyOpCRT(key, output, input);
  410.     }
  411. }