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