1 // This file was extracted from the TCG Published 2 // Trusted Platform Module Library 3 // Part 4: Supporting Routines 4 // Family "2.0" 5 // Level 00 Revision 01.16 6 // October 30, 2014 7 8 #include <string.h> 9 10 #include "OsslCryptoEngine.h" 11 #ifdef TPM_ALG_RSA 12 // 13 // 14 // Local Functions 15 // 16 // RsaPrivateExponent() 17 // 18 // This function computes the private exponent de = 1 mod (p-1)*(q-1) The inputs are the public modulus 19 // and one of the primes. 20 // The results are returned in the key->private structure. The size of that structure is expanded to hold the 21 // private exponent. If the computed value is smaller than the public modulus, the private exponent is de- 22 // normalized. 23 // 24 // Return Value Meaning 25 // 26 // CRYPT_SUCCESS private exponent computed 27 // CRYPT_PARAMETER prime is not half the size of the modulus, or the modulus is not evenly 28 // divisible by the prime, or no private exponent could be computed 29 // from the input parameters 30 // 31 CRYPT_RESULT 32 RsaPrivateExponent( 33 RSA_KEY *key // IN: the key to augment with the private 34 // exponent 35 ) 36 { 37 BN_CTX *context; 38 BIGNUM *bnD; 39 BIGNUM *bnN; 40 BIGNUM *bnP; 41 BIGNUM *bnE; 42 BIGNUM *bnPhi; 43 BIGNUM *bnQ; 44 BIGNUM *bnQr; 45 UINT32 fill; 46 CRYPT_RESULT retVal = CRYPT_SUCCESS; // Assume success 47 pAssert(key != NULL && key->privateKey != NULL && key->publicKey != NULL); 48 context = BN_CTX_new(); 49 if(context == NULL) 50 FAIL(FATAL_ERROR_ALLOCATION); 51 BN_CTX_start(context); 52 bnE = BN_CTX_get(context); 53 bnD = BN_CTX_get(context); 54 bnN = BN_CTX_get(context); 55 bnP = BN_CTX_get(context); 56 bnPhi = BN_CTX_get(context); 57 bnQ = BN_CTX_get(context); 58 bnQr = BN_CTX_get(context); 59 if(bnQr == NULL) 60 FAIL(FATAL_ERROR_ALLOCATION); 61 // Assume the size of the public key value is within range 62 pAssert(key->publicKey->size <= MAX_RSA_KEY_BYTES); 63 if( BN_bin2bn(key->publicKey->buffer, key->publicKey->size, bnN) == NULL 64 || BN_bin2bn(key->privateKey->buffer, key->privateKey->size, bnP) == NULL) 65 FAIL(FATAL_ERROR_INTERNAL); 66 // If P size is not 1/2 of n size, then this is not a valid value for this 67 // implementation. This will also catch the case were P is input as zero. 68 // This generates a return rather than an assert because the key being loaded 69 // might be SW generated and wrong. 70 if(BN_num_bits(bnP) < BN_num_bits(bnN)/2) 71 { 72 retVal = CRYPT_PARAMETER; 73 goto Cleanup; 74 } 75 // Get q = n/p; 76 if (BN_div(bnQ, bnQr, bnN, bnP, context) != 1) 77 FAIL(FATAL_ERROR_INTERNAL); 78 // If there is a remainder, then this is not a valid n 79 if(BN_num_bytes(bnQr) != 0 || BN_num_bits(bnQ) != BN_num_bits(bnP)) 80 { 81 retVal = CRYPT_PARAMETER; // problem may be recoverable 82 goto Cleanup; 83 } 84 // Get compute Phi = (p - 1)(q - 1) = pq - p - q + 1 = n - p - q + 1 85 if( BN_copy(bnPhi, bnN) == NULL 86 || !BN_sub(bnPhi, bnPhi, bnP) 87 || !BN_sub(bnPhi, bnPhi, bnQ) 88 || !BN_add_word(bnPhi, 1)) 89 FAIL(FATAL_ERROR_INTERNAL); 90 // Compute the multiplicative inverse 91 BN_set_word(bnE, key->exponent); 92 if(BN_mod_inverse(bnD, bnE, bnPhi, context) == NULL) 93 { 94 // Going to assume that the error is caused by a bad 95 // set of parameters. Specifically, an exponent that is 96 // not compatible with the primes. In an implementation that 97 // has better visibility to the error codes, this might be 98 // refined so that failures in the library would return 99 // a more informative value. Should not assume here that 100 // the error codes will remain unchanged. 101 retVal = CRYPT_PARAMETER; 102 goto Cleanup; 103 } 104 fill = key->publicKey->size - BN_num_bytes(bnD); 105 BN_bn2bin(bnD, &key->privateKey->buffer[fill]); 106 memset(key->privateKey->buffer, 0, fill); 107 // Change the size of the private key so that it is known to contain 108 // a private exponent rather than a prime. 109 key->privateKey->size = key->publicKey->size; 110 Cleanup: 111 BN_CTX_end(context); 112 BN_CTX_free(context); 113 return retVal; 114 } 115 // 116 // 117 // _cpri__TestKeyRSA() 118 // 119 // This function computes the private exponent de = 1 mod (p-1)*(q-1) The inputs are the public modulus 120 // and one of the primes or two primes. 121 // If both primes are provided, the public modulus is computed. If only one prime is provided, the second 122 // prime is computed. In either case, a private exponent is produced and placed in d. 123 // If no modular inverse exists, then CRYPT_PARAMETER is returned. 124 // 125 // Return Value Meaning 126 // 127 // CRYPT_SUCCESS private exponent (d) was generated 128 // CRYPT_PARAMETER one or more parameters are invalid 129 // 130 LIB_EXPORT CRYPT_RESULT 131 _cpri__TestKeyRSA( 132 TPM2B *d, // OUT: the address to receive the private 133 // exponent 134 UINT32 exponent, // IN: the public modulu 135 TPM2B *publicKey, // IN/OUT: an input if only one prime is 136 // provided. an output if both primes are 137 // provided 138 TPM2B *prime1, // IN: a first prime 139 TPM2B *prime2 // IN: an optional second prime 140 ) 141 { 142 BN_CTX *context; 143 BIGNUM *bnD; 144 BIGNUM *bnN; 145 BIGNUM *bnP; 146 BIGNUM *bnE; 147 BIGNUM *bnPhi; 148 BIGNUM *bnQ; 149 BIGNUM *bnQr; 150 UINT32 fill; 151 CRYPT_RESULT retVal = CRYPT_SUCCESS; // Assume success 152 pAssert(publicKey != NULL && prime1 != NULL); 153 // Make sure that the sizes are within range 154 pAssert( prime1->size <= MAX_RSA_KEY_BYTES/2 155 && publicKey->size <= MAX_RSA_KEY_BYTES); 156 pAssert( prime2 == NULL || prime2->size < MAX_RSA_KEY_BYTES/2); 157 if(publicKey->size/2 != prime1->size) 158 return CRYPT_PARAMETER; 159 context = BN_CTX_new(); 160 if(context == NULL) 161 FAIL(FATAL_ERROR_ALLOCATION); 162 BN_CTX_start(context); 163 bnE = BN_CTX_get(context); // public exponent (e) 164 bnD = BN_CTX_get(context); // private exponent (d) 165 bnN = BN_CTX_get(context); // public modulus (n) 166 bnP = BN_CTX_get(context); // prime1 (p) 167 bnPhi = BN_CTX_get(context); // (p-1)(q-1) 168 bnQ = BN_CTX_get(context); // prime2 (q) 169 bnQr = BN_CTX_get(context); // n mod p 170 if(bnQr == NULL) 171 FAIL(FATAL_ERROR_ALLOCATION); 172 if(BN_bin2bn(prime1->buffer, prime1->size, bnP) == NULL) 173 FAIL(FATAL_ERROR_INTERNAL); 174 // If prime2 is provided, then compute n 175 if(prime2 != NULL) 176 { 177 // Two primes provided so use them to compute n 178 if(BN_bin2bn(prime2->buffer, prime2->size, bnQ) == NULL) 179 FAIL(FATAL_ERROR_INTERNAL); 180 // Make sure that the sizes of the primes are compatible 181 if(BN_num_bits(bnQ) != BN_num_bits(bnP)) 182 { 183 retVal = CRYPT_PARAMETER; 184 goto Cleanup; 185 } 186 // Multiply the primes to get the public modulus 187 if(BN_mul(bnN, bnP, bnQ, context) != 1) 188 FAIL(FATAL_ERROR_INTERNAL); 189 // if the space provided for the public modulus is large enough, 190 // save the created value 191 if(BN_num_bits(bnN) != (publicKey->size * 8)) 192 { 193 retVal = CRYPT_PARAMETER; 194 goto Cleanup; 195 } 196 BN_bn2bin(bnN, publicKey->buffer); 197 } 198 else 199 { 200 if (BN_is_zero(bnP)) 201 { 202 retVal = CRYPT_PARAMETER; 203 goto Cleanup; 204 } 205 // One prime provided so find the second prime by division 206 BN_bin2bn(publicKey->buffer, publicKey->size, bnN); 207 // Get q = n/p; 208 if(BN_div(bnQ, bnQr, bnN, bnP, context) != 1) 209 FAIL(FATAL_ERROR_INTERNAL); 210 // If there is a remainder, then this is not a valid n 211 if(BN_num_bytes(bnQr) != 0 || BN_num_bits(bnQ) != BN_num_bits(bnP)) 212 { 213 retVal = CRYPT_PARAMETER; // problem may be recoverable 214 goto Cleanup; 215 } 216 } 217 // Get compute Phi = (p - 1)(q - 1) = pq - p - q + 1 = n - p - q + 1 218 BN_copy(bnPhi, bnN); 219 BN_sub(bnPhi, bnPhi, bnP); 220 BN_sub(bnPhi, bnPhi, bnQ); 221 BN_add_word(bnPhi, 1); 222 // Compute the multiplicative inverse 223 BN_set_word(bnE, exponent); 224 if(BN_mod_inverse(bnD, bnE, bnPhi, context) == NULL) 225 { 226 // Going to assume that the error is caused by a bad set of parameters. 227 // Specifically, an exponent that is not compatible with the primes. 228 // In an implementation that has better visibility to the error codes, 229 // this might be refined so that failures in the library would return 230 // a more informative value. 231 // Do not assume that the error codes will remain unchanged. 232 retVal = CRYPT_PARAMETER; 233 goto Cleanup; 234 } 235 // Return the private exponent. 236 // Make sure it is normalized to have the correct size. 237 d->size = publicKey->size; 238 fill = d->size - BN_num_bytes(bnD); 239 BN_bn2bin(bnD, &d->buffer[fill]); 240 memset(d->buffer, 0, fill); 241 Cleanup: 242 BN_CTX_end(context); 243 BN_CTX_free(context); 244 return retVal; 245 } 246 // 247 // 248 // RSAEP() 249 // 250 // This function performs the RSAEP operation defined in PKCS#1v2.1. It is an exponentiation of a value 251 // (m) with the public exponent (e), modulo the public (n). 252 // 253 // Return Value Meaning 254 // 255 // CRYPT_SUCCESS encryption complete 256 // CRYPT_PARAMETER number to exponentiate is larger than the modulus 257 // 258 static CRYPT_RESULT 259 RSAEP ( 260 UINT32 dInOutSize, // OUT size of the encrypted block 261 BYTE *dInOut, // OUT: the encrypted data 262 RSA_KEY *key // IN: the key to use 263 ) 264 { 265 UINT32 e; 266 BYTE exponent[4]; 267 CRYPT_RESULT retVal; 268 e = key->exponent; 269 if(e == 0) 270 e = RSA_DEFAULT_PUBLIC_EXPONENT; 271 UINT32_TO_BYTE_ARRAY(e, exponent); 272 //!!! Can put check for test of RSA here 273 retVal = _math__ModExp(dInOutSize, dInOut, dInOutSize, dInOut, 4, exponent, 274 key->publicKey->size, key->publicKey->buffer); 275 // Exponentiation result is stored in-place, thus no space shortage is possible. 276 pAssert(retVal != CRYPT_UNDERFLOW); 277 return retVal; 278 } 279 // 280 // 281 // RSADP() 282 // 283 // This function performs the RSADP operation defined in PKCS#1v2.1. It is an exponentiation of a value (c) 284 // with the private exponent (d), modulo the public modulus (n). The decryption is in place. 285 // 286 // This function also checks the size of the private key. If the size indicates that only a prime value is 287 // present, the key is converted to being a private exponent. 288 // 289 // Return Value Meaning 290 // 291 // CRYPT_SUCCESS decryption succeeded 292 // CRYPT_PARAMETER the value to decrypt is larger than the modulus 293 // 294 static CRYPT_RESULT 295 RSADP ( 296 UINT32 dInOutSize, // IN/OUT: size of decrypted data 297 BYTE *dInOut, // IN/OUT: the decrypted data 298 RSA_KEY *key // IN: the key 299 ) 300 { 301 CRYPT_RESULT retVal; 302 //!!! Can put check for RSA tested here 303 // Make sure that the pointers are provided and that the private key is present 304 // If the private key is present it is assumed to have been created by 305 // so is presumed good _cpri__PrivateExponent 306 pAssert(key != NULL && dInOut != NULL && 307 key->publicKey->size == key->publicKey->size); 308 // make sure that the value to be decrypted is smaller than the modulus 309 // note: this check is redundant as is also performed by _math__ModExp() 310 // which is optimized for use in RSA operations 311 if(_math__uComp(key->publicKey->size, key->publicKey->buffer, 312 dInOutSize, dInOut) <= 0) 313 return CRYPT_PARAMETER; 314 // _math__ModExp can return CRYPT_PARAMTER or CRYPT_UNDERFLOW but actual 315 // underflow is not possible because everything is in the same buffer. 316 retVal = _math__ModExp(dInOutSize, dInOut, dInOutSize, dInOut, 317 key->privateKey->size, key->privateKey->buffer, 318 key->publicKey->size, key->publicKey->buffer); 319 // Exponentiation result is stored in-place, thus no space shortage is possible. 320 pAssert(retVal != CRYPT_UNDERFLOW); 321 return retVal; 322 } 323 // 324 // 325 // OaepEncode() 326 // 327 // This function performs OAEP padding. The size of the buffer to receive the OAEP padded data must 328 // equal the size of the modulus 329 // 330 // Return Value Meaning 331 // 332 // CRYPT_SUCCESS encode successful 333 // CRYPT_PARAMETER hashAlg is not valid 334 // CRYPT_FAIL message size is too large 335 // 336 static CRYPT_RESULT 337 OaepEncode( 338 UINT32 paddedSize, // IN: pad value size 339 BYTE *padded, // OUT: the pad data 340 TPM_ALG_ID hashAlg, // IN: algorithm to use for padding 341 const char *label, // IN: null-terminated string (may be NULL) 342 UINT32 messageSize, // IN: the message size 343 BYTE *message // IN: the message being padded 344 #ifdef TEST_RSA // 345 , BYTE *testSeed // IN: optional seed used for testing. 346 #endif // TEST_RSA // 347 ) 348 { 349 UINT32 padLen; 350 UINT32 dbSize; 351 UINT32 i; 352 BYTE mySeed[MAX_DIGEST_SIZE]; 353 BYTE *seed = mySeed; 354 INT32 hLen = _cpri__GetDigestSize(hashAlg); 355 BYTE mask[MAX_RSA_KEY_BYTES]; 356 BYTE *pp; 357 BYTE *pm; 358 UINT32 lSize = 0; 359 CRYPT_RESULT retVal = CRYPT_SUCCESS; 360 pAssert(padded != NULL && message != NULL); 361 // A value of zero is not allowed because the KDF can't produce a result 362 // if the digest size is zero. 363 if(hLen <= 0) 364 return CRYPT_PARAMETER; 365 // If a label is provided, get the length of the string, including the 366 // terminator 367 if(label != NULL) 368 lSize = (UINT32)strlen(label) + 1; 369 // Basic size check 370 // messageSize <= k 2hLen 2 371 if(messageSize > paddedSize - 2 * hLen - 2) 372 return CRYPT_FAIL; 373 // Hash L even if it is null 374 // Offset into padded leaving room for masked seed and byte of zero 375 pp = &padded[hLen + 1]; 376 retVal = _cpri__HashBlock(hashAlg, lSize, (BYTE *)label, hLen, pp); 377 // concatenate PS of k mLen 2hLen 2 378 padLen = paddedSize - messageSize - (2 * hLen) - 2; 379 memset(&pp[hLen], 0, padLen); 380 pp[hLen+padLen] = 0x01; 381 padLen += 1; 382 memcpy(&pp[hLen+padLen], message, messageSize); 383 // The total size of db = hLen + pad + mSize; 384 dbSize = hLen+padLen+messageSize; 385 // If testing, then use the provided seed. Otherwise, use values 386 // from the RNG 387 #ifdef TEST_RSA 388 if(testSeed != NULL) 389 seed = testSeed; 390 else 391 #endif // TEST_RSA 392 _cpri__GenerateRandom(hLen, mySeed); 393 // mask = MGF1 (seed, nSize hLen 1) 394 if((retVal = _cpri__MGF1(dbSize, mask, hashAlg, hLen, seed)) < 0) 395 return retVal; // Don't expect an error because hash size is not zero 396 // was detected in the call to _cpri__HashBlock() above. 397 // Create the masked db 398 pm = mask; 399 for(i = dbSize; i > 0; i--) 400 *pp++ ^= *pm++; 401 pp = &padded[hLen + 1]; 402 // Run the masked data through MGF1 403 if((retVal = _cpri__MGF1(hLen, &padded[1], hashAlg, dbSize, pp)) < 0) 404 return retVal; // Don't expect zero here as the only case for zero 405 // was detected in the call to _cpri__HashBlock() above. 406 // Now XOR the seed to create masked seed 407 pp = &padded[1]; 408 pm = seed; 409 for(i = hLen; i > 0; i--) 410 *pp++ ^= *pm++; 411 // Set the first byte to zero 412 *padded = 0x00; 413 return CRYPT_SUCCESS; 414 } 415 // 416 // 417 // OaepDecode() 418 // 419 // This function performs OAEP padding checking. The size of the buffer to receive the recovered data. If 420 // the padding is not valid, the dSize size is set to zero and the function returns CRYPT_NO_RESULTS. 421 // The dSize parameter is used as an input to indicate the size available in the buffer. If insufficient space is 422 // available, the size is not changed and the return code is CRYPT_FAIL. 423 // 424 // Return Value Meaning 425 // 426 // CRYPT_SUCCESS decode complete 427 // CRYPT_PARAMETER the value to decode was larger than the modulus 428 // CRYPT_FAIL the padding is wrong or the buffer to receive the results is too small 429 // 430 static CRYPT_RESULT 431 OaepDecode( 432 UINT32 *dataOutSize, // IN/OUT: the recovered data size 433 BYTE *dataOut, // OUT: the recovered data 434 TPM_ALG_ID hashAlg, // IN: algorithm to use for padding 435 const char *label, // IN: null-terminated string (may be NULL) 436 UINT32 paddedSize, // IN: the size of the padded data 437 BYTE *padded // IN: the padded data 438 ) 439 { 440 UINT32 dSizeSave; 441 UINT32 i; 442 BYTE seedMask[MAX_DIGEST_SIZE]; 443 INT32 hLen = _cpri__GetDigestSize(hashAlg); 444 BYTE mask[MAX_RSA_KEY_BYTES]; 445 BYTE *pp; 446 BYTE *pm; 447 UINT32 lSize = 0; 448 CRYPT_RESULT retVal = CRYPT_SUCCESS; 449 // Unknown hash 450 pAssert(hLen > 0 && dataOutSize != NULL && dataOut != NULL && padded != NULL); 451 // If there is a label, get its size including the terminating 0x00 452 if(label != NULL) 453 lSize = (UINT32)strlen(label) + 1; 454 // Set the return size to zero so that it doesn't have to be done on each 455 // failure 456 dSizeSave = *dataOutSize; 457 *dataOutSize = 0; 458 // Strange size (anything smaller can't be an OAEP padded block) 459 // Also check for no leading 0 460 if(paddedSize < (unsigned)((2 * hLen) + 2) || *padded != 0) 461 return CRYPT_FAIL; 462 // Use the hash size to determine what to put through MGF1 in order 463 // to recover the seedMask 464 if((retVal = _cpri__MGF1(hLen, seedMask, hashAlg, 465 paddedSize-hLen-1, &padded[hLen+1])) < 0) 466 return retVal; 467 // Recover the seed into seedMask 468 pp = &padded[1]; 469 pm = seedMask; 470 for(i = hLen; i > 0; i--) 471 *pm++ ^= *pp++; 472 // Use the seed to generate the data mask 473 if((retVal = _cpri__MGF1(paddedSize-hLen-1, mask, hashAlg, 474 hLen, seedMask)) < 0) 475 return retVal; 476 // Use the mask generated from seed to recover the padded data 477 pp = &padded[hLen+1]; 478 pm = mask; 479 for(i = paddedSize-hLen-1; i > 0; i--) 480 *pm++ ^= *pp++; 481 // Make sure that the recovered data has the hash of the label 482 // Put trial value in the seed mask 483 if((retVal=_cpri__HashBlock(hashAlg, lSize,(BYTE *)label, hLen, seedMask)) < 0) 484 return retVal; 485 if(memcmp(seedMask, mask, hLen) != 0) 486 return CRYPT_FAIL; 487 // find the start of the data 488 pm = &mask[hLen]; 489 for(i = paddedSize-(2*hLen)-1; i > 0; i--) 490 { 491 if(*pm++ != 0) 492 break; 493 } 494 495 // Magic value in the end of the fill area must be 1, anything else must be 496 // rejected. 497 if (pm[-1] != 1) 498 return CRYPT_FAIL; 499 500 if(i == 0) 501 return CRYPT_PARAMETER; 502 // pm should be pointing at the first part of the data 503 // and i is one greater than the number of bytes to move 504 i--; 505 if(i > dSizeSave) 506 { 507 // Restore dSize 508 *dataOutSize = dSizeSave; 509 return CRYPT_FAIL; 510 } 511 memcpy(dataOut, pm, i); 512 *dataOutSize = i; 513 return CRYPT_SUCCESS; 514 } 515 // 516 // 517 // PKSC1v1_5Encode() 518 // 519 // This function performs the encoding for RSAES-PKCS1-V1_5-ENCRYPT as defined in PKCS#1V2.1 520 // 521 // Return Value Meaning 522 // 523 // CRYPT_SUCCESS data encoded 524 // CRYPT_PARAMETER message size is too large 525 // 526 static CRYPT_RESULT 527 RSAES_PKSC1v1_5Encode( 528 UINT32 paddedSize, // IN: pad value size 529 BYTE *padded, // OUT: the pad data 530 UINT32 messageSize, // IN: the message size 531 BYTE *message // IN: the message being padded 532 ) 533 { 534 UINT32 ps = paddedSize - messageSize - 3; 535 if(messageSize > paddedSize - 11) 536 return CRYPT_PARAMETER; 537 // move the message to the end of the buffer 538 memcpy(&padded[paddedSize - messageSize], message, messageSize); 539 // Set the first byte to 0x00 and the second to 0x02 540 *padded = 0; 541 padded[1] = 2; 542 // Fill with random bytes 543 _cpri__GenerateRandom(ps, &padded[2]); 544 // Set the delimiter for the random field to 0 545 padded[2+ps] = 0; 546 // Now, the only messy part. Make sure that all the ps bytes are non-zero 547 // In this implementation, use the value of the current index 548 for(ps++; ps > 1; ps--) 549 { 550 if(padded[ps] == 0) 551 padded[ps] = 0x55; // In the < 0.5% of the cases that the random 552 // value is 0, just pick a value to put into 553 // the spot. 554 } 555 return CRYPT_SUCCESS; 556 } 557 // 558 // 559 // RSAES_Decode() 560 // 561 // This function performs the decoding for RSAES-PKCS1-V1_5-ENCRYPT as defined in PKCS#1V2.1 562 // 563 // Return Value Meaning 564 // 565 // CRYPT_SUCCESS decode successful 566 // CRYPT_FAIL decoding error or results would no fit into provided buffer 567 // 568 static CRYPT_RESULT 569 RSAES_Decode( 570 UINT32 *messageSize, // IN/OUT: recovered message size 571 BYTE *message, // OUT: the recovered message 572 UINT32 codedSize, // IN: the encoded message size 573 BYTE *coded // IN: the encoded message 574 ) 575 { 576 BOOL fail = FALSE; 577 UINT32 ps; 578 fail = (codedSize < 11); 579 fail |= (coded[0] != 0x00) || (coded[1] != 0x02); 580 for(ps = 2; ps < codedSize; ps++) 581 { 582 if(coded[ps] == 0) 583 break; 584 } 585 ps++; 586 // Make sure that ps has not gone over the end and that there are at least 8 587 // bytes of pad data. 588 fail |= ((ps >= codedSize) || ((ps-2) < 8)); 589 if((*messageSize < codedSize - ps) || fail) 590 return CRYPT_FAIL; 591 *messageSize = codedSize - ps; 592 memcpy(message, &coded[ps], codedSize - ps); 593 return CRYPT_SUCCESS; 594 } 595 // 596 // 597 // PssEncode() 598 // 599 // This function creates an encoded block of data that is the size of modulus. The function uses the 600 // maximum salt size that will fit in the encoded block. 601 // 602 // Return Value Meaning 603 // 604 // CRYPT_SUCCESS encode successful 605 // CRYPT_PARAMETER hashAlg is not a supported hash algorithm 606 // 607 static CRYPT_RESULT 608 PssEncode ( 609 UINT32 eOutSize, // IN: size of the encode data buffer 610 BYTE *eOut, // OUT: encoded data buffer 611 TPM_ALG_ID hashAlg, // IN: hash algorithm to use for the encoding 612 UINT32 hashInSize, // IN: size of digest to encode 613 BYTE *hashIn // IN: the digest 614 #ifdef TEST_RSA // 615 , BYTE *saltIn // IN: optional parameter for testing 616 #endif // TEST_RSA // 617 ) 618 { 619 INT32 hLen = _cpri__GetDigestSize(hashAlg); 620 BYTE salt[MAX_RSA_KEY_BYTES - 1]; 621 UINT16 saltSize; 622 BYTE *ps = salt; 623 CRYPT_RESULT retVal; 624 UINT16 mLen; 625 CPRI_HASH_STATE hashState; 626 // These are fatal errors indicating bad TPM firmware 627 pAssert(eOut != NULL && hLen > 0 && hashIn != NULL ); 628 // Get the size of the mask 629 mLen = (UINT16)(eOutSize - hLen - 1); 630 // Maximum possible salt size is mask length - 1 631 saltSize = mLen - 1; 632 // Use the maximum salt size allowed by FIPS 186-4 633 if(saltSize > hLen) 634 saltSize = (UINT16)hLen; 635 //using eOut for scratch space 636 // Set the first 8 bytes to zero 637 memset(eOut, 0, 8); 638 // Get set the salt 639 #ifdef TEST_RSA 640 if(saltIn != NULL) 641 { 642 saltSize = hLen; 643 memcpy(salt, saltIn, hLen); 644 } 645 else 646 #endif // TEST_RSA 647 _cpri__GenerateRandom(saltSize, salt); 648 // Create the hash of the pad || input hash || salt 649 _cpri__StartHash(hashAlg, FALSE, &hashState); 650 _cpri__UpdateHash(&hashState, 8, eOut); 651 _cpri__UpdateHash(&hashState, hashInSize, hashIn); 652 _cpri__UpdateHash(&hashState, saltSize, salt); 653 _cpri__CompleteHash(&hashState, hLen, &eOut[eOutSize - hLen - 1]); 654 // Create a mask 655 if((retVal = _cpri__MGF1(mLen, eOut, hashAlg, hLen, &eOut[mLen])) < 0) 656 { 657 // Currently _cpri__MGF1 is not expected to return a CRYPT_RESULT error. 658 pAssert(0); 659 } 660 // Since this implementation uses key sizes that are all even multiples of 661 // 8, just need to make sure that the most significant bit is CLEAR 662 eOut[0] &= 0x7f; 663 // Before we mess up the eOut value, set the last byte to 0xbc 664 eOut[eOutSize - 1] = 0xbc; 665 // XOR a byte of 0x01 at the position just before where the salt will be XOR'ed 666 eOut = &eOut[mLen - saltSize - 1]; 667 *eOut++ ^= 0x01; 668 // XOR the salt data into the buffer 669 for(; saltSize > 0; saltSize--) 670 *eOut++ ^= *ps++; 671 // and we are done 672 return CRYPT_SUCCESS; 673 } 674 // 675 // 676 // PssDecode() 677 // 678 // This function checks that the PSS encoded block was built from the provided digest. If the check is 679 // successful, CRYPT_SUCCESS is returned. Any other value indicates an error. 680 // This implementation of PSS decoding is intended for the reference TPM implementation and is not at all 681 // generalized. It is used to check signatures over hashes and assumptions are made about the sizes of 682 // values. Those assumptions are enforce by this implementation. This implementation does allow for a 683 // variable size salt value to have been used by the creator of the signature. 684 // 685 // 686 // 687 // 688 // Return Value Meaning 689 // 690 // CRYPT_SUCCESS decode successful 691 // CRYPT_SCHEME hashAlg is not a supported hash algorithm 692 // CRYPT_FAIL decode operation failed 693 // 694 static CRYPT_RESULT 695 PssDecode( 696 TPM_ALG_ID hashAlg, // IN: hash algorithm to use for the encoding 697 UINT32 dInSize, // IN: size of the digest to compare 698 BYTE *dIn, // In: the digest to compare 699 UINT32 eInSize, // IN: size of the encoded data 700 BYTE *eIn, // IN: the encoded data 701 UINT32 saltSize // IN: the expected size of the salt 702 ) 703 { 704 INT32 hLen = _cpri__GetDigestSize(hashAlg); 705 BYTE mask[MAX_RSA_KEY_BYTES]; 706 BYTE *pm = mask; 707 BYTE pad[8] = {0}; 708 UINT32 i; 709 UINT32 mLen; 710 BOOL fail = FALSE; 711 CRYPT_RESULT retVal; 712 CPRI_HASH_STATE hashState; 713 // These errors are indicative of failures due to programmer error 714 pAssert(dIn != NULL && eIn != NULL); 715 // check the hash scheme 716 if(hLen == 0) 717 return CRYPT_SCHEME; 718 // most significant bit must be zero 719 fail = ((eIn[0] & 0x80) != 0); 720 // last byte must be 0xbc 721 fail |= (eIn[eInSize - 1] != 0xbc); 722 // Use the hLen bytes at the end of the buffer to generate a mask 723 // Doesn't start at the end which is a flag byte 724 mLen = eInSize - hLen - 1; 725 if((retVal = _cpri__MGF1(mLen, mask, hashAlg, hLen, &eIn[mLen])) < 0) 726 return retVal; 727 if(retVal == 0) 728 return CRYPT_FAIL; 729 // Clear the MSO of the mask to make it consistent with the encoding. 730 mask[0] &= 0x7F; 731 // XOR the data into the mask to recover the salt. This sequence 732 // advances eIn so that it will end up pointing to the seed data 733 // which is the hash of the signature data 734 for(i = mLen; i > 0; i--) 735 *pm++ ^= *eIn++; 736 // Find the first byte of 0x01 after a string of all 0x00 737 for(pm = mask, i = mLen; i > 0; i--) 738 { 739 if(*pm == 0x01) 740 break; 741 else 742 fail |= (*pm++ != 0); 743 } 744 fail |= (i == 0); 745 // if we have failed, will continue using the entire mask as the salt value so 746 // that the timing attacks will not disclose anything (I don't think that this 747 // is a problem for TPM applications but, usually, we don't fail so this 748 // doesn't cost anything). 749 if(fail) 750 { 751 i = mLen; 752 pm = mask; 753 } 754 else 755 { 756 pm++; 757 i--; 758 } 759 // If the salt size was provided, then the recovered size must match 760 fail |= (saltSize != 0 && i != saltSize); 761 // i contains the salt size and pm points to the salt. Going to use the input 762 // hash and the seed to recreate the hash in the lower portion of eIn. 763 _cpri__StartHash(hashAlg, FALSE, &hashState); 764 // add the pad of 8 zeros 765 _cpri__UpdateHash(&hashState, 8, pad); 766 // add the provided digest value 767 _cpri__UpdateHash(&hashState, dInSize, dIn); 768 // and the salt 769 _cpri__UpdateHash(&hashState, i, pm); 770 // get the result 771 retVal = _cpri__CompleteHash(&hashState, MAX_DIGEST_SIZE, mask); 772 // retVal will be the size of the digest or zero. If not equal to the indicated 773 // digest size, then the signature doesn't match 774 fail |= (retVal != hLen); 775 fail |= (memcmp(mask, eIn, hLen) != 0); 776 if(fail) 777 return CRYPT_FAIL; 778 else 779 return CRYPT_SUCCESS; 780 } 781 // 782 // 783 // PKSC1v1_5SignEncode() 784 // 785 // Encode a message using PKCS1v1().5 method. 786 // 787 // Return Value Meaning 788 // 789 // CRYPT_SUCCESS encode complete 790 // CRYPT_SCHEME hashAlg is not a supported hash algorithm 791 // CRYPT_PARAMETER eOutSize is not large enough or hInSize does not match the digest 792 // size of hashAlg 793 // 794 static CRYPT_RESULT 795 RSASSA_Encode( 796 UINT32 eOutSize, // IN: the size of the resulting block 797 BYTE *eOut, // OUT: the encoded block 798 TPM_ALG_ID hashAlg, // IN: hash algorithm for PKSC1v1_5 799 UINT32 hInSize, // IN: size of hash to be signed 800 BYTE *hIn // IN: hash buffer 801 ) 802 { 803 const BYTE *der; 804 INT32 derSize = _cpri__GetHashDER(hashAlg, &der); 805 INT32 fillSize; 806 pAssert(eOut != NULL && hIn != NULL); 807 // Can't use this scheme if the algorithm doesn't have a DER string defined. 808 if( 809 #if defined(SUPPORT_PADDING_ONLY_RSASSA) && SUPPORT_PADDING_ONLY_RSASSA == YES 810 hashAlg != TPM_ALG_NULL && 811 #endif 812 derSize == 0) 813 return CRYPT_SCHEME; 814 // If the digest size of 'hashAl' doesn't match the input digest size, then 815 // the DER will misidentify the digest so return an error 816 if( 817 #if defined(SUPPORT_PADDING_ONLY_RSASSA) && SUPPORT_PADDING_ONLY_RSASSA == YES 818 hashAlg != TPM_ALG_NULL && 819 #endif 820 (unsigned)_cpri__GetDigestSize(hashAlg) != hInSize) 821 return CRYPT_PARAMETER; 822 fillSize = eOutSize - derSize - hInSize - 3; 823 // Make sure that this combination will fit in the provided space 824 if(fillSize < 8) 825 return CRYPT_PARAMETER; 826 // Start filling 827 *eOut++ = 0; // initial byte of zero 828 *eOut++ = 1; // byte of 0x01 829 for(; fillSize > 0; fillSize--) 830 *eOut++ = 0xff; // bunch of 0xff 831 *eOut++ = 0; // another 0 832 for(; derSize > 0; derSize--) 833 *eOut++ = *der++; // copy the DER 834 for(; hInSize > 0; hInSize--) 835 *eOut++ = *hIn++; // copy the hash 836 return CRYPT_SUCCESS; 837 } 838 // 839 // 840 // RSASSA_Decode() 841 // 842 // This function performs the RSASSA decoding of a signature. 843 // 844 // Return Value Meaning 845 // 846 // CRYPT_SUCCESS decode successful 847 // CRYPT_FAIL decode unsuccessful 848 // CRYPT_SCHEME haslAlg is not supported 849 // 850 static CRYPT_RESULT 851 RSASSA_Decode( 852 TPM_ALG_ID hashAlg, // IN: hash algorithm to use for the encoding 853 UINT32 hInSize, // IN: size of the digest to compare 854 BYTE *hIn, // In: the digest to compare 855 UINT32 eInSize, // IN: size of the encoded data 856 BYTE *eIn // IN: the encoded data 857 ) 858 { 859 BOOL fail = FALSE; 860 const BYTE *der; 861 INT32 derSize = _cpri__GetHashDER(hashAlg, &der); 862 INT32 hashSize = _cpri__GetDigestSize(hashAlg); 863 INT32 fillSize; 864 pAssert(hIn != NULL && eIn != NULL); 865 // Can't use this scheme if the algorithm doesn't have a DER string 866 // defined or if the provided hash isn't the right size 867 if(derSize == 0 || (unsigned)hashSize != hInSize) 868 return CRYPT_SCHEME; 869 // Make sure that this combination will fit in the provided space 870 // Since no data movement takes place, can just walk though this 871 // and accept nearly random values. This can only be called from 872 // _cpri__ValidateSignature() so eInSize is known to be in range. 873 fillSize = eInSize - derSize - hashSize - 3; 874 // Start checking 875 fail |= (*eIn++ != 0); // initial byte of zero 876 fail |= (*eIn++ != 1); // byte of 0x01 877 for(; fillSize > 0; fillSize--) 878 fail |= (*eIn++ != 0xff); // bunch of 0xff 879 fail |= (*eIn++ != 0); // another 0 880 for(; derSize > 0; derSize--) 881 fail |= (*eIn++ != *der++); // match the DER 882 for(; hInSize > 0; hInSize--) 883 fail |= (*eIn++ != *hIn++); // match the hash 884 if(fail) 885 return CRYPT_FAIL; 886 return CRYPT_SUCCESS; 887 } 888 // 889 // 890 // Externally Accessible Functions 891 // 892 // _cpri__RsaStartup() 893 // 894 // Function that is called to initialize the hash service. In this implementation, this function does nothing but 895 // it is called by the CryptUtilStartup() function and must be present. 896 // 897 LIB_EXPORT BOOL 898 _cpri__RsaStartup( 899 void 900 ) 901 { 902 return TRUE; 903 } 904 // 905 // 906 // _cpri__EncryptRSA() 907 // 908 // This is the entry point for encryption using RSA. Encryption is use of the public exponent. The padding 909 // parameter determines what padding will be used. 910 // The cOutSize parameter must be at least as large as the size of the key. 911 // If the padding is RSA_PAD_NONE, dIn is treaded as a number. It must be lower in value than the key 912 // modulus. 913 // 914 // 915 // 916 // NOTE: If dIn has fewer bytes than cOut, then we don't add low-order zeros to dIn to make it the size of the RSA key for 917 // the call to RSAEP. This is because the high order bytes of dIn might have a numeric value that is greater than 918 // the value of the key modulus. If this had low-order zeros added, it would have a numeric value larger than the 919 // modulus even though it started out with a lower numeric value. 920 // 921 // 922 // Return Value Meaning 923 // 924 // CRYPT_SUCCESS encryption complete 925 // CRYPT_PARAMETER cOutSize is too small (must be the size of the modulus) 926 // CRYPT_SCHEME padType is not a supported scheme 927 // 928 LIB_EXPORT CRYPT_RESULT 929 _cpri__EncryptRSA( 930 UINT32 *cOutSize, // OUT: the size of the encrypted data 931 BYTE *cOut, // OUT: the encrypted data 932 RSA_KEY *key, // IN: the key to use for encryption 933 TPM_ALG_ID padType, // IN: the type of padding 934 UINT32 dInSize, // IN: the amount of data to encrypt 935 BYTE *dIn, // IN: the data to encrypt 936 TPM_ALG_ID hashAlg, // IN: in case this is needed 937 const char *label // IN: in case it is needed 938 ) 939 { 940 CRYPT_RESULT retVal = CRYPT_SUCCESS; 941 pAssert(cOutSize != NULL); 942 // All encryption schemes return the same size of data 943 if(*cOutSize < key->publicKey->size) 944 return CRYPT_PARAMETER; 945 *cOutSize = key->publicKey->size; 946 switch (padType) 947 { 948 case TPM_ALG_NULL: // 'raw' encryption 949 { 950 // dIn can have more bytes than cOut as long as the extra bytes 951 // are zero 952 for(; dInSize > *cOutSize; dInSize--) 953 { 954 if(*dIn++ != 0) 955 return CRYPT_PARAMETER; 956 } 957 // If dIn is smaller than cOut, fill cOut with zeros 958 if(dInSize < *cOutSize) 959 memset(cOut, 0, *cOutSize - dInSize); 960 // Copy the rest of the value 961 memcpy(&cOut[*cOutSize-dInSize], dIn, dInSize); 962 // If the size of dIn is the same as cOut dIn could be larger than 963 // the modulus. If it is, then RSAEP() will catch it. 964 } 965 break; 966 case TPM_ALG_RSAES: 967 retVal = RSAES_PKSC1v1_5Encode(*cOutSize, cOut, dInSize, dIn); 968 break; 969 case TPM_ALG_OAEP: 970 retVal = OaepEncode(*cOutSize, cOut, hashAlg, label, dInSize, dIn 971 #ifdef TEST_RSA 972 ,NULL 973 #endif 974 ); 975 break; 976 default: 977 return CRYPT_SCHEME; 978 } 979 // All the schemes that do padding will come here for the encryption step 980 // Check that the Encoding worked 981 if(retVal != CRYPT_SUCCESS) 982 return retVal; 983 // Padding OK so do the encryption 984 return RSAEP(*cOutSize, cOut, key); 985 } 986 // 987 // 988 // _cpri__DecryptRSA() 989 // 990 // This is the entry point for decryption using RSA. Decryption is use of the private exponent. The padType 991 // parameter determines what padding was used. 992 // 993 // Return Value Meaning 994 // 995 // CRYPT_SUCCESS successful completion 996 // CRYPT_PARAMETER cInSize is not the same as the size of the public modulus of key; or 997 // numeric value of the encrypted data is greater than the modulus 998 // CRYPT_FAIL dOutSize is not large enough for the result 999 // CRYPT_SCHEME padType is not supported 1000 // 1001 LIB_EXPORT CRYPT_RESULT 1002 _cpri__DecryptRSA( 1003 UINT32 *dOutSize, // OUT: the size of the decrypted data 1004 BYTE *dOut, // OUT: the decrypted data 1005 RSA_KEY *key, // IN: the key to use for decryption 1006 TPM_ALG_ID padType, // IN: the type of padding 1007 UINT32 cInSize, // IN: the amount of data to decrypt 1008 BYTE *cIn, // IN: the data to decrypt 1009 TPM_ALG_ID hashAlg, // IN: in case this is needed for the scheme 1010 const char *label // IN: in case it is needed for the scheme 1011 ) 1012 { 1013 CRYPT_RESULT retVal; 1014 // Make sure that the necessary parameters are provided 1015 pAssert(cIn != NULL && dOut != NULL && dOutSize != NULL && key != NULL); 1016 // Size is checked to make sure that the decryption works properly 1017 if(cInSize != key->publicKey->size) 1018 return CRYPT_PARAMETER; 1019 // For others that do padding, do the decryption in place and then 1020 // go handle the decoding. 1021 if((retVal = RSADP(cInSize, cIn, key)) != CRYPT_SUCCESS) 1022 return retVal; // Decryption failed 1023 // Remove padding 1024 switch (padType) 1025 { 1026 case TPM_ALG_NULL: 1027 if(*dOutSize < key->publicKey->size) 1028 return CRYPT_FAIL; 1029 *dOutSize = key->publicKey->size; 1030 memcpy(dOut, cIn, *dOutSize); 1031 return CRYPT_SUCCESS; 1032 case TPM_ALG_RSAES: 1033 return RSAES_Decode(dOutSize, dOut, cInSize, cIn); 1034 break; 1035 case TPM_ALG_OAEP: 1036 return OaepDecode(dOutSize, dOut, hashAlg, label, cInSize, cIn); 1037 break; 1038 default: 1039 return CRYPT_SCHEME; 1040 break; 1041 } 1042 } 1043 // 1044 // 1045 // _cpri__SignRSA() 1046 // 1047 // This function is used to generate an RSA signature of the type indicated in scheme. 1048 // 1049 // Return Value Meaning 1050 // 1051 // CRYPT_SUCCESS sign operation completed normally 1052 // CRYPT_SCHEME scheme or hashAlg are not supported 1053 // CRYPT_PARAMETER hInSize does not match hashAlg (for RSASSA) 1054 // 1055 LIB_EXPORT CRYPT_RESULT 1056 _cpri__SignRSA( 1057 UINT32 *sigOutSize, // OUT: size of signature 1058 BYTE *sigOut, // OUT: signature 1059 RSA_KEY *key, // IN: key to use 1060 TPM_ALG_ID scheme, // IN: the scheme to use 1061 TPM_ALG_ID hashAlg, // IN: hash algorithm for PKSC1v1_5 1062 UINT32 hInSize, // IN: size of digest to be signed 1063 BYTE *hIn // IN: digest buffer 1064 ) 1065 { 1066 CRYPT_RESULT retVal; 1067 // Parameter checks 1068 pAssert(sigOutSize != NULL && sigOut != NULL && key != NULL && hIn != NULL); 1069 // For all signatures the size is the size of the key modulus 1070 *sigOutSize = key->publicKey->size; 1071 switch (scheme) 1072 { 1073 case TPM_ALG_NULL: 1074 *sigOutSize = 0; 1075 return CRYPT_SUCCESS; 1076 case TPM_ALG_RSAPSS: 1077 // PssEncode can return CRYPT_PARAMETER 1078 retVal = PssEncode(*sigOutSize, sigOut, hashAlg, hInSize, hIn 1079 #ifdef TEST_RSA 1080 , NULL 1081 #endif 1082 ); 1083 break; 1084 case TPM_ALG_RSASSA: 1085 // RSASSA_Encode can return CRYPT_PARAMETER or CRYPT_SCHEME 1086 retVal = RSASSA_Encode(*sigOutSize, sigOut, hashAlg, hInSize, hIn); 1087 break; 1088 default: 1089 return CRYPT_SCHEME; 1090 } 1091 if(retVal != CRYPT_SUCCESS) 1092 return retVal; 1093 // Do the encryption using the private key 1094 // RSADP can return CRYPT_PARAMETR 1095 return RSADP(*sigOutSize,sigOut, key); 1096 } 1097 // 1098 // 1099 // _cpri__ValidateSignatureRSA() 1100 // 1101 // This function is used to validate an RSA signature. If the signature is valid CRYPT_SUCCESS is 1102 // returned. If the signature is not valid, CRYPT_FAIL is returned. Other return codes indicate either 1103 // parameter problems or fatal errors. 1104 // 1105 // Return Value Meaning 1106 // 1107 // CRYPT_SUCCESS the signature checks 1108 // CRYPT_FAIL the signature does not check 1109 // CRYPT_SCHEME unsupported scheme or hash algorithm 1110 // 1111 LIB_EXPORT CRYPT_RESULT 1112 _cpri__ValidateSignatureRSA( 1113 RSA_KEY *key, // IN: key to use 1114 TPM_ALG_ID scheme, // IN: the scheme to use 1115 TPM_ALG_ID hashAlg, // IN: hash algorithm 1116 UINT32 hInSize, // IN: size of digest to be checked 1117 BYTE *hIn, // IN: digest buffer 1118 UINT32 sigInSize, // IN: size of signature 1119 BYTE *sigIn, // IN: signature 1120 UINT16 saltSize // IN: salt size for PSS 1121 ) 1122 { 1123 CRYPT_RESULT retVal; 1124 // Fatal programming errors 1125 pAssert(key != NULL && sigIn != NULL && hIn != NULL); 1126 // Errors that might be caused by calling parameters 1127 if(sigInSize != key->publicKey->size) 1128 return CRYPT_FAIL; 1129 // Decrypt the block 1130 if((retVal = RSAEP(sigInSize, sigIn, key)) != CRYPT_SUCCESS) 1131 return CRYPT_FAIL; 1132 switch (scheme) 1133 { 1134 case TPM_ALG_NULL: 1135 return CRYPT_SCHEME; 1136 break; 1137 case TPM_ALG_RSAPSS: 1138 return PssDecode(hashAlg, hInSize, hIn, sigInSize, sigIn, saltSize); 1139 break; 1140 case TPM_ALG_RSASSA: 1141 return RSASSA_Decode(hashAlg, hInSize, hIn, sigInSize, sigIn); 1142 break; 1143 default: 1144 break; 1145 } 1146 return CRYPT_SCHEME; 1147 } 1148 #ifndef RSA_KEY_SIEVE 1149 // 1150 // 1151 // _cpri__GenerateKeyRSA() 1152 // 1153 // Generate an RSA key from a provided seed 1154 // 1155 // 1156 // 1157 // 1158 // Return Value Meaning 1159 // 1160 // CRYPT_FAIL exponent is not prime or is less than 3; or could not find a prime using 1161 // the provided parameters 1162 // CRYPT_CANCEL operation was canceled 1163 // 1164 LIB_EXPORT CRYPT_RESULT 1165 _cpri__GenerateKeyRSA( 1166 TPM2B *n, // OUT: The public modulu 1167 TPM2B *p, // OUT: One of the prime factors of n 1168 UINT16 keySizeInBits, // IN: Size of the public modulus in bit 1169 UINT32 e, // IN: The public exponent 1170 TPM_ALG_ID hashAlg, // IN: hash algorithm to use in the key 1171 // generation proce 1172 TPM2B *seed, // IN: the seed to use 1173 const char *label, // IN: A label for the generation process. 1174 TPM2B *extra, // IN: Party 1 data for the KDF 1175 UINT32 *counter // IN/OUT: Counter value to allow KFD iteration 1176 // to be propagated across multiple routine 1177 ) 1178 { 1179 UINT32 lLen; // length of the label 1180 // (counting the terminating 0); 1181 UINT16 digestSize = _cpri__GetDigestSize(hashAlg); 1182 TPM2B_HASH_BLOCK oPadKey; 1183 UINT32 outer; 1184 UINT32 inner; 1185 BYTE swapped[4]; 1186 CRYPT_RESULT retVal; 1187 int i, fill; 1188 const static char defaultLabel[] = "RSA key"; 1189 BYTE *pb; 1190 CPRI_HASH_STATE h1; // contains the hash of the 1191 // HMAC key w/ iPad 1192 CPRI_HASH_STATE h2; // contains the hash of the 1193 // HMAC key w/ oPad 1194 CPRI_HASH_STATE h; // the working hash context 1195 BIGNUM *bnP; 1196 BIGNUM *bnQ; 1197 BIGNUM *bnT; 1198 BIGNUM *bnE; 1199 BIGNUM *bnN; 1200 BN_CTX *context; 1201 UINT32 rem; 1202 // Make sure that hashAlg is valid hash 1203 pAssert(digestSize != 0); 1204 // if present, use externally provided counter 1205 if(counter != NULL) 1206 outer = *counter; 1207 else 1208 outer = 1; 1209 // Validate exponent 1210 UINT32_TO_BYTE_ARRAY(e, swapped); 1211 // Need to check that the exponent is prime and not less than 3 1212 if( e != 0 && (e < 3 || !_math__IsPrime(e))) 1213 return CRYPT_FAIL; 1214 // Get structures for the big number representations 1215 context = BN_CTX_new(); 1216 if(context == NULL) 1217 FAIL(FATAL_ERROR_ALLOCATION); 1218 BN_CTX_start(context); 1219 bnP = BN_CTX_get(context); 1220 bnQ = BN_CTX_get(context); 1221 bnT = BN_CTX_get(context); 1222 bnE = BN_CTX_get(context); 1223 bnN = BN_CTX_get(context); 1224 if(bnN == NULL) 1225 FAIL(FATAL_ERROR_INTERNAL); 1226 // Set Q to zero. This is used as a flag. The prime is computed in P. When a 1227 // new prime is found, Q is checked to see if it is zero. If so, P is copied 1228 // to Q and a new P is found. When both P and Q are non-zero, the modulus and 1229 // private exponent are computed and a trial encryption/decryption is 1230 // performed. If the encrypt/decrypt fails, assume that at least one of the 1231 // primes is composite. Since we don't know which one, set Q to zero and start 1232 // over and find a new pair of primes. 1233 BN_zero(bnQ); 1234 // Need to have some label 1235 if(label == NULL) 1236 label = (const char *)&defaultLabel; 1237 // Get the label size 1238 for(lLen = 0; label[lLen++] != 0;); 1239 // Start the hash using the seed and get the intermediate hash value 1240 _cpri__StartHMAC(hashAlg, FALSE, &h1, seed->size, seed->buffer, &oPadKey.b); 1241 _cpri__StartHash(hashAlg, FALSE, &h2); 1242 _cpri__UpdateHash(&h2, oPadKey.b.size, oPadKey.b.buffer); 1243 n->size = (keySizeInBits +7)/8; 1244 pAssert(n->size <= MAX_RSA_KEY_BYTES); 1245 p->size = n->size / 2; 1246 if(e == 0) 1247 e = RSA_DEFAULT_PUBLIC_EXPONENT; 1248 BN_set_word(bnE, e); 1249 // The first test will increment the counter from zero. 1250 for(outer += 1; outer != 0; outer++) 1251 { 1252 if(_plat__IsCanceled()) 1253 { 1254 retVal = CRYPT_CANCEL; 1255 goto Cleanup; 1256 } 1257 // Need to fill in the candidate with the hash 1258 fill = digestSize; 1259 pb = p->buffer; 1260 // Reset the inner counter 1261 inner = 0; 1262 for(i = p->size; i > 0; i -= digestSize) 1263 { 1264 inner++; 1265 // Initialize the HMAC with saved state 1266 _cpri__CopyHashState(&h, &h1); 1267 // Hash the inner counter (the one that changes on each HMAC iteration) 1268 UINT32_TO_BYTE_ARRAY(inner, swapped); 1269 _cpri__UpdateHash(&h, 4, swapped); 1270 _cpri__UpdateHash(&h, lLen, (BYTE *)label); 1271 // Is there any party 1 data 1272 if(extra != NULL) 1273 _cpri__UpdateHash(&h, extra->size, extra->buffer); 1274 // Include the outer counter (the one that changes on each prime 1275 // prime candidate generation 1276 UINT32_TO_BYTE_ARRAY(outer, swapped); 1277 _cpri__UpdateHash(&h, 4, swapped); 1278 _cpri__UpdateHash(&h, 2, (BYTE *)&keySizeInBits); 1279 if(i < fill) 1280 fill = i; 1281 _cpri__CompleteHash(&h, fill, pb); 1282 // Restart the oPad hash 1283 _cpri__CopyHashState(&h, &h2); 1284 // Add the last hashed data 1285 _cpri__UpdateHash(&h, fill, pb); 1286 // gives a completed HMAC 1287 _cpri__CompleteHash(&h, fill, pb); 1288 pb += fill; 1289 } 1290 // Set the Most significant 2 bits and the low bit of the candidate 1291 p->buffer[0] |= 0xC0; 1292 p->buffer[p->size - 1] |= 1; 1293 // Convert the candidate to a BN 1294 BN_bin2bn(p->buffer, p->size, bnP); 1295 // If this is the second prime, make sure that it differs from the 1296 // first prime by at least 2^100 1297 if(!BN_is_zero(bnQ)) 1298 { 1299 // bnQ is non-zero if we already found it 1300 if(BN_ucmp(bnP, bnQ) < 0) 1301 BN_sub(bnT, bnQ, bnP); 1302 else 1303 BN_sub(bnT, bnP, bnQ); 1304 if(BN_num_bits(bnT) < 100) // Difference has to be at least 100 bits 1305 continue; 1306 } 1307 // Make sure that the prime candidate (p) is not divisible by the exponent 1308 // and that (p-1) is not divisible by the exponent 1309 // Get the remainder after dividing by the modulus 1310 rem = BN_mod_word(bnP, e); 1311 if(rem == 0) // evenly divisible so add two keeping the number odd and 1312 // making sure that 1 != p mod e 1313 BN_add_word(bnP, 2); 1314 else if(rem == 1) // leaves a remainder of 1 so subtract two keeping the 1315 // number odd and making (e-1) = p mod e 1316 BN_sub_word(bnP, 2); 1317 // Have a candidate, check for primality 1318 if((retVal = (CRYPT_RESULT)BN_is_prime_ex(bnP, 1319 BN_prime_checks, NULL, NULL)) < 0) 1320 FAIL(FATAL_ERROR_INTERNAL); 1321 if(retVal != 1) 1322 continue; 1323 // Found a prime, is this the first or second. 1324 if(BN_is_zero(bnQ)) 1325 { 1326 // copy p to q and compute another prime in p 1327 BN_copy(bnQ, bnP); 1328 continue; 1329 } 1330 //Form the public modulus 1331 BN_mul(bnN, bnP, bnQ, context); 1332 if(BN_num_bits(bnN) != keySizeInBits) 1333 FAIL(FATAL_ERROR_INTERNAL); 1334 // Save the public modulus 1335 BnTo2B(n, bnN, n->size); // Will pad the buffer to the correct size 1336 pAssert((n->buffer[0] & 0x80) != 0); 1337 // And one prime 1338 BnTo2B(p, bnP, p->size); 1339 pAssert((p->buffer[0] & 0x80) != 0); 1340 // Finish by making sure that we can form the modular inverse of PHI 1341 // with respect to the public exponent 1342 // Compute PHI = (p - 1)(q - 1) = n - p - q + 1 1343 // Make sure that we can form the modular inverse 1344 BN_sub(bnT, bnN, bnP); 1345 BN_sub(bnT, bnT, bnQ); 1346 BN_add_word(bnT, 1); 1347 // find d such that (Phi * d) mod e ==1 1348 // If there isn't then we are broken because we took the step 1349 // of making sure that the prime != 1 mod e so the modular inverse 1350 // must exist 1351 if(BN_mod_inverse(bnT, bnE, bnT, context) == NULL || BN_is_zero(bnT)) 1352 FAIL(FATAL_ERROR_INTERNAL); 1353 // And, finally, do a trial encryption decryption 1354 { 1355 TPM2B_TYPE(RSA_KEY, MAX_RSA_KEY_BYTES); 1356 TPM2B_RSA_KEY r; 1357 r.t.size = sizeof(n->size); 1358 // If we are using a seed, then results must be reproducible on each 1359 // call. Otherwise, just get a random number 1360 if(seed == NULL) 1361 _cpri__GenerateRandom(n->size, r.t.buffer); 1362 else 1363 { 1364 // this this version does not have a deterministic RNG, XOR the 1365 // public key and private exponent to get a deterministic value 1366 // for testing. 1367 int i; 1368 // Generate a random-ish number starting with the public modulus 1369 // XORed with the MSO of the seed 1370 for(i = 0; i < n->size; i++) 1371 r.t.buffer[i] = n->buffer[i] ^ seed->buffer[0]; 1372 } 1373 // Make sure that the number is smaller than the public modulus 1374 r.t.buffer[0] &= 0x7F; 1375 // Convert 1376 if( BN_bin2bn(r.t.buffer, r.t.size, bnP) == NULL 1377 // Encrypt with the public exponent 1378 || BN_mod_exp(bnQ, bnP, bnE, bnN, context) != 1 1379 // Decrypt with the private exponent 1380 || BN_mod_exp(bnQ, bnQ, bnT, bnN, context) != 1) 1381 FAIL(FATAL_ERROR_INTERNAL); 1382 // If the starting and ending values are not the same, start over )-; 1383 if(BN_ucmp(bnP, bnQ) != 0) 1384 { 1385 BN_zero(bnQ); 1386 continue; 1387 } 1388 } 1389 retVal = CRYPT_SUCCESS; 1390 goto Cleanup; 1391 } 1392 retVal = CRYPT_FAIL; 1393 Cleanup: 1394 // Close out the hash sessions 1395 _cpri__CompleteHash(&h2, 0, NULL); 1396 _cpri__CompleteHash(&h1, 0, NULL); 1397 // Free up allocated BN values 1398 BN_CTX_end(context); 1399 BN_CTX_free(context); 1400 if(counter != NULL) 1401 *counter = outer; 1402 return retVal; 1403 } 1404 #endif // RSA_KEY_SIEVE 1405 #endif // TPM_ALG_RSA 1406