1 /*
   2  * CDDL HEADER START
   3  *
   4  * The contents of this file are subject to the terms of the
   5  * Common Development and Distribution License (the "License").
   6  * You may not use this file except in compliance with the License.
   7  *
   8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
   9  * or http://www.opensolaris.org/os/licensing.
  10  * See the License for the specific language governing permissions
  11  * and limitations under the License.
  12  *
  13  * When distributing Covered Code, include this CDDL HEADER in each
  14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  15  * If applicable, add the following below this CDDL HEADER, with the
  16  * fields enclosed by brackets "[]" replaced with your own identifying
  17  * information: Portions Copyright [yyyy] [name of copyright owner]
  18  *
  19  * CDDL HEADER END
  20  */
  21 
  22 /*
  23  * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
  24  */
  25 
  26 /*
  27  * This file contains RSA helper routines common to
  28  * the PKCS11 soft token code and the kernel RSA code.
  29  */
  30 
  31 #include <sys/types.h>
  32 #include <bignum.h>
  33 
  34 #ifdef _KERNEL
  35 #include <sys/param.h>
  36 #else
  37 #include <strings.h>
  38 #include <cryptoutil.h>
  39 #endif
  40 
  41 #include <sys/crypto/common.h>
  42 #include "rsa_impl.h"
  43 
  44 /*
  45  * DER encoding T of the DigestInfo values for MD5, SHA1, and SHA2
  46  * from PKCS#1 v2.1: RSA Cryptography Standard Section 9.2 Note 1
  47  *
  48  * MD5:     (0x)30 20 30 0c 06 08 2a 86 48 86 f7 0d 02 05 05 00 04 10 || H
  49  * SHA-1:   (0x)30 21 30 09 06 05 2b 0e 03 02 1a 05 00 04 14 || H
  50  * SHA-256: (0x)30 31 30 0d 06 09 60 86 48 01 65 03 04 02 01 05 00 04 20 || H.
  51  * SHA-384: (0x)30 41 30 0d 06 09 60 86 48 01 65 03 04 02 02 05 00 04 30 || H.
  52  * SHA-512: (0x)30 51 30 0d 06 09 60 86 48 01 65 03 04 02 03 05 00 04 40 || H.
  53  *
  54  * Where H is the digested output from MD5 or SHA1. We define the constant
  55  * byte array (the prefix) here and use it rather than doing the DER
  56  * encoding of the OID in a separate routine.
  57  */
  58 const CK_BYTE MD5_DER_PREFIX[MD5_DER_PREFIX_Len] = {0x30, 0x20, 0x30, 0x0c,
  59     0x06, 0x08, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x02, 0x05, 0x05, 0x00,
  60     0x04, 0x10};
  61 
  62 const CK_BYTE SHA1_DER_PREFIX[SHA1_DER_PREFIX_Len] = {0x30, 0x21, 0x30,
  63     0x09, 0x06, 0x05, 0x2b, 0x0e, 0x03, 0x02, 0x1a, 0x05, 0x00, 0x04, 0x14};
  64 
  65 const CK_BYTE SHA1_DER_PREFIX_OID[SHA1_DER_PREFIX_OID_Len] = {0x30, 0x1f, 0x30,
  66     0x07, 0x06, 0x05, 0x2b, 0x0e, 0x03, 0x02, 0x1a, 0x04, 0x14};
  67 
  68 const CK_BYTE SHA256_DER_PREFIX[SHA2_DER_PREFIX_Len] = {0x30, 0x31, 0x30, 0x0d,
  69     0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01, 0x05,
  70     0x00, 0x04, 0x20};
  71 
  72 const CK_BYTE SHA384_DER_PREFIX[SHA2_DER_PREFIX_Len] = {0x30, 0x41, 0x30, 0x0d,
  73     0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x02, 0x05,
  74     0x00, 0x04, 0x30};
  75 
  76 const CK_BYTE SHA512_DER_PREFIX[SHA2_DER_PREFIX_Len] = {0x30, 0x51, 0x30, 0x0d,
  77     0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x03, 0x05,
  78     0x00, 0x04, 0x40};
  79 
  80 const CK_BYTE DEFAULT_PUB_EXPO[DEFAULT_PUB_EXPO_Len] = { 0x01, 0x00, 0x01 };
  81 
  82 
  83 static CK_RV
  84 convert_rv(BIG_ERR_CODE err)
  85 {
  86         switch (err) {
  87 
  88         case BIG_OK:
  89                 return (CKR_OK);
  90 
  91         case BIG_NO_MEM:
  92                 return (CKR_HOST_MEMORY);
  93 
  94         case BIG_NO_RANDOM:
  95                 return (CKR_DEVICE_ERROR);
  96 
  97         case BIG_INVALID_ARGS:
  98                 return (CKR_ARGUMENTS_BAD);
  99 
 100         case BIG_DIV_BY_0:
 101         default:
 102                 return (CKR_GENERAL_ERROR);
 103         }
 104 }
 105 
 106 /* psize and qsize are in bits */
 107 static BIG_ERR_CODE
 108 RSA_key_init(RSAkey *key, int psize, int qsize)
 109 {
 110         BIG_ERR_CODE err = BIG_OK;
 111 
 112 /* EXPORT DELETE START */
 113 
 114         int plen, qlen, nlen;
 115 
 116         plen = BITLEN2BIGNUMLEN(psize);
 117         qlen = BITLEN2BIGNUMLEN(qsize);
 118         nlen = plen + qlen;
 119         key->size = psize + qsize;
 120         if ((err = big_init(&(key->p), plen)) != BIG_OK)
 121                 return (err);
 122         if ((err = big_init(&(key->q), qlen)) != BIG_OK)
 123                 goto ret1;
 124         if ((err = big_init(&(key->n), nlen)) != BIG_OK)
 125                 goto ret2;
 126         if ((err = big_init(&(key->d), nlen)) != BIG_OK)
 127                 goto ret3;
 128         if ((err = big_init(&(key->e), nlen)) != BIG_OK)
 129                 goto ret4;
 130         if ((err = big_init(&(key->dmodpminus1), plen)) != BIG_OK)
 131                 goto ret5;
 132         if ((err = big_init(&(key->dmodqminus1), qlen)) != BIG_OK)
 133                 goto ret6;
 134         if ((err = big_init(&(key->pinvmodq), qlen)) != BIG_OK)
 135                 goto ret7;
 136         if ((err = big_init(&(key->p_rr), plen)) != BIG_OK)
 137                 goto ret8;
 138         if ((err = big_init(&(key->q_rr), qlen)) != BIG_OK)
 139                 goto ret9;
 140         if ((err = big_init(&(key->n_rr), nlen)) != BIG_OK)
 141                 goto ret10;
 142 
 143         return (BIG_OK);
 144 
 145 ret10:
 146         big_finish(&(key->q_rr));
 147 ret9:
 148         big_finish(&(key->p_rr));
 149 ret8:
 150         big_finish(&(key->pinvmodq));
 151 ret7:
 152         big_finish(&(key->dmodqminus1));
 153 ret6:
 154         big_finish(&(key->dmodpminus1));
 155 ret5:
 156         big_finish(&(key->e));
 157 ret4:
 158         big_finish(&(key->d));
 159 ret3:
 160         big_finish(&(key->n));
 161 ret2:
 162         big_finish(&(key->q));
 163 ret1:
 164         big_finish(&(key->p));
 165 
 166 /* EXPORT DELETE END */
 167 
 168         return (err);
 169 }
 170 
 171 static void
 172 RSA_key_finish(RSAkey *key)
 173 {
 174 
 175 /* EXPORT DELETE START */
 176 
 177         big_finish(&(key->n_rr));
 178         big_finish(&(key->q_rr));
 179         big_finish(&(key->p_rr));
 180         big_finish(&(key->pinvmodq));
 181         big_finish(&(key->dmodqminus1));
 182         big_finish(&(key->dmodpminus1));
 183         big_finish(&(key->e));
 184         big_finish(&(key->d));
 185         big_finish(&(key->n));
 186         big_finish(&(key->q));
 187         big_finish(&(key->p));
 188 
 189 /* EXPORT DELETE END */
 190 
 191 }
 192 
 193 /*
 194  * Generate RSA key
 195  */
 196 static CK_RV
 197 generate_rsa_key(RSAkey *key, int psize, int qsize, BIGNUM *pubexp,
 198     int (*rfunc)(void *, size_t))
 199 {
 200         CK_RV           rv = CKR_OK;
 201 
 202 /* EXPORT DELETE START */
 203 
 204         int             (*rf)(void *, size_t);
 205         BIGNUM          a, b, c, d, e, f, g, h;
 206         int             len, keylen, size;
 207         BIG_ERR_CODE    brv = BIG_OK;
 208 
 209         size = psize + qsize;
 210         keylen = BITLEN2BIGNUMLEN(size);
 211         len = keylen * 2 + 1;
 212         key->size = size;
 213 
 214         /*
 215          * Note: It is not really necessary to compute e, it is in pubexp:
 216          *      (void) big_copy(&(key->e), pubexp);
 217          */
 218 
 219         a.malloced = 0;
 220         b.malloced = 0;
 221         c.malloced = 0;
 222         d.malloced = 0;
 223         e.malloced = 0;
 224         f.malloced = 0;
 225         g.malloced = 0;
 226         h.malloced = 0;
 227 
 228         if ((big_init(&a, len) != BIG_OK) ||
 229             (big_init(&b, len) != BIG_OK) ||
 230             (big_init(&c, len) != BIG_OK) ||
 231             (big_init(&d, len) != BIG_OK) ||
 232             (big_init(&e, len) != BIG_OK) ||
 233             (big_init(&f, len) != BIG_OK) ||
 234             (big_init(&g, len) != BIG_OK) ||
 235             (big_init(&h, len) != BIG_OK)) {
 236                 big_finish(&h);
 237                 big_finish(&g);
 238                 big_finish(&f);
 239                 big_finish(&e);
 240                 big_finish(&d);
 241                 big_finish(&c);
 242                 big_finish(&b);
 243                 big_finish(&a);
 244 
 245                 return (CKR_HOST_MEMORY);
 246         }
 247 
 248         rf = rfunc;
 249         if (rf == NULL) {
 250 #ifdef _KERNEL
 251                 rf = (int (*)(void *, size_t))random_get_pseudo_bytes;
 252 #else
 253                 rf = pkcs11_get_urandom;
 254 #endif
 255         }
 256 
 257 nextp:
 258         if ((brv = big_random(&a, psize, rf)) != BIG_OK) {
 259                 goto ret;
 260         }
 261 
 262         if ((brv = big_nextprime_pos(&b, &a)) != BIG_OK) {
 263                 goto ret;
 264         }
 265         /* b now contains the potential prime p */
 266 
 267         (void) big_sub_pos(&a, &b, &big_One);
 268         if ((brv = big_ext_gcd_pos(&f, &d, &g, pubexp, &a)) != BIG_OK) {
 269                 goto ret;
 270         }
 271         if (big_cmp_abs(&f, &big_One) != 0) {
 272                 goto nextp;
 273         }
 274 
 275         if ((brv = big_random(&c, qsize, rf)) != BIG_OK) {
 276                 goto ret;
 277         }
 278 
 279 nextq:
 280         (void) big_add(&a, &c, &big_Two);
 281 
 282         if (big_bitlength(&a) != qsize) {
 283                 goto nextp;
 284         }
 285         if (big_cmp_abs(&a, &b) == 0) {
 286                 goto nextp;
 287         }
 288         if ((brv = big_nextprime_pos(&c, &a)) != BIG_OK) {
 289                 goto ret;
 290         }
 291         /* c now contains the potential prime q */
 292 
 293         if ((brv = big_mul(&g, &b, &c)) != BIG_OK) {
 294                 goto ret;
 295         }
 296         if (big_bitlength(&g) != size) {
 297                 goto nextp;
 298         }
 299         /* g now contains the potential modulus n */
 300 
 301         (void) big_sub_pos(&a, &b, &big_One);
 302         (void) big_sub_pos(&d, &c, &big_One);
 303 
 304         if ((brv = big_mul(&a, &a, &d)) != BIG_OK) {
 305                 goto ret;
 306         }
 307         if ((brv = big_ext_gcd_pos(&f, &d, &h, pubexp, &a)) != BIG_OK) {
 308                 goto ret;
 309         }
 310         if (big_cmp_abs(&f, &big_One) != 0) {
 311                 goto nextq;
 312         } else {
 313                 (void) big_copy(&e, pubexp);
 314         }
 315         if (d.sign == -1) {
 316                 if ((brv = big_add(&d, &d, &a)) != BIG_OK) {
 317                         goto ret;
 318                 }
 319         }
 320         (void) big_copy(&(key->p), &b);
 321         (void) big_copy(&(key->q), &c);
 322         (void) big_copy(&(key->n), &g);
 323         (void) big_copy(&(key->d), &d);
 324         (void) big_copy(&(key->e), &e);
 325 
 326         if ((brv = big_ext_gcd_pos(&a, &f, &h, &b, &c)) != BIG_OK) {
 327                 goto ret;
 328         }
 329         if (f.sign == -1) {
 330                 if ((brv = big_add(&f, &f, &c)) != BIG_OK) {
 331                         goto ret;
 332                 }
 333         }
 334         (void) big_copy(&(key->pinvmodq), &f);
 335 
 336         (void) big_sub(&a, &b, &big_One);
 337         if ((brv = big_div_pos(&a, &f, &d, &a)) != BIG_OK) {
 338                 goto ret;
 339         }
 340         (void) big_copy(&(key->dmodpminus1), &f);
 341         (void) big_sub(&a, &c, &big_One);
 342         if ((brv = big_div_pos(&a, &f, &d, &a)) != BIG_OK) {
 343                 goto ret;
 344         }
 345         (void) big_copy(&(key->dmodqminus1), &f);
 346 
 347         /* pairwise consistency check:  decrypt and encrypt restores value */
 348         if ((brv = big_random(&h, size, rf)) != BIG_OK) {
 349                 goto ret;
 350         }
 351         if ((brv = big_div_pos(&a, &h, &h, &g)) != BIG_OK) {
 352                 goto ret;
 353         }
 354         if ((brv = big_modexp(&a, &h, &d, &g, NULL)) != BIG_OK) {
 355                 goto ret;
 356         }
 357 
 358         if ((brv = big_modexp(&b, &a, &e, &g, NULL)) != BIG_OK) {
 359                 goto ret;
 360         }
 361 
 362         if (big_cmp_abs(&b, &h) != 0) {
 363                 /* this should not happen */
 364                 rv = generate_rsa_key(key, psize, qsize, pubexp, rf);
 365                 goto ret1;
 366         } else {
 367                 brv = BIG_OK;
 368         }
 369 
 370 ret:
 371         rv = convert_rv(brv);
 372 ret1:
 373         big_finish(&h);
 374         big_finish(&g);
 375         big_finish(&f);
 376         big_finish(&e);
 377         big_finish(&d);
 378         big_finish(&c);
 379         big_finish(&b);
 380         big_finish(&a);
 381 
 382 /* EXPORT DELETE END */
 383 
 384         return (rv);
 385 }
 386 
 387 CK_RV
 388 rsa_genkey_pair(RSAbytekey *bkey)
 389 {
 390         /*
 391          * NOTE:  Whomever originally wrote this function swapped p and q.
 392          * This table shows the mapping between name convention used here
 393          * versus what is used in most texts that describe RSA key generation.
 394          *      This function:                  Standard convention:
 395          *      --------------                  --------------------
 396          *      modulus, n                      -same-
 397          *      prime 1, q                      prime 1, p
 398          *      prime 2, p                      prime 2, q
 399          *      private exponent, d             -same-
 400          *      public exponent, e              -same-
 401          *      exponent 1, d mod (q-1)         d mod (p-1)
 402          *      exponent 2, d mod (p-1)         d mod (q-1)
 403          *      coefficient, p^-1 mod q         q^-1 mod p
 404          *
 405          * Also notice the struct member for coefficient is named .pinvmodq
 406          * rather than .qinvmodp, reflecting the switch.
 407          *
 408          * The code here wasn't unswapped, because "it works".  Further,
 409          * p and q are interchangeable as long as exponent 1 and 2 and
 410          * the coefficient are kept straight too.  This note is here to
 411          * make the reader aware of the switcheroo.
 412          */
 413         CK_RV   rv = CKR_OK;
 414 
 415 /* EXPORT DELETE START */
 416 
 417         BIGNUM  public_exponent = {0};
 418         RSAkey  rsakey;
 419         uint32_t modulus_bytes;
 420 
 421         if (bkey == NULL)
 422                 return (CKR_ARGUMENTS_BAD);
 423 
 424         /* Must have modulus bits set */
 425         if (bkey->modulus_bits == 0)
 426                 return (CKR_ARGUMENTS_BAD);
 427 
 428         /* Must have public exponent set */
 429         if (bkey->pubexpo_bytes == 0 || bkey->pubexpo == NULL)
 430                 return (CKR_ARGUMENTS_BAD);
 431 
 432         /* Note: modulus_bits may not be same as (8 * sizeof (modulus)) */
 433         modulus_bytes = CRYPTO_BITS2BYTES(bkey->modulus_bits);
 434 
 435         /* Modulus length needs to be between min key size and max key size. */
 436         if ((modulus_bytes < MIN_RSA_KEYLENGTH_IN_BYTES) ||
 437             (modulus_bytes > MAX_RSA_KEYLENGTH_IN_BYTES)) {
 438                 return (CKR_KEY_SIZE_RANGE);
 439         }
 440 
 441         /*
 442          * Initialize the RSA key.
 443          */
 444         if (RSA_key_init(&rsakey, modulus_bytes * 4, modulus_bytes * 4) !=
 445             BIG_OK) {
 446                 return (CKR_HOST_MEMORY);
 447         }
 448 
 449         /* Create a public exponent in bignum format. */
 450         if (big_init(&public_exponent,
 451             CHARLEN2BIGNUMLEN(bkey->pubexpo_bytes)) != BIG_OK) {
 452                 rv = CKR_HOST_MEMORY;
 453                 goto clean1;
 454         }
 455         bytestring2bignum(&public_exponent, bkey->pubexpo, bkey->pubexpo_bytes);
 456 
 457         /* Generate RSA key pair. */
 458         if ((rv = generate_rsa_key(&rsakey,
 459             modulus_bytes * 4, modulus_bytes * 4, &public_exponent,
 460             bkey->rfunc)) != CKR_OK) {
 461                 big_finish(&public_exponent);
 462                 goto clean1;
 463         }
 464         big_finish(&public_exponent);
 465 
 466         /* modulus_bytes = rsakey.n.len * (int)sizeof (BIG_CHUNK_TYPE); */
 467         bignum2bytestring(bkey->modulus, &(rsakey.n), modulus_bytes);
 468 
 469         bkey->privexpo_bytes = rsakey.d.len * (int)sizeof (BIG_CHUNK_TYPE);
 470         bignum2bytestring(bkey->privexpo, &(rsakey.d), bkey->privexpo_bytes);
 471 
 472         bkey->pubexpo_bytes = rsakey.e.len * (int)sizeof (BIG_CHUNK_TYPE);
 473         bignum2bytestring(bkey->pubexpo, &(rsakey.e), bkey->pubexpo_bytes);
 474 
 475         bkey->prime1_bytes = rsakey.q.len * (int)sizeof (BIG_CHUNK_TYPE);
 476         bignum2bytestring(bkey->prime1, &(rsakey.q), bkey->prime1_bytes);
 477 
 478         bkey->prime2_bytes = rsakey.p.len * (int)sizeof (BIG_CHUNK_TYPE);
 479         bignum2bytestring(bkey->prime2, &(rsakey.p), bkey->prime2_bytes);
 480 
 481         bkey->expo1_bytes =
 482             rsakey.dmodqminus1.len * (int)sizeof (BIG_CHUNK_TYPE);
 483         bignum2bytestring(bkey->expo1, &(rsakey.dmodqminus1),
 484             bkey->expo1_bytes);
 485 
 486         bkey->expo2_bytes =
 487             rsakey.dmodpminus1.len * (int)sizeof (BIG_CHUNK_TYPE);
 488         bignum2bytestring(bkey->expo2,
 489             &(rsakey.dmodpminus1), bkey->expo2_bytes);
 490 
 491         bkey->coeff_bytes =
 492             rsakey.pinvmodq.len * (int)sizeof (BIG_CHUNK_TYPE);
 493         bignum2bytestring(bkey->coeff, &(rsakey.pinvmodq), bkey->coeff_bytes);
 494 
 495 clean1:
 496         RSA_key_finish(&rsakey);
 497 
 498 /* EXPORT DELETE END */
 499 
 500         return (rv);
 501 }
 502 
 503 /*
 504  * RSA encrypt operation
 505  */
 506 CK_RV
 507 rsa_encrypt(RSAbytekey *bkey, uchar_t *in, uint32_t in_len, uchar_t *out)
 508 {
 509         CK_RV rv = CKR_OK;
 510 
 511 /* EXPORT DELETE START */
 512 
 513         BIGNUM msg;
 514         RSAkey rsakey;
 515         uint32_t modulus_bytes;
 516 
 517         if (bkey == NULL)
 518                 return (CKR_ARGUMENTS_BAD);
 519 
 520         /* Must have modulus and public exponent set */
 521         if (bkey->modulus_bits == 0 || bkey->modulus == NULL ||
 522             bkey->pubexpo_bytes == 0 || bkey->pubexpo == NULL)
 523                 return (CKR_ARGUMENTS_BAD);
 524 
 525         /* Note: modulus_bits may not be same as (8 * sizeof (modulus)) */
 526         modulus_bytes = CRYPTO_BITS2BYTES(bkey->modulus_bits);
 527 
 528         if (bkey->pubexpo_bytes > modulus_bytes) {
 529                 return (CKR_KEY_SIZE_RANGE);
 530         }
 531 
 532         /* psize and qsize for RSA_key_init is in bits. */
 533         if (RSA_key_init(&rsakey, modulus_bytes * 4, modulus_bytes * 4) !=
 534             BIG_OK) {
 535                 return (CKR_HOST_MEMORY);
 536         }
 537 
 538         /* Size for big_init is in BIG_CHUNK_TYPE words. */
 539         if (big_init(&msg, CHARLEN2BIGNUMLEN(in_len)) != BIG_OK) {
 540                 rv = CKR_HOST_MEMORY;
 541                 goto clean2;
 542         }
 543         bytestring2bignum(&msg, in, in_len);
 544 
 545         /* Convert public exponent and modulus to big integer format. */
 546         bytestring2bignum(&(rsakey.e), bkey->pubexpo, bkey->pubexpo_bytes);
 547         bytestring2bignum(&(rsakey.n), bkey->modulus, modulus_bytes);
 548 
 549         if (big_cmp_abs(&msg, &(rsakey.n)) > 0) {
 550                 rv = CKR_DATA_LEN_RANGE;
 551                 goto clean3;
 552         }
 553 
 554         /* Perform RSA computation on big integer input data. */
 555         if (big_modexp(&msg, &msg, &(rsakey.e), &(rsakey.n), NULL) !=
 556             BIG_OK) {
 557                 rv = CKR_HOST_MEMORY;
 558                 goto clean3;
 559         }
 560 
 561         /* Convert the big integer output data to octet string. */
 562         bignum2bytestring(out, &msg, modulus_bytes);
 563 
 564 clean3:
 565         big_finish(&msg);
 566 clean2:
 567         RSA_key_finish(&rsakey);
 568 
 569 /* EXPORT DELETE END */
 570 
 571         return (rv);
 572 }
 573 
 574 /*
 575  * RSA decrypt operation
 576  */
 577 CK_RV
 578 rsa_decrypt(RSAbytekey *bkey, uchar_t *in, uint32_t in_len, uchar_t *out)
 579 {
 580         CK_RV rv = CKR_OK;
 581 
 582 /* EXPORT DELETE START */
 583 
 584         BIGNUM msg;
 585         RSAkey rsakey;
 586         uint32_t modulus_bytes;
 587 
 588         if (bkey == NULL)
 589                 return (CKR_ARGUMENTS_BAD);
 590 
 591         /* Must have modulus, prime1, prime2, expo1, expo2, and coeff set */
 592         if (bkey->modulus_bits == 0 || bkey->modulus == NULL ||
 593             bkey->prime1_bytes == 0 || bkey->prime1 == NULL ||
 594             bkey->prime2_bytes == 0 || bkey->prime2 == NULL ||
 595             bkey->expo1_bytes == 0 || bkey->expo1 == NULL ||
 596             bkey->expo2_bytes == 0 || bkey->expo2 == NULL ||
 597             bkey->coeff_bytes == 0 || bkey->coeff == NULL)
 598                 return (CKR_ARGUMENTS_BAD);
 599 
 600         /* Note: modulus_bits may not be same as (8 * sizeof (modulus)) */
 601         modulus_bytes = CRYPTO_BITS2BYTES(bkey->modulus_bits);
 602 
 603         /* psize and qsize for RSA_key_init is in bits. */
 604         if (RSA_key_init(&rsakey, CRYPTO_BYTES2BITS(bkey->prime2_bytes),
 605             CRYPTO_BYTES2BITS(bkey->prime1_bytes)) != BIG_OK) {
 606                 return (CKR_HOST_MEMORY);
 607         }
 608 
 609         /* Size for big_init is in BIG_CHUNK_TYPE words. */
 610         if (big_init(&msg, CHARLEN2BIGNUMLEN(in_len)) != BIG_OK) {
 611                 rv = CKR_HOST_MEMORY;
 612                 goto clean3;
 613         }
 614         /* Convert octet string input data to big integer format. */
 615         bytestring2bignum(&msg, in, in_len);
 616 
 617         /* Convert octet string modulus to big integer format. */
 618         bytestring2bignum(&(rsakey.n), bkey->modulus, modulus_bytes);
 619 
 620         if (big_cmp_abs(&msg, &(rsakey.n)) > 0) {
 621                 rv = CKR_DATA_LEN_RANGE;
 622                 goto clean4;
 623         }
 624 
 625         /* Convert the rest of private key attributes to big integer format. */
 626         bytestring2bignum(&(rsakey.q), bkey->prime1, bkey->prime1_bytes);
 627         bytestring2bignum(&(rsakey.p), bkey->prime2, bkey->prime2_bytes);
 628         bytestring2bignum(&(rsakey.dmodqminus1),
 629             bkey->expo1, bkey->expo1_bytes);
 630         bytestring2bignum(&(rsakey.dmodpminus1),
 631             bkey->expo2, bkey->expo2_bytes);
 632         bytestring2bignum(&(rsakey.pinvmodq),
 633             bkey->coeff, bkey->coeff_bytes);
 634 
 635         if ((big_cmp_abs(&(rsakey.dmodpminus1), &(rsakey.p)) > 0) ||
 636             (big_cmp_abs(&(rsakey.dmodqminus1), &(rsakey.q)) > 0) ||
 637             (big_cmp_abs(&(rsakey.pinvmodq), &(rsakey.q)) > 0)) {
 638                 rv = CKR_KEY_SIZE_RANGE;
 639                 goto clean4;
 640         }
 641 
 642         /* Perform RSA computation on big integer input data. */
 643         if (big_modexp_crt(&msg, &msg, &(rsakey.dmodpminus1),
 644             &(rsakey.dmodqminus1), &(rsakey.p), &(rsakey.q),
 645             &(rsakey.pinvmodq), NULL, NULL) != BIG_OK) {
 646                 rv = CKR_HOST_MEMORY;
 647                 goto clean4;
 648         }
 649 
 650         /* Convert the big integer output data to octet string. */
 651         bignum2bytestring(out, &msg, modulus_bytes);
 652 
 653 clean4:
 654         big_finish(&msg);
 655 clean3:
 656         RSA_key_finish(&rsakey);
 657 
 658 /* EXPORT DELETE END */
 659 
 660         return (rv);
 661 }