Example #1
0
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;
    
}
Example #2
0
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;
}
Example #3
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;
    
}
Example #4
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;

}