Exemple #1
0
S4Err  TestUtilties()
{
    S4Err     err = kS4Err_NoErr;

    OPTESTLogInfo("\nTesting z-base-32 Encoding\n");

    err = testZbase32();

    OPTESTLogInfo("\n\n");

done:
    return err;

}
Exemple #2
0
 SCLError  TestECC()
{
    SCLError     err = kSCLError_NoErr;

    OPTESTLogInfo("\nTesting ECC\n");
    err = sTestECC(384); CKERR;
    err = sTestECC(414); CKERR;
    OPTESTLogInfo("\n");
    
    OPTESTLogInfo("\nTesting ECC-DH\n");
    err = sTestECC_DH(384); CKERR;
    OPTESTLogVerbose("\n");
    err = sTestECC_DH(414); CKERR;
    OPTESTLogInfo("\n");
  
    
    
    
done:
     return err;

}
S4Err  TestSecretSharing()
{
   
    S4Err       err = kS4Err_NoErr;
    uint8_t     PT[PTsize];
    uint8_t     PT1[sizeof (PT)];
    size_t      keyLen      = 0;

    SHARES_ShareInfo*   shareInfo[kNumShares];
    SHARES_ShareInfo*   testShares[kShareThreshold];
    uint8_t             testOffset[kShareThreshold];
    
    SHARES_ContextRef   shareCTX  = kInvalidSHARES_ContextRef;
    
      uint32_t 	i;

    
    OPTESTLogInfo("\nTesting Shamir Key Spliting\n");
 
    // create a random key
    err = RNG_GetBytes(PT, sizeof(PT)); CKERR;
    
    OPTESTLogVerbose("\t\tKey Data: (%ld bytes)\n", PTsize);
    dumpHex(IF_LOG_DEBUG, PT,  (int)sizeof (PT), 0);
    OPTESTLogDebug("\n");
 
    
    err = SHARES_Init( PT, sizeof(PT),
                      kNumShares,
                      kShareThreshold,
                      &shareCTX); CKERR;
 
    for(i = 0; i < kNumShares; i++)
    {
        size_t shareLen = 0;
        
        err = SHARES_GetShareInfo(shareCTX, i, &shareInfo[i], &shareLen); CKERR;
      
        if(IF_LOG_VERBOSE)
        {
            OPTESTLogVerbose("\t  Share %d: (%d bytes)\n", i,shareLen);
            dumpHex(IF_LOG_DEBUG, shareInfo[i]->shareSecret  , (int)shareInfo[i]->shareSecretLen, 0);
            OPTESTLogVerbose("\n");
        }
        
        
//        OPTESTLogVerbose("\t Check shares for data leakage against known original message...");
//             /*  check shares for data leakage against known original message */
//            err = CMP(shareBuf+(shareSize *i) + kSHAMIR_HEADERSIZE,
//                      PT,  sizeof (PT))
//            ? kS4Err_SelfTestFailed : kS4Err_NoErr;
//            CKERR;
    
      }
    
    // create threshold number of shares to test with
    sCreateTestOffsets(testOffset, sizeof(testOffset));
    
    for(i = 0; i < kShareThreshold; i++)
          testShares[i] = shareInfo[testOffset[i]];
  
 
    /* attempt to combine with not enough shares */
   err =  SHARES_CombineShareInfo(kShareThreshold -1, testShares, PT1, sizeof(PT1),
                             &keyLen);
    
    OPTESTLogVerbose("\t Attempt to combine with not enough shares = %s\n",
                     IsS4Err(err)?"fail":"pass");
    if(err == kS4Err_NotEnoughShares) err = kS4Err_NoErr;
    CKERR;
    
    /* Reconstruct data */
    OPTESTLogVerbose("\t Reconstructing data with just %d shares...",kShareThreshold);
  err = SHARES_CombineShareInfo(kShareThreshold, testShares, PT1, sizeof(PT1),
                              &keyLen); CKERR;

    OPTESTLogVerbose("OK\n");
    
    /*  check result against known original message */
    OPTESTLogVerbose("\t Check result against known original message...\n");
    err = compare2Results(PT, sizeof(PT), PT1, keyLen, kResultFormat_Byte, "SHAMIR Reconstruct");  //CKERR;

   
    OPTESTLogInfo("\n");
    
done:
    
    for(i = 0; i < kNumShares; i++)
    {
        if(shareInfo[i]) XFREE(shareInfo[i]);
    }
    
    if(SHARES_ContextRefIsValid(shareCTX))
        SHARES_Free(shareCTX);
    
    return err;
    
}
Exemple #4
0
static SCLError sTestECC(int keySize)
{
#define PTsize 32

    SCLError     err = kSCLError_NoErr;
    int     i;
    
    uint8_t        PT[PTsize];
    
    uint8_t        CT[256];
    size_t         CTlen = 0;
    
    uint8_t        DT[PTsize];
    size_t         DTlen = 0;
    
    uint8_t         pubKey[256];
    size_t          pubKeyLen = 0;
    
    uint8_t         privKey[256];
    size_t          privKeyLen = 0;
 
    bool isPrivate = false;
    size_t  importKeySize = 0;
    bool    isANSIx963 = false;

    //   uint8_t             tempBuf[256];
    //   unsigned long       tempLen;
    
    
    OPTESTLogInfo("\tECC-%d \n",  keySize);
    
    ECC_ContextRef ecc = kInvalidECC_ContextRef;
    ECC_ContextRef eccPub = kInvalidECC_ContextRef;
    
    // fill PT
    for(i = 0; i< PTsize; i++) PT[i]= i;
    
    err = ECC_Init(&ecc);

    OPTESTLogVerbose("\t\tGenerate Pub Key (%ld bytes)\n", pubKeyLen);
    err = ECC_Generate(ecc, keySize); CKERR;
    
    err =  ECC_Export_ANSI_X963( ecc, pubKey, sizeof(pubKey), &pubKeyLen);CKERR;
    OPTESTLogVerbose("\t\tExport Public Key (%ld bytes)\n", pubKeyLen);
    dumpHex(IF_LOG_DEBUG, pubKey,  (int)pubKeyLen, 0);

    err = ECC_Import_Info( pubKey, pubKeyLen, &isPrivate, &isANSIx963, &importKeySize );CKERR;
    OPTESTLogVerbose("\t\t\t%d bit %s%s key\n", (int)importKeySize , isANSIx963 ?"ANSI x9.63 ":"", isPrivate ?"private":"public");
    
    err =  ECC_Export(ecc, true, privKey, sizeof(privKey), &privKeyLen);CKERR;
    OPTESTLogVerbose("\t\tExport Private Key (%ld bytes)\n", privKeyLen);
    dumpHex(IF_LOG_DEBUG, privKey,  (int)privKeyLen, 0);
    
    err = ECC_Import_Info( privKey, privKeyLen, &isPrivate, &isANSIx963, &importKeySize );CKERR;
    OPTESTLogVerbose("\t\t\t%d bit %s%s key\n", (int)importKeySize , isANSIx963 ?"ANSI x9.63 ":"", isPrivate ?"private":"public");

    // delete keys
    if(ECC_ContextRefIsValid(ecc) ) ECC_Free(ecc );
    ecc = kInvalidECC_ContextRef;
    
    err = ECC_Init(&eccPub);
    err = ECC_Import_ANSI_X963( eccPub, pubKey, pubKeyLen);CKERR;
    
    importKeySize = 0;
    err =  ECC_KeySize(eccPub, &importKeySize);
    OPTESTLogVerbose("\t\tImported %d bit public key\n", (int)importKeySize  );
    
    err = ECC_Encrypt(eccPub, PT, sizeof(PT),  CT, sizeof(CT), &CTlen);CKERR;
    OPTESTLogVerbose("\t\tEncrypt message: (%ld bytes)\n", CTlen);
    dumpHex(IF_LOG_DEBUG, CT,  (int)CTlen, 0);
    
     err = ECC_Init(&ecc);
    err = ECC_Import(ecc, privKey, privKeyLen);CKERR;

    err =  ECC_KeySize(ecc, &importKeySize);
    OPTESTLogVerbose("\t\tImported %d bit private key\n", (int)importKeySize  );
    
    err = ECC_Decrypt(ecc, CT, CTlen,  DT, sizeof(DT), &DTlen); CKERR;
    
    /* check against know-answer */
    err= compareResults( DT, PT, PTsize , kResultFormat_Byte, "ECC Decrypt"); CKERR;
   OPTESTLogVerbose("\t\tDecrypted OK\n");
   dumpHex(IF_LOG_DEBUG, DT,  (int)DTlen, 0);
    
    err = ECC_Sign(ecc, PT, sizeof(PT),  CT, sizeof(CT), &CTlen);CKERR;
    OPTESTLogVerbose("\t\tSigned message (%ld bytes)\n", CTlen);
    dumpHex(IF_LOG_DEBUG, CT,  (int)CTlen, 0);
    
    err = ECC_Verify(ecc, CT, CTlen, PT, sizeof(PT));
    OPTESTLogVerbose("\t\tVerify = %s\n",  IsSCLError(err)?"fail":"pass");
    
    PT[3]= 9;
    err = ECC_Verify(ecc, CT, CTlen, PT, sizeof(PT));
    OPTESTLogVerbose("\t\tVerify bad packet = %s\n",  IsSCLError(err)?"fail":"pass");
    if(err == kSCLError_BadIntegrity) err = kSCLError_NoErr;
    
    OPTESTLogVerbose("\n");
done:
    
    if(ECC_ContextRefIsValid(ecc) ) ECC_Free(ecc );
    if(ECC_ContextRefIsValid(eccPub)) ECC_Free(eccPub);
    
    return err;
    
}
Exemple #5
0
SCLError sTestECC_DH(int keySize)
{
    
    SCLError     err = kSCLError_NoErr;
    
    uint8_t         pubKey1[256];
    size_t          pubKeyLen1 = 0;
    uint8_t         privKey1[256];
    size_t          privKeyLen1 = 0;

    uint8_t         pubKey2[256];
    size_t          pubKeyLen2 = 0;
    uint8_t         privKey2[256];
    size_t          privKeyLen2 = 0;
  
    
    ECC_ContextRef eccPriv = kInvalidECC_ContextRef;
    ECC_ContextRef eccPub  = kInvalidECC_ContextRef;
    
    uint8_t         Z1       [256];
    size_t          Zlen1;
    uint8_t         Z2       [256];
    size_t          Zlen2;
    
    
    OPTESTLogInfo("\tTesting ECC-DH (%d)\n",  keySize);
    
    /* create keys   */
    OPTESTLogDebug("\t\tGenerate Key 1\n");
    err = ECC_Init(&eccPriv); CKERR;
    err = ECC_Generate(eccPriv, keySize ); CKERR;
  
    err =  ECC_Export_ANSI_X963( eccPriv, pubKey1, sizeof(pubKey1), &pubKeyLen1);CKERR;
    err =  ECC_Export(eccPriv, true, privKey1, sizeof(privKey1), &privKeyLen1);CKERR;
    
    OPTESTLogDebug("\t\tKey 1 Pub/Priv  (%ld,%ld) bytes\n", pubKeyLen1, privKeyLen1);
    OPTESTLogDebug("\t\tPublic\n");
    dumpHex(IF_LOG_DEBUG, pubKey1,  (int)pubKeyLen1, 0);
    OPTESTLogDebug("\t\tPrivate\n");
    dumpHex(IF_LOG_DEBUG, privKey1,  (int)privKeyLen1, 0);
    OPTESTLogDebug("\n");
    
    if(ECC_ContextRefIsValid(eccPriv) ) ECC_Free(eccPriv );
    eccPriv = kInvalidECC_ContextRef;

    
    OPTESTLogDebug("\t\tGenerate Key 2\n");
    err = ECC_Init(&eccPriv); CKERR;
    err = ECC_Generate(eccPriv, keySize ); CKERR;
    
    err =  ECC_Export_ANSI_X963( eccPriv, pubKey2, sizeof(pubKey2), &pubKeyLen2);CKERR;
    err =  ECC_Export(eccPriv, true, privKey2, sizeof(privKey2), &privKeyLen2);CKERR;
    
    OPTESTLogDebug("\t\tKey 2 Pub/Priv  (%ld,%ld) bytes\n", pubKeyLen2, privKeyLen2);
    OPTESTLogDebug("\t\tPublic\n");
    dumpHex(IF_LOG_DEBUG, pubKey2,  (int)pubKeyLen2, 0);
    OPTESTLogDebug("\t\tPrivate\n");
    dumpHex(IF_LOG_DEBUG, privKey2,  (int)privKeyLen2, 0);
    OPTESTLogDebug("\n");
    
    // delete keys
   if(ECC_ContextRefIsValid(eccPriv) ) ECC_Free(eccPriv );
    eccPriv = kInvalidECC_ContextRef;
    
    OPTESTLogDebug("\t\tCalculate Secret for Key1 -> Key2\n");
    err = ECC_Init(&eccPriv);
    err = ECC_Import(eccPriv, privKey1, privKeyLen1);CKERR;
 
    err = ECC_Init(&eccPub);
    err = ECC_Import_ANSI_X963( eccPub, pubKey2, pubKeyLen2);CKERR;
    
    /* Kdk = MAC(Htotal,Z)    where Z is the DH of Pki and PKr */
    Zlen1 = sizeof(Z1);
     err = ECC_SharedSecret(eccPriv, eccPub, Z1, sizeof(Z1), &Zlen1);CKERR;

    OPTESTLogVerbose("\t\tECC Shared Secret (Z1):  (%ld bytes)\n",Zlen1);
    dumpHex(IF_LOG_DEBUG, Z1,  (int)Zlen1 , 0);
    OPTESTLogDebug("\n");

    
    // delete keys
    if(ECC_ContextRefIsValid(eccPriv) ) ECC_Free(eccPriv );
    eccPriv = kInvalidECC_ContextRef;
    // delete keys
    if(ECC_ContextRefIsValid(eccPub) ) ECC_Free(eccPub );
    eccPub = kInvalidECC_ContextRef;
    
    OPTESTLogDebug("\t\tCalculate Secret for Key2 -> Key1\n");
    err = ECC_Init(&eccPriv);
    err = ECC_Import(eccPriv, privKey2, privKeyLen2);CKERR;
    
    err = ECC_Init(&eccPub);
    err = ECC_Import_ANSI_X963( eccPub, pubKey1, pubKeyLen1);CKERR;
    
    /* Kdk = MAC(Htotal,Z)    where Z is the DH of Pki and PKr */
    Zlen2 = sizeof(Z2);
    err = ECC_SharedSecret(eccPriv, eccPub, Z2, sizeof(Z2), &Zlen2);CKERR;
    
    OPTESTLogVerbose("\t\tECC Shared Secret (Z2):  (%ld bytes)\n",Zlen2);
    dumpHex(IF_LOG_DEBUG, Z2,  (int)Zlen2 , 0);
    OPTESTLogDebug("\n");
    
    OPTESTLogVerbose("\t\tCompare Secrets\n");
   err = compare2Results(Z1, Zlen1, Z2, Zlen2, kResultFormat_Byte, "ECC Shared Secret");CKERR;
    
    
done:
    if(eccPriv)
    {
        ECC_Free(eccPriv);
        eccPriv = kInvalidECC_ContextRef;
    }
    
    if(eccPub)
    {
        ECC_Free(eccPub);
        eccPub = kInvalidECC_ContextRef;
    }
    
    
    return err;
    
}
Exemple #6
0
C4Err TestHash()
{
    C4Err err = kC4Err_NoErr;
    
    unsigned int i;
    int last_algor = -1;
    
    
    /* Test vectors, first line from each FIPS-180 SHA-1 known answer test */
    typedef struct  {
        int                 algor;
        char				*name;
        char				*msg;
        int					passes;
        uint8_t*               kat;
        size_t              kat_len;
    } katvector;
    
    katvector kat_vector_array[] =
    {
        
        {
            kHASH_Algorithm_SHA1,
            "Short",
            "abc",
            1,
            (uint8_t*)"\xA9\x99\x3E\x36\x47\x06\x81\x6A\xBA\x3E\x25\x71\x78\x50\xC2\x6C"
            "\x9C\xD0\xD8\x9D",
            20
        },
        {
            kHASH_Algorithm_SHA1,
            "Multi",
            "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
            1,
            (uint8_t*)"\x84\x98\x3E\x44\x1C\x3B\xD2\x6E\xBA\xAE\x4A\xA1\xF9\x51\x29\xE5"
            "\xE5\x46\x70\xF1",
            20
        },
        {
            kHASH_Algorithm_SHA1,
            "Long",
            "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
            15625,
            (uint8_t*)"\x34\xAA\x97\x3C\xD4\xC4\xDA\xA4\xF6\x1E\xEB\x2B\xDB\xAD\x27\x31"
            "\x65\x34\x01\x6F",
            20
        },
        
        {
            kHASH_Algorithm_SHA224,
            "Short",
            "abc",
            1,
            (uint8_t*)"\x23\x09\x7d\x22\x34\x05\xd8\x22\x86\x42\xa4\x77\xbd\xa2\x55\xb3"
            "\x2a\xad\xbc\xe4\xbd\xa0\xb3\xf7\xe3\x6c\x9d\xa7",
            28
        },
        
        {
            kHASH_Algorithm_SHA224,
            "Multi",
            "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
            1,
            (uint8_t*)"\x75\x38\x8b\x16\x51\x27\x76\xcc\x5d\xba\x5d\xa1\xfd\x89\x01\x50"
            "\xb0\xc6\x45\x5c\xb4\xf5\x8b\x19\x52\x52\x25\x25",
            28
        },
        {
            kHASH_Algorithm_SHA224,
            "Long",
            "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
            15625,
            (uint8_t*)"\x20\x79\x46\x55\x98\x0c\x91\xd8\xbb\xb4\xc1\xea\x97\x61\x8a\x4b"
            "\xf0\x3f\x42\x58\x19\x48\xb2\xee\x4e\xe7\xad\x67",
            28
        },
        
        {
            kHASH_Algorithm_SHA256,
            "Short",
            "abc",
            1,
            (uint8_t*)"\xBA\x78\x16\xBF\x8F\x01\xCF\xEA\x41\x41\x40\xDE\x5D\xAE\x22\x23"
            "\xB0\x03\x61\xA3\x96\x17\x7A\x9C\xB4\x10\xFF\x61\xF2\x00\x15\xAD",
            32
        },
        
        {
            kHASH_Algorithm_SHA256,
            "Multi",
            "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
            1,
            (uint8_t*)"\x24\x8D\x6A\x61\xD2\x06\x38\xB8\xE5\xC0\x26\x93\x0C\x3E\x60\x39"
            "\xA3\x3C\xE4\x59\x64\xFF\x21\x67\xF6\xEC\xED\xD4\x19\xDB\x06\xC1",
            32
        },
        {
            kHASH_Algorithm_SHA256,
            "Long",
            "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
            15625,
            (uint8_t*)"\xCD\xC7\x6E\x5C\x99\x14\xFB\x92\x81\xA1\xC7\xE2\x84\xD7\x3E\x67"
            "\xF1\x80\x9A\x48\xA4\x97\x20\x0E\x04\x6D\x39\xCC\xC7\x11\x2C\xD0",
            32
        },
        {
            kHASH_Algorithm_SHA384,
            "Short",
            "abc",
            1,
            (uint8_t*)"\xCB\x00\x75\x3F\x45\xA3\x5E\x8B\xB5\xA0\x3D\x69\x9A\xC6\x50\x07"
            "\x27\x2C\x32\xAB\x0E\xDE\xD1\x63\x1A\x8B\x60\x5A\x43\xFF\x5B\xED"
            "\x80\x86\x07\x2B\xA1\xE7\xCC\x23\x58\xBA\xEC\xA1\x34\xC8\x25\xA7",
            48
        },
        {
            kHASH_Algorithm_SHA384,
            "Multi",
            "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmn"
            "hijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu",
            1,
            (uint8_t*)"\x09\x33\x0C\x33\xF7\x11\x47\xE8\x3D\x19\x2F\xC7\x82\xCD\x1B\x47"
            "\x53\x11\x1B\x17\x3B\x3B\x05\xD2\x2F\xA0\x80\x86\xE3\xB0\xF7\x12"
            "\xFC\xC7\xC7\x1A\x55\x7E\x2D\xB9\x66\xC3\xE9\xFA\x91\x74\x60\x39",
            48
        },
        {
            kHASH_Algorithm_SHA384,
            "Long",
            "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
            15625,
            (uint8_t*)"\x9D\x0E\x18\x09\x71\x64\x74\xCB\x08\x6E\x83\x4E\x31\x0A\x4A\x1C"
            "\xED\x14\x9E\x9C\x00\xF2\x48\x52\x79\x72\xCE\xC5\x70\x4C\x2A\x5B"
            "\x07\xB8\xB3\xDC\x38\xEC\xC4\xEB\xAE\x97\xDD\xD8\x7F\x3D\x89\x85",
            48
        },
        {
            kHASH_Algorithm_SHA512,
            "Short",
            "abc",
            1,
            (uint8_t*)"\xDD\xAF\x35\xA1\x93\x61\x7A\xBA\xCC\x41\x73\x49\xAE\x20\x41\x31"
            "\x12\xE6\xFA\x4E\x89\xA9\x7E\xA2\x0A\x9E\xEE\xE6\x4B\x55\xD3\x9A"
            "\x21\x92\x99\x2A\x27\x4F\xC1\xA8\x36\xBA\x3C\x23\xA3\xFE\xEB\xBD"
            "\x45\x4D\x44\x23\x64\x3C\xE8\x0E\x2A\x9A\xC9\x4F\xA5\x4C\xA4\x9F",
            64
        },
        {
            kHASH_Algorithm_SHA512,
            "Multi",
            "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmn"
            "hijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu",
            1,
            (uint8_t*)"\x8E\x95\x9B\x75\xDA\xE3\x13\xDA\x8C\xF4\xF7\x28\x14\xFC\x14\x3F"
            "\x8F\x77\x79\xC6\xEB\x9F\x7F\xA1\x72\x99\xAE\xAD\xB6\x88\x90\x18"
            "\x50\x1D\x28\x9E\x49\x00\xF7\xE4\x33\x1B\x99\xDE\xC4\xB5\x43\x3A"
            "\xC7\xD3\x29\xEE\xB6\xDD\x26\x54\x5E\x96\xE5\x5B\x87\x4B\xE9\x09",
            64
            
        },
        {
            kHASH_Algorithm_SHA512,
            "Long",
            "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
            15625,
            (uint8_t*)"\xE7\x18\x48\x3D\x0C\xE7\x69\x64\x4E\x2E\x42\xC7\xBC\x15\xB4\x63"
            "\x8E\x1F\x98\xB1\x3B\x20\x44\x28\x56\x32\xA8\x03\xAF\xA9\x73\xEB"
            "\xDE\x0F\xF2\x44\x87\x7E\xA6\x0A\x4C\xB0\x43\x2C\xE5\x77\xC3\x1B"
            "\xEB\x00\x9C\x5C\x2C\x49\xAA\x2E\x4E\xAD\xB2\x17\xAD\x8C\xC0\x9B",
            64
            
        },
       
        {
            kHASH_Algorithm_SHA512_256,
            "Short",
            "abc",
            1,
            (uint8_t*)
            "\x53\x04\x8e\x26\x81\x94\x1e\xf9"
            "\x9b\x2e\x29\xb7\x6b\x4c\x7d\xab"
            "\xe4\xc2\xd0\xc6\x34\xfc\x6d\x46"
            "\xe0\xe2\xf1\x31\x07\xe7\xaf\x23",
            32
        },
        {
            kHASH_Algorithm_SHA512_256,
            "Multi",
            "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmn"
            "hijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu",
            1,
            (uint8_t*)
            "\x39\x28\xe1\x84\xfb\x86\x90\xf8"
            "\x40\xda\x39\x88\x12\x1d\x31\xbe"
            "\x65\xcb\x9d\x3e\xf8\x3e\xe6\x14"
            "\x6f\xea\xc8\x61\xe1\x9b\x56\x3a",
            32
        },
        
        {
            kHASH_Algorithm_SHA512_256,
            "Long",
            "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
            15625,
            (uint8_t*)
            "\x9A\x59\xA0\x52\x93\x01\x87\xA9\x70\x38\xCA\xE6\x92\xF3\x07\x08"
            "\xAA\x64\x91\x92\x3E\xF5\x19\x43\x94\xDC\x68\xD5\x6C\x74\xFB\x21",
            32
            
        },
        
        {
            kHASH_Algorithm_SKEIN256,
            "Short",
            (char*)
            "\xFF\xFE\xFD\xFC\xFB\xFA\xF9\xF8\xF7\xF6\xF5\xF4\xF3\xF2\xF1\xF0"
            "\xEF\xEE\xED\xEC\xEB\xEA\xE9\xE8\xE7\xE6\xE5\xE4\xE3\xE2\xE1\xE0",
            1,
            (uint8_t*)
            "\x8D\x0F\xA4\xEF\x77\x7F\xD7\x59\xDF\xD4\x04\x4E\x6F\x6A\x5A\xC3"
            "\xC7\x74\xAE\xC9\x43\xDC\xFC\x07\x92\x7B\x72\x3B\x5D\xBF\x40\x8B",
            32
        },
        
        {
            kHASH_Algorithm_SKEIN256,
            "Multi",
            "\xFF\xFE\xFD\xFC\xFB\xFA\xF9\xF8\xF7\xF6\xF5\xF4\xF3\xF2\xF1\xF0"
            "\xEF\xEE\xED\xEC\xEB\xEA\xE9\xE8\xE7\xE6\xE5\xE4\xE3\xE2\xE1\xE0"
            "\xDF\xDE\xDD\xDC\xDB\xDA\xD9\xD8\xD7\xD6\xD5\xD4\xD3\xD2\xD1\xD0"
            "\xCF\xCE\xCD\xCC\xCB\xCA\xC9\xC8\xC7\xC6\xC5\xC4\xC3\xC2\xC1\xC0"
            "\xBF\xBE\xBD\xBC\xBB\xBA\xB9\xB8\xB7\xB6\xB5\xB4\xB3\xB2\xB1\xB0"
            "\xAF\xAE\xAD\xAC\xAB\xAA\xA9\xA8\xA7\xA6\xA5\xA4\xA3\xA2\xA1\xA0"
            "\x9F\x9E\x9D\x9C\x9B\x9A\x99\x98\x97\x96\x95\x94\x93\x92\x91\x90"
            "\x8F\x8E\x8D\x8C\x8B\x8A\x89\x88\x87\x86\x85\x84\x83\x82\x81\x80",
            1,
            (uint8_t*)
            "\x18\x0D\xE1\x06\xA7\x04\x01\xBA\x38\xF2\x59\x7C\x25\xCB\xEF\xC7"
            "\x36\xDF\xD8\x8D\x90\xF2\xD3\x35\x2E\x0E\xB2\x55\xAF\xB6\xDB\x63",
            32
        },
        
        {
            kHASH_Algorithm_SKEIN256,
            "Long",
            "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
            15625,
            (uint8_t*)
            "\x57\x0C\x70\x90\x1E\x31\x99\x4C\x1F\x7B\x96\x0F\x3F\xBD\xCF\x8D"
            "\xB0\x03\xE5\x33\x39\x6D\x48\x38\x9F\x46\xD3\x7C\x3E\xD1\x47\x38",
            32
        },
        {
            kHASH_Algorithm_SKEIN512,
            "Short",
            (char*)
            "\xFF\xFE\xFD\xFC\xFB\xFA\xF9\xF8\xF7\xF6\xF5\xF4\xF3\xF2\xF1\xF0"
            "\xEF\xEE\xED\xEC\xEB\xEA\xE9\xE8\xE7\xE6\xE5\xE4\xE3\xE2\xE1\xE0",
            1,
            (uint8_t*)
            "\x0B\x7F\xD0\x53\xAE\x63\x5E\xE8\xE5\x19\x64\x6E\xB4\x1E\xA0\xCF"
            "\x7E\xA3\x40\x15\x23\x78\x06\x2F\xB2\x44\x0A\xA0\x25\x0F\xF1\x95"
            "\xFE\x32\xD9\xA0\x69\x1E\x68\xA0\xFE\xB1\x7D\xC2\x85\xAA\x67\x56"
            "\xCE\xF1\x94\x04\xE4\xDB\x92\xBF\x83\x6C\x4A\xE6\x53\x81\x50\x4A",
            64
        },
        {
            kHASH_Algorithm_SKEIN512,
            "Multi",
            "\xFF\xFE\xFD\xFC\xFB\xFA\xF9\xF8\xF7\xF6\xF5\xF4\xF3\xF2\xF1\xF0"
            "\xEF\xEE\xED\xEC\xEB\xEA\xE9\xE8\xE7\xE6\xE5\xE4\xE3\xE2\xE1\xE0"
            "\xDF\xDE\xDD\xDC\xDB\xDA\xD9\xD8\xD7\xD6\xD5\xD4\xD3\xD2\xD1\xD0"
            "\xCF\xCE\xCD\xCC\xCB\xCA\xC9\xC8\xC7\xC6\xC5\xC4\xC3\xC2\xC1\xC0"
            "\xBF\xBE\xBD\xBC\xBB\xBA\xB9\xB8\xB7\xB6\xB5\xB4\xB3\xB2\xB1\xB0"
            "\xAF\xAE\xAD\xAC\xAB\xAA\xA9\xA8\xA7\xA6\xA5\xA4\xA3\xA2\xA1\xA0"
            "\x9F\x9E\x9D\x9C\x9B\x9A\x99\x98\x97\x96\x95\x94\x93\x92\x91\x90"
            "\x8F\x8E\x8D\x8C\x8B\x8A\x89\x88\x87\x86\x85\x84\x83\x82\x81\x80",
            1,
            (uint8_t*)
            "\x91\xCC\xA5\x10\xC2\x63\xC4\xDD\xD0\x10\x53\x0A\x33\x07\x33\x09"
            "\x62\x86\x31\xF3\x08\x74\x7E\x1B\xCB\xAA\x90\xE4\x51\xCA\xB9\x2E"
            "\x51\x88\x08\x7A\xF4\x18\x87\x73\xA3\x32\x30\x3E\x66\x67\xA7\xA2"
            "\x10\x85\x6F\x74\x21\x39\x00\x00\x71\xF4\x8E\x8B\xA2\xA5\xAD\xB7",
            64
        },
        {
            kHASH_Algorithm_SKEIN512,
            "Long",
            "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
            15625,
            (uint8_t*)
            "\xC9\xD4\x1B\x77\xB7\x7B\x77\xE9\x54\x28\x41\x85\xAF\x68\x2A\x5A"
            "\x8B\x25\xB9\xD3\x1E\x6D\x58\xEB\x9F\xD3\x29\xF5\xBC\xCA\x34\xD7"
            "\xB2\x85\xAB\x13\x0A\x9C\x14\xC8\x72\x19\x2B\xCD\xF2\xB6\x7D\x88"
            "\x32\x80\xA7\x54\xAC\xBA\x94\x2A\x7C\xF4\x48\xE8\x41\xA7\x4E\xD2",
            64
        },
        {
            kHASH_Algorithm_SKEIN1024,
            "Short",
            (char*)
            "\xFF\xFE\xFD\xFC\xFB\xFA\xF9\xF8\xF7\xF6\xF5\xF4\xF3\xF2\xF1\xF0"
            "\xEF\xEE\xED\xEC\xEB\xEA\xE9\xE8\xE7\xE6\xE5\xE4\xE3\xE2\xE1\xE0",
            1,
            (uint8_t*)
            "\xD9\xF3\x81\xEA\xAD\xA5\x7D\x8F\x40\x7A\x01\xD8\x76\xE6\xB3\xC2"
            "\x09\x34\x18\xA4\x86\x04\x5F\x7C\xE2\x3A\x90\x15\x0D\x93\x16\x01"
            "\x3B\xB5\x4E\x56\x38\xB3\x72\xE3\x75\x59\x72\x89\xCF\x74\x50\xEB"
            "\x47\x89\xB5\x55\x3E\x2B\x29\x47\xD2\xAA\x81\x09\x7F\x4A\x8E\x84"
            "\xD3\x9E\x0F\xCA\x2F\x30\xB5\xEE\x7A\x8E\xD7\x3C\x31\xF7\x8B\x58"
            "\x04\xB6\xEF\x79\xF5\x7F\xE4\x43\xAF\xBA\x11\x51\xCC\x48\xE0\x19"
            "\x1A\xC6\x25\xE9\xD5\xF7\x2B\x84\x3D\x77\x10\xB2\x9E\x7F\x98\x9D"
            "\x8D\x3F\xC2\x1B\xBA\x49\xD4\x6B\x9F\x75\xA0\x7B\x22\x08\x67\x3C",
            128
        },
        {
            kHASH_Algorithm_SKEIN1024,
            "Multi",
            "\xFF\xFE\xFD\xFC\xFB\xFA\xF9\xF8\xF7\xF6\xF5\xF4\xF3\xF2\xF1\xF0"
            "\xEF\xEE\xED\xEC\xEB\xEA\xE9\xE8\xE7\xE6\xE5\xE4\xE3\xE2\xE1\xE0"
            "\xDF\xDE\xDD\xDC\xDB\xDA\xD9\xD8\xD7\xD6\xD5\xD4\xD3\xD2\xD1\xD0"
            "\xCF\xCE\xCD\xCC\xCB\xCA\xC9\xC8\xC7\xC6\xC5\xC4\xC3\xC2\xC1\xC0"
            "\xBF\xBE\xBD\xBC\xBB\xBA\xB9\xB8\xB7\xB6\xB5\xB4\xB3\xB2\xB1\xB0"
            "\xAF\xAE\xAD\xAC\xAB\xAA\xA9\xA8\xA7\xA6\xA5\xA4\xA3\xA2\xA1\xA0"
            "\x9F\x9E\x9D\x9C\x9B\x9A\x99\x98\x97\x96\x95\x94\x93\x92\x91\x90"
            "\x8F\x8E\x8D\x8C\x8B\x8A\x89\x88\x87\x86\x85\x84\x83\x82\x81\x80",
            1,
            (uint8_t*)
            "\x1F\x3E\x02\xC4\x6F\xB8\x0A\x3F\xCD\x2D\xFB\xBC\x7C\x17\x38\x00"
            "\xB4\x0C\x60\xC2\x35\x4A\xF5\x51\x18\x9E\xBF\x43\x3C\x3D\x85\xF9"
            "\xFF\x18\x03\xE6\xD9\x20\x49\x31\x79\xED\x7A\xE7\xFC\xE6\x9C\x35"
            "\x81\xA5\xA2\xF8\x2D\x3E\x0C\x7A\x29\x55\x74\xD0\xCD\x7D\x21\x7C"
            "\x48\x4D\x2F\x63\x13\xD5\x9A\x77\x18\xEA\xD0\x7D\x07\x29\xC2\x48"
            "\x51\xD7\xE7\xD2\x49\x1B\x90\x2D\x48\x91\x94\xE6\xB7\xD3\x69\xDB"
            "\x0A\xB7\xAA\x10\x6F\x0E\xE0\xA3\x9A\x42\xEF\xC5\x4F\x18\xD9\x37"
            "\x76\x08\x09\x85\xF9\x07\x57\x4F\x99\x5E\xC6\xA3\x71\x53\xA5\x78",
            128
        },
        {
            kHASH_Algorithm_SKEIN1024,
            "Long",
            "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
            15625,
            (uint8_t*)
            "\x6C\xB2\x95\x4A\xED\xDE\xDC\x50\x67\x00\x8D\xB1\x94\x53\x33\xBD"
            "\x9C\xFE\x9E\x46\xC1\x07\x57\x23\xCB\x57\xC5\x6C\x1C\xC3\x76\xA8"
            "\xCE\x4D\xA1\x95\xF4\x2E\x01\xBC\x00\x98\xB4\x81\x7A\xB6\x86\xB9"
            "\x81\xC9\x37\xE0\x53\x7E\x11\xED\xDF\x62\xF0\x44\x22\xAE\x6F\x1E"
            "\xDA\x87\xEF\x09\x29\x9D\x87\x85\x2F\xAF\x89\xB6\xCA\xE3\xD3\x6E"
            "\x63\x91\x40\x69\x80\x6F\x82\x3B\xBC\xE4\x36\xB3\xC5\xF4\xAB\x6C"
            "\x8A\xA6\x93\x16\x46\x7C\x59\xA1\xCB\xDB\xC3\x5D\xD9\x74\x40\x32"
            "\x3C\x4C\x70\xEF\x17\xFB\x1B\xFC\xFC\x4E\xF6\xE3\xE1\xD7\xA2\x60",
            128
        },
        
        
    };
    
    OPTESTLogInfo("\nTesting Secure Hash Algorithms:\n");
    
     /* run test array */
    for (i = 0; i < sizeof(kat_vector_array)/ sizeof(katvector) ; i++)
    {
        katvector* kat = &kat_vector_array[i];
        unsigned long length = strlen( (const char *) kat->msg) *  kat->passes ;
        
        if(last_algor != kat->algor)
        {
            OPTESTLogInfo("%s\t%10s\t",
                          (last_algor != -1 ?"\n":""),
                          hash_algor_table(kat->algor));
            last_algor = kat->algor;
        }

        OPTESTLogInfo("%6lu%s",  length > 999?length/1000:length, length > 999?"K":"");
        
        err = TestHashKAT(kat_vector_array[i].algor,
                          kat_vector_array[i].name,
                          (uint8_t*) kat_vector_array[i].msg,
                          strlen( (const char *) kat_vector_array[i].msg), 
                          kat_vector_array[i].passes,
                          kat_vector_array[i].kat,
                          kat_vector_array[i].kat_len);  CKERR;
    }
    
    OPTESTLogInfo("\n\n");
    
done:
    
    return( err );
}
static SCLError scSaveRestoreKeyTest(SCKeySuite storageKeySuite, SCKeySuite eccKeySuite )
{
    SCLError        err = kSCLError_NoErr;
  
    SCKeyContextRef sKey = kInvalidSCKeyContextRef;         // storage key
    SCKeyContextRef signKey = kInvalidSCKeyContextRef;
    SCKeyContextRef     pKey = kInvalidSCKeyContextRef;     // pbdkf2 encrypted storage key

    Cipher_Algorithm    algorithm = kCipher_Algorithm_Invalid;
    size_t              symKeyLen = 0;
    
    time_t          startDate  = time(NULL) ;
    time_t          expireDate  = startDate + (3600 * 24);
    char*           user1 = "*****@*****.**";
 
    uint8_t*        keyData = NULL;
    size_t          keyDataLen = 0;
    
    uint8_t*        sKeyData = NULL;
    size_t          sKeyDataLen = 0;
    bool            isLocked = true;
    
    char*           passPhrase = "Pedicabo ego vos et irrumabo";
    
    
    // used for comparison test
    ECC_ContextRef  ecc  =  kInvalidECC_ContextRef;
    ECC_ContextRef  ecc1  =  kInvalidECC_ContextRef;
    
    OPTESTLogInfo("\tTesting SCKeys %s Save/Restore using %s\n", sckey_suite_table(eccKeySuite),  sckey_suite_table(storageKeySuite));
    
    // setup a storage key for the private SCC key  */
    
    // we do this code just one time and export the encrypted passphrase for later use.
    char*           nonce = "some stupid nonce data";
    uint8_t IV[32];
    err = SCKeyCipherForKeySuite(storageKeySuite, &algorithm, &symKeyLen);  CKERR;
    err = RNG_GetBytes(IV,symKeyLen); CKERR;
    err = SCKeyNew(storageKeySuite, (uint8_t*)nonce, strlen(nonce), &sKey); CKERR;
    err = SCKeySetProperty (sKey, kSCKeyProp_IV, SCKeyPropertyType_Binary,  IV   , symKeyLen ); CKERR;
    err = SCKeyEncryptToPassPhrase(sKey, (const uint8_t*)passPhrase, strlen(passPhrase), &pKey); CKERR;
    err = SCKeySerialize(pKey, &sKeyData, &sKeyDataLen); CKERR;
    OPTESTLogVerbose("\t\tExport storage key (%d bytes)\n", (int)sKeyDataLen );
    OPTESTLogDebug("\t\tEncrypted Storage Key Packet: (%ld bytes)\n%s\n",sKeyDataLen, (char*)sKeyData);
    SCKeyFree(pKey); pKey = NULL;
    
       /* create a signing key for things like voicemail, etc */
    err = SCKeyNew(eccKeySuite, (uint8_t*)nonce, strlen(nonce),  &signKey); CKERR;
    err = SCKeySetProperty (signKey, kSCKeyProp_Owner, SCKeyPropertyType_UTF8String, user1 , strlen(user1) ); CKERR;
    err = SCKeySetProperty(signKey, kSCKeyProp_StartDate,  SCKeyPropertyType_Time ,  &startDate, sizeof(time_t)); CKERR;
    err = SCKeySetProperty(signKey, kSCKeyProp_ExpireDate,  SCKeyPropertyType_Time ,  &expireDate, sizeof(time_t)); CKERR;
  
    // used for testing
    err = SCKeyExport_ECC(signKey, &ecc); CKERR;
 
    /* save the private ecc key */
    err = SCKeySerializePrivateWithSCKey(signKey, sKey, &keyData, &keyDataLen); CKERR;
    OPTESTLogVerbose("\t\tExport ECC key (%d bytes)\n", (int)keyDataLen );
    OPTESTLogDebug("\t\tPrivate Key Packet: (%ld bytes)\n%s\n",keyDataLen, (char*)keyData);
    
    SCKeyFree(sKey);    sKey = NULL;
    SCKeyFree(signKey); signKey = NULL;
 
    // pretend we readin  keyData  and sKeyData from some device..
    
    OPTESTLogVerbose("\t\tReconstitute the storage key \n" );
   // reconstitute the storage key
    err = SCKeyDeserialize(sKeyData,  strlen((char*) sKeyData) , &pKey); CKERR;
    err = SCKeyDecryptFromPassPhrase(pKey, (const uint8_t*)passPhrase, strlen(passPhrase), &sKey); CKERR;
    
   // resconstitute the ECC key
    OPTESTLogVerbose("\t\tReconstitute the ECC key \n" );
    err = SCKeyDeserialize(keyData,  strlen((char*) keyData) , &signKey); CKERR;
 
    OPTESTLogVerbose("\t\tUnlock Private Key Packet \n" );
    err = SCKeyUnlockWithSCKey(signKey, sKey); CKERR;
    err = SCKeyIsLocked(signKey,&isLocked); CKERR;
    ASSERTERR(isLocked, kSCLError_SelfTestFailed);
    
    OPTESTLogVerbose("\t\tConsistency check of reimported key \n" );
    
    {
        uint8_t         pk[128];
        size_t          pkLen = sizeof (pk);
   
        uint8_t         pk1[128];
        size_t          pk1Len = sizeof (pk1);

        uint8_t         privKey[256];
        size_t          privKeyLen = sizeof (privKey);
        
        uint8_t         privKey1[256];
        size_t          privKey1Len = sizeof (privKey1);

        err = SCKeyExport_ECC(signKey, &ecc1); CKERR;
        
        err = ECC_Export_ANSI_X963(ecc , pk, pkLen, &pkLen);
        err = ECC_Export_ANSI_X963(ecc1 , pk1, pk1Len, &pk1Len);
        err = compare2Results(pk, pkLen, pk1, pk1Len, kResultFormat_Byte, "ECC public Key");
  
        err =  ECC_Export(ecc, true, privKey, sizeof(privKey), &privKeyLen);CKERR;
        err =  ECC_Export(ecc1, true, privKey1, sizeof(privKey1), &privKey1Len);CKERR;
        err = compare2Results(privKey, privKeyLen, privKey1, privKey1Len, kResultFormat_Byte, "ECC private Key");
     }
    
   done:
    
    OPTESTLogDebug("\n" );
    
    
    if(ECC_ContextRefIsValid(ecc))
        ECC_Free(ecc);
    
    if(ECC_ContextRefIsValid(ecc1))
        ECC_Free(ecc1);
    
    if(SCKeyContextRefIsValid(pKey))
        SCKeyFree(pKey);
    

    if(SCKeyContextRefIsValid(pKey))
        SCKeyFree(pKey);
   
    
    if(SCKeyContextRefIsValid(signKey))
        SCKeyFree(signKey);

    if(SCKeyContextRefIsValid(sKey))
        SCKeyFree(sKey);
    

    return err;
}
static SCLError sSCKeyTest4(SCKeySuite keySuite)
{
    SCLError        err = kSCLError_NoErr;
    SCKeyContextRef key1 = kInvalidSCKeyContextRef;
    char*           nonce = "some stupid nonce data";
    char*           user1 = "*****@*****.**";
    
    uint8_t*        fingerPrintData = NULL;
    size_t          fingerPrintDataSize = 0;
    
    uint8_t*        locator = NULL;
    uint8_t*        fp = NULL;
 
    uint8_t*        ownerData = NULL;
    size_t          ownerDataSize = 0;

    uint8_t*        hashWords = NULL;
    size_t          hashWordsSize = 0;

    OPTESTLogInfo("\tTesting %s Key Fingerprint APIs \n", sckey_suite_table(keySuite));
    
    err = SCKeyNew(keySuite, (uint8_t*)nonce, strlen(nonce),  &key1); CKERR;
    err = SCKeySetProperty (key1, kSCKeyProp_Owner, SCKeyPropertyType_UTF8String, user1 , strlen(user1) ); CKERR;
   
    err = SCKeySerialize_Fingerprint(key1, &fingerPrintData, &fingerPrintDataSize); CKERR;
    
    OPTESTLogDebug("\n\t%3d bytes\n", (int)fingerPrintDataSize);
     dumpHex(IF_LOG_DEBUG, fingerPrintData, (int)fingerPrintDataSize, 0);
    OPTESTLogDebug("\n");
    
    err =  SCKeyDeserialize_Fingerprint( fingerPrintData, fingerPrintDataSize, &locator, &fp,
                                        &ownerData, &ownerDataSize,
                                        &hashWords, &hashWordsSize);
    
    OPTESTLogDebug("\t%10s: %s\n\t%10s: %s\n\t%10s: %s\n\t%10s: %s\n",
                   "Locator",locator,
                   "Hash",fp,
                   "Hash Words", hashWords,
                   "Owner", ownerData? (char*)ownerData:"<none>");
 
   // test key fingerprint reassembly
    err = SCKeyVerify_Fingerprint(key1, fingerPrintData, fingerPrintDataSize); CKERR;
    
    OPTESTLogVerbose("\n");
    
    SCKeyFree(key1);   key1 = NULL;
    
done:
    if(SCKeyContextRefIsValid(key1))
        SCKeyFree(key1);
    
    if(hashWords)
        XFREE(hashWords);

    if(ownerData)
        XFREE(ownerData);
    
    if(fp)
      XFREE(fp);
  
    if(locator)
        XFREE(locator);
    
      return err;
    
}
static SCLError sSCKeyTest3(SCKeySuite keySuite)
{
    SCLError        err = kSCLError_NoErr;
    SCKeyContextRef key1 = kInvalidSCKeyContextRef;
    char*           nonce = "some stupid nonce data";
 
//    Cipher_Algorithm    algorithm = kCipher_Algorithm_Invalid;
//    size_t              symKeyLen = 0;
  
#define PTsize 32
    uint8_t        PT[PTsize];
    
    uint8_t        CT[256];
    size_t         CTlen = 0;
    
    uint8_t        DT[PTsize];
    size_t         DTlen = 0;
 
    uint8_t*    sigData = NULL;
    size_t      sigDataLen = 0;
//    uint8_t*    keyData = NULL;
//    size_t      keyDataLen = 0;

//    time_t      startDate  = time(NULL) ;
//    time_t      expireDate  = startDate + (3600 * 24);

    // fixed PT key test
    for(int i = 0; i< PTsize; i++) PT[i] = i;
    
    OPTESTLogInfo("\tTesting %s Signing and Encryption Consistency \n", sckey_suite_table(keySuite));

//    err = SCKeyCipherForKeySuite(keySuite, &algorithm, NULL);  CKERR;
//    OPTESTLogVerbose("\t\tCreate %s encyption key\n",cipher_algor_table(algorithm));

    err = SCKeyNew(keySuite, (uint8_t*)nonce, strlen(nonce),  &key1); CKERR;
    
    OPTESTLogVerbose("\t\tPublic Key Encrypt %d byte key \n", sizeof(PT));
    err = SCKeyPublicEncrypt(key1, PT, sizeof(PT),  CT, sizeof(CT), &CTlen);CKERR;
    dumpHex(IF_LOG_DEBUG, CT, (int)CTlen, 0);
    
    OPTESTLogVerbose("\t\tTest Decryption \n");
   err = SCKeyPublicDecrypt(key1, CT, CTlen,  DT, sizeof(DT), &DTlen); CKERR;
    err = compareResults( DT, PT, PTsize , kResultFormat_Byte, "ECC Decrypt"); CKERR;
    
    err = SCKeySignHash(key1, PT,sizeof(PT),CT, sizeof(CT), &CTlen); CKERR;
    OPTESTLogVerbose("\t\tPublic Key Sign - low level (%ld bytes) \n", CTlen);
    dumpHex(IF_LOG_DEBUG, CT, (int)CTlen, 0);
    
    err = SCKeySign(key1,PT,sizeof(PT), &sigData, &sigDataLen); CKERR;
    OPTESTLogVerbose("\t\tPublic Key Sign - JSON  (%ld bytes) \n",sigDataLen);
    OPTESTLogDebug("%s",sigData );
  
    OPTESTLogVerbose("\t\tTest Signature Verification\n");
    err = SCKeyVerifyHash(key1,  PT,sizeof(PT), CT, CTlen);  CKERR;
    err = SCKeyVerify(key1, PT,sizeof(PT), sigData, sigDataLen); CKERR;
    // force sig fail
    PT[3] ^=1;
    ASSERTERR(SCKeyVerifyHash(key1,  PT,sizeof(PT), CT, CTlen) != kSCLError_BadIntegrity, kSCLError_SelfTestFailed );
    ASSERTERR(SCKeyVerify(key1, PT,sizeof(PT), sigData, sigDataLen) != kSCLError_BadIntegrity, kSCLError_SelfTestFailed );
    
    
#if 0  
    {
    // get pub key
        SCKeyContextRef iKey = kInvalidSCKeyContextRef;
        err = SCKeyGetAllocatedProperty(key1, kSCKeyProp_PubKeyANSI_X963, NULL,  (void*)&keyData ,  &keyDataLen); CKERR;
    
    // make commit code
        err = SCKeyMakeHMACcode(keySuite, keyData, keyDataLen, PT, PTsize, expireDate,  key1, &iKey); CKERR;
     
        XFREE(keyData); keyData = NULL;
        
        err = SCKeySerialize(iKey, &keyData, &keyDataLen); CKERR;
        printf("HMAC_code: (%ld bytes)\n%s\n",keyDataLen, (char*)keyData);
        SCKeyFree(iKey); iKey = NULL;
        err = SCKeyDeserialize(keyData,  keyDataLen, &iKey);CKERR;
        XFREE(keyData); keyData = NULL;
        

    }
#endif

   OPTESTLogVerbose("\n");

    SCKeyFree(key1);   key1 = NULL;
    
done:
    if(SCKeyContextRefIsValid(key1))
        SCKeyFree(key1);
    
    if(sigData)
        XFREE(sigData);
//    
//    if(keyData)
//        XFREE(keyData);
   
    return err;
    
}
Exemple #10
0
static SCLError sSCKeyTest1(SCKeySuite keySuite)
{
    SCLError        err = kSCLError_NoErr;
    SCKeyContextRef key = kInvalidSCKeyContextRef;
    SCKeyContextRef key1 = kInvalidSCKeyContextRef;
 
    
    uint8_t     symKey[32];
    uint8_t     symKey1[32];
    uint8_t*    keyData = NULL;
    size_t      keyDataLen = 0;
    uint8_t*    keyData1 = NULL;
    size_t      keyDataLen1 = 0;
    char        comment[256] = {0};
    char        comment1[256] = {0};
 
    char*       nonce = "some stupid nonce data";
    time_t      startDate  = time(NULL) ;
    time_t      expireDate  = startDate + (3600 * 24);
    
    char*       commentProperty = "comment";
    
    SCKeySuite          keyType1 =  kSCKeySuite_Invalid ;
    SCKeyPropertyType propType = SCKeyPropertyType_Invalid;
    
    // fixed SYM key test
    for(int i = 0; i< 32; i++) symKey[i] = i;

    sprintf(comment,"Optest %s Symmetric Key", sckey_suite_table(keySuite));
                 
    OPTESTLogInfo("\tTesting Symmetric Key Save/Restore (%s)\n", sckey_suite_table(keySuite));
    
    // create a SCKey with sym data and add some properties
    err = SCKeyImport_Symmetric(keySuite, symKey, (uint8_t*)nonce, strlen(nonce), &key);
 
    err = SCKeySetProperty (key, commentProperty, SCKeyPropertyType_UTF8String, comment, strlen(comment) ); CKERR;
    err = SCKeySetProperty(key, kSCKeyProp_StartDate,  SCKeyPropertyType_Time ,  &startDate, sizeof(time_t)); CKERR;
    err = SCKeySetProperty(key, kSCKeyProp_ExpireDate,  SCKeyPropertyType_Time ,  &expireDate, sizeof(time_t)); CKERR;
    
    // serialize it
    err = SCKeySerialize(key, &keyData, &keyDataLen); CKERR;
   
    OPTESTLogDebug("\t\tKey Packet: (%ld bytes)\n%s\n",keyDataLen, (char*)keyData);
 
    // deserialize it
    err = SCKeyDeserialize(keyData,  keyDataLen, &key1);CKERR;
    XFREE(keyData); keyData = NULL;
    
    err = SCKeyGetProperty(key1, kSCKeyProp_SCKeySuite,   NULL,  &keyType1, sizeof(SCKeySuite),  NULL); CKERR;
    err = compareResults(&keySuite, &keyType1, sizeof(SCKeySuite), kResultFormat_Byte, "keySuite");CKERR;
    
    err = SCKeyGetProperty(key1, kSCKeyProp_SymmetricKey, NULL, &symKey1 , sizeof(symKey1), &keyDataLen); CKERR;
    err = compareResults(symKey, symKey1, keyDataLen, kResultFormat_Byte, "symKey");CKERR;
    
    XFREE(keyData); keyData = NULL;
    
    err = SCKeyGetAllocatedProperty(key, kSCKeyProp_Locator, NULL,  (void*)&keyData ,  &keyDataLen); CKERR;
    err = SCKeyGetAllocatedProperty(key1, kSCKeyProp_Locator, &propType,  (void*)&keyData1 ,  &keyDataLen1); CKERR;
    err = compareResults(keyData, keyData1, keyDataLen, kResultFormat_Byte, "locator");CKERR;

    err = SCKeyGetProperty(key1, commentProperty, &propType,  comment1 , sizeof(comment1),  &keyDataLen1); CKERR;
    err = compare2Results(comment, strlen(comment), comment1, keyDataLen1, kResultFormat_Byte, "comment");CKERR;

    if(keyData) XFREE(keyData);
    if(keyData1) XFREE(keyData1);
    if(key) SCKeyFree(key);
    if(key1) SCKeyFree(key1);
    
    
done:
    
    return err;

}
Exemple #11
0
static SCLError sSCKeyTest2(SCKeySuite keySuite, SCKeySuite lockingKeySuite)
{
    SCLError        err = kSCLError_NoErr;
    SCKeyContextRef sKey = kInvalidSCKeyContextRef;
    SCKeyContextRef key1 = kInvalidSCKeyContextRef;
    SCKeyContextRef key2 = kInvalidSCKeyContextRef;
    SCKeyContextRef signKey = kInvalidSCKeyContextRef;
    ECC_ContextRef  ecc = kInvalidECC_ContextRef;
    SCKeySuite      keyType;
    SCKeySuite      keyType1;
    SCKeyPropertyType propType;
    
    Cipher_Algorithm    algorithm = kCipher_Algorithm_Invalid;
    size_t              symKeyLen = 0;
    
    uint8_t*        keyData = NULL;
    size_t          keyDataLen = 0;
    uint8_t*        keyData1 = NULL;
    size_t          keyDataLen1 = 0;
    size_t          ecckeysize = 0;
    uint8_t         symKey[32];
    uint8_t         IV[32];
    
    char*           user1 = "*****@*****.**";
    char*           user2 = "*****@*****.**";
    
    char            comment[256] = {0};
    char*           nonce = "some stupid nonce data";
    time_t          startDate  = time(NULL) ;
    time_t          expireDate  = startDate + (3600 * 24);
    time_t          date1;
    char*           commentProperty = "comment";
    bool            isLocked = true;
   
    sprintf(comment,"Optest %s ECC Key", sckey_suite_table(keySuite));
    OPTESTLogInfo("\tTesting %s Key Save/Restore using %s\n",
                  sckey_suite_table(keySuite),sckey_suite_table(lockingKeySuite));
   
    switch (keySuite) {
        case kSCKeySuite_ECC384:
            ecckeysize = 384;
            break;
            
        case kSCKeySuite_ECC414:
            ecckeysize = 414;
            break;
            
        default:
            RETERR(kSCLError_BadParams);
            break;
    }
    
    // fixed SYM key test
    for(int i = 0; i< sizeof(symKey); i++) symKey[i] = i;
    for(int i = 0; i< sizeof(IV); i++) IV[i] = i;

    // create a SCKey with sym data
    err = SCKeyImport_Symmetric(lockingKeySuite, symKey, (uint8_t*)nonce, strlen(nonce), &sKey); CKERR;
    err = SCKeyCipherForKeySuite(lockingKeySuite, &algorithm, &symKeyLen);  CKERR;
    err = SCKeySetProperty (sKey, kSCKeyProp_IV, SCKeyPropertyType_Binary,  IV, symKeyLen ); CKERR;
  
    OPTESTLogVerbose("\t\tGenerate %d bit ECC key \n", ecckeysize);
    err = ECC_Init(&ecc);
    err = ECC_Generate(ecc, ecckeysize); CKERR;
    
    OPTESTLogVerbose("\t\tImport %d bit ECC key to SCKEy \n", ecckeysize);
    err = SCKeyImport_ECC( ecc, (uint8_t*)nonce, strlen(nonce),  &key1); CKERR;
    ECC_Free(ecc );
    ecc = kInvalidECC_ContextRef;
 
    err = SCKeySetProperty (key1, commentProperty, SCKeyPropertyType_UTF8String, comment, strlen(comment) ); CKERR;
    err = SCKeySetProperty(key1, kSCKeyProp_StartDate,  SCKeyPropertyType_Time ,  &startDate, sizeof(time_t)); CKERR;
    err = SCKeySetProperty(key1, kSCKeyProp_ExpireDate,  SCKeyPropertyType_Time ,  &expireDate, sizeof(time_t)); CKERR;
    err = SCKeySetProperty (key1, kSCKeyProp_Owner, SCKeyPropertyType_UTF8String, user1, strlen(user1) ); CKERR;
  
    // create a signing key to sign test wkey with
    err = SCKeyNew(keySuite, (uint8_t*)nonce, strlen(nonce),  &signKey); CKERR;
    err = SCKeySetProperty (signKey, kSCKeyProp_Owner, SCKeyPropertyType_UTF8String, user2 , strlen(user2) ); CKERR;
    err = SCKeySignKey( signKey, key1,NULL); CKERR;
    
    // serialize it
    err = SCKeySerialize(key1, &keyData, &keyDataLen); CKERR;
    OPTESTLogDebug("\t\tPublic Key Packet: (%ld bytes)\n%s\n",keyDataLen, (char*)keyData);
    XFREE(keyData); keyData = NULL;

    err = SCKeySerializePrivateWithSCKey(key1, sKey, &keyData, &keyDataLen); CKERR;
    OPTESTLogDebug("\t\tPrivate Key Packet: (%ld bytes)\n%s\n",keyDataLen, (char*)keyData);
    
    OPTESTLogVerbose("\t\tImport Private Key Packet \n" );
    err = SCKeyDeserialize(keyData,  keyDataLen, &key2);CKERR;
    XFREE(keyData); keyData = NULL;
  
    OPTESTLogVerbose("\t\tUnlock Private Key Packet \n" );
    err = SCKeyIsLocked(key2,&isLocked); CKERR;
     // the freshly iported key should be locked
    ASSERTERR(!isLocked, kSCLError_SelfTestFailed);
    err = SCKeyUnlockWithSCKey(key2, sKey); CKERR;
  
    // check reimport
    OPTESTLogVerbose("\t\tCompare Deserialized Key \n" );
    err = SCKeyGetProperty(key2, kSCKeyProp_SCKeySuite,   NULL,  &keyType1, sizeof(SCKeySuite),  NULL); CKERR;
    err = compareResults(&keyType, &keyType, sizeof(SCKeySuite), kResultFormat_Byte, "keySuite");CKERR;
    
    err = SCKeyGetAllocatedProperty(key1, kSCKeyProp_Locator,NULL,  (void*)&keyData ,  &keyDataLen); CKERR;
    err = SCKeyGetAllocatedProperty(key2, kSCKeyProp_Locator,&propType,  (void*)&keyData1 ,  &keyDataLen1); CKERR;
    ASSERTERR(propType != SCKeyPropertyType_Binary,  kSCLError_SelfTestFailed);
    err = compareResults(keyData, keyData1, keyDataLen, kResultFormat_Byte, "locator");CKERR;
    XFREE(keyData); keyData = NULL;
    XFREE(keyData1); keyData1 = NULL;
    
    err = SCKeyGetProperty(key2, kSCKeyProp_StartDate,   &propType,  &date1, sizeof(time_t),  &keyDataLen); CKERR;
    ASSERTERR(propType != SCKeyPropertyType_Time,  kSCLError_SelfTestFailed);
    err = compareResults(&startDate, &date1, sizeof(time_t), kResultFormat_Byte, "startDate");CKERR;
    
    err = SCKeyGetProperty(key2, kSCKeyProp_ExpireDate,   &propType,  &date1, sizeof(time_t),  &keyDataLen); CKERR;
    ASSERTERR(propType != SCKeyPropertyType_Time,  kSCLError_SelfTestFailed);
    err = compareResults(&expireDate, &date1, sizeof(time_t), kResultFormat_Byte, "expireDate");CKERR;
 
// TODO: we need to add code in SCKeys to xport the key signatures and verify them
    
    OPTESTLogVerbose(" \n" );
    
done:
    if(ECC_ContextRefIsValid(ecc) )
        ECC_Free(ecc );
    
    if(SCKeyContextRefIsValid(key1))
        SCKeyFree(key1);
    
    if(SCKeyContextRefIsValid(key2))
        SCKeyFree(key2);

    if(keyData)
        XFREE(keyData);

    if(keyData1)
        XFREE(keyData1);

    return err;
};
Exemple #12
0
static SCLError sSCKeysStorageTest(SCKeySuite keySuite)
{
    SCLError        err = kSCLError_NoErr;
    SCKeyContextRef storageKey = kInvalidSCKeyContextRef;
    SCKeyContextRef pKey = kInvalidSCKeyContextRef;
    
    const char* passphrase  = "Tant las fotei com auziretz";
    uint8_t* keyData = NULL;
    size_t  keyDataLen = 0;
  
    Cipher_Algorithm    algorithm = kCipher_Algorithm_Invalid;
    size_t              symKeyLen = 0;
   
    int msg_count = ( sizeof(Msgs) / sizeof(char*)) -1;
    
    typedef struct {
        uint8_t 	*data;
        size_t     len;
    }storage_entry;

    storage_entry *msg_store = NULL;
    
    uint8_t    deviceUUID[32];
    uint8_t    IV[32];
    
    OPTESTLogInfo("\tTesting SCKeys Storage API (%s)\n", sckey_suite_table(keySuite));
    
    msg_store = XMALLOC(sizeof(storage_entry) * msg_count);  CKNULL(msg_store);
    ZERO(msg_store,sizeof(storage_entry) * msg_count);
    
    // we use the UUID only as a nonce, it should be unique but doesnt have to be secure
    err =  RNG_GetBytes(deviceUUID,sizeof(deviceUUID));

    // generate a 128 bit storagre key and a 128 bit IV
     err =  RNG_GetBytes(IV,sizeof(IV));
  
    err = SCKeyCipherForKeySuite(keySuite, &algorithm, &symKeyLen);  CKERR;
 
    OPTESTLogVerbose("\t\tCreate %s encyption key\n",cipher_algor_table(algorithm));
    err = SCKeyNew(keySuite, deviceUUID, sizeof(deviceUUID), &storageKey); CKERR;
    err = SCKeySetProperty (storageKey, kSCKeyProp_IV, SCKeyPropertyType_Binary,  IV   , symKeyLen); CKERR;
    
    OPTESTLogVerbose("\t\tEncrypt %d test messages\n", msg_count);
    // Encrypt a bunch of messages
    for(int i = 0; Msgs[i] != NULL; i++)
    {
        unsigned long msgLen;

        msgLen = strlen(Msgs[i]);
        
        OPTESTLogDebug("\t\t  %3d - %3d bytes |%.*s|\n", i+1,  (int)msgLen,(int)msgLen, Msgs[i] );
        err = SCKeyStorageEncrypt(storageKey,
                                  (uint8_t*) Msgs[i], msgLen,
                                  &msg_store[i].data,   &msg_store[i].len); CKERR;
        
        dumpHex(IF_LOG_DEBUG, msg_store[i].data, (int)msg_store[i].len, 0);
        OPTESTLogDebug("\n");
        
    }
    
    OPTESTLogVerbose("\t\tSecure the storage key to a passphrase\n");
    
    // secure the storage key to a passphrase
    err = SCKeyEncryptToPassPhrase(storageKey, (uint8_t*)passphrase, strlen(passphrase), &pKey); CKERR;
    
    // get rid of orignial storage key
    SCKeyFree(storageKey);   storageKey = NULL;
    
    err = SCKeySerialize(pKey, &keyData, &keyDataLen); CKERR;
    SCKeyFree(pKey);   pKey = NULL;
    ZERO(IV,sizeof(IV));
    
    // save the passphrase key somewhere
    OPTESTLogDebug("\t\tPBKDF2 Passphrase Key Packet: (%ld bytes)\n%s\n",keyDataLen, (char*)keyData);
    
    // restore the passphrase key
    err = SCKeyDeserialize(keyData,  keyDataLen, &pKey);CKERR;
    
    // unlock passphrase key and make a SKey
    err = SCKeyDecryptFromPassPhrase(pKey, (uint8_t*)passphrase, strlen(passphrase), &storageKey ); CKERR;
    
    SCKeyFree(pKey); pKey = NULL;
    
    OPTESTLogVerbose("\t\tDecrypt and compare %d messages\n", msg_count);
     for(int i = 0; Msgs[i] != NULL; i++)
    {
        unsigned long msgLen;
        
        uint8_t*    PT = NULL;
        size_t      PTLen = 0;
        
        msgLen = strlen(Msgs[i]);
        
          err = SCKeyStorageDecrypt(storageKey,
                                  msg_store[i].data,   msg_store[i].len,
                                  &PT,    &PTLen); CKERR;
        
        if(msgLen != PTLen)
        {
            OPTESTLogInfo("ERROR  MSG Decrypt: Expecting %d bytes, got %d\n", (int)msgLen, (int)PTLen );
            RETERR(kSCLError_SelfTestFailed);
        }
        
        err = compareResults( Msgs[i],  PT, msgLen , kResultFormat_Byte, "MSG Decrypt"); CKERR;
        
        if(PT) XFREE(PT);
        PT = NULL;
      }
 
     SCKeyFree(storageKey);
    storageKey = NULL;
    
    OPTESTLogVerbose("\n");
done:
    
    for(int i = 0; i < msg_count; i++)
    {
        if(msg_store[i].data )
        {
            XFREE(msg_store[i].data);
        }
        
    }
    
    XFREE(msg_store);
    
    
    if(SCKeyContextRefIsValid(pKey))
        SCKeyFree(pKey);
    
    if(SCKeyContextRefIsValid(storageKey))
        SCKeyFree(storageKey);
 
    
    return err;
    
}