void Encrypt(PK0304* le, AE_EXTRA* ae, char* password) { char *salt, *key1, *key2, *check, digest[40]; u32 key_len = KeySize*2 + 2; u32 dig_len = 40; salt = BUF; key1 = salt+SaltSize; key2 = key1+KeySize; check = key2+KeySize; /* Gets a random salt (8-16 byte) */ sprng_read(salt, SaltSize, 0); /* Generates 2 keys for AES and HMAC, plus 2-byte password verification value */ if (pkcs_5_alg2(password, strlen(password), salt, SaltSize, 1000, 0, key1, &key_len) != CRYPT_OK) Z_ERROR("Failed to derive encryption keys"); // dump("salt", salt, SaltSize); // dump("key", key1, KeySize); if (ctr_start(0, IV, key1, KeySize, 0, CTR_COUNTER_LITTLE_ENDIAN, &ctr) != CRYPT_OK) Z_ERROR("Failed to setup AES CTR encoder"); #ifdef GLADMAN_HMAC hmac_sha1_begin(&hmac); hmac_sha1_key(key2, KeySize, &hmac); #else if (hmac_init(&hmac, 0, key2, KeySize) != CRYPT_OK) Z_ERROR("Failed to setup HMAC-SHA1"); #endif if (AE2) le->Crc32 = 0; le->Flag |= 1; le->CompMethod = 99; le->ExtraLen += 11; le->CompSize += SaltSize + 12; /* variable salt, fixed password check and hmac */ safeWrite(ZOUT, le, sizeof(PK0304)); fileCopy(ZOUT, ZIN, le->NameLen+le->ExtraLen-11); safeWrite(ZOUT, ae, 11); safeWrite(ZOUT, salt, SaltSize); safeWrite(ZOUT, check, 2); /* encrypt contents */ fileFilter(ZOUT, ZIN, le->CompSize-SaltSize-12); #ifdef GLADMAN_HMAC hmac_sha1_end(digest, dig_len, &hmac); #else if (hmac_done(&hmac, digest, &dig_len) != CRYPT_OK) Z_ERROR("Failed to computate HMAC"); #endif safeWrite(ZOUT, digest, 10); ctr_done(&ctr); }
FILE* topen(char *name) { u16 u, i; FILE *f; for (i=0; i<1000; i++) { sprng_read(&u, 4, 0); sprintf(name, "AE-%05X.TMP", u); f = fopen(name, "w+b"); if (!f) continue; else return f; } Z_ERROR("Can't create a temporary file!"); return 0; /* never reached */ }
C4Err RNG_GetBytes( void * out, size_t outLen ) { C4Err err = kC4Err_NoErr; #if _USES_COMMON_CRYPTO_ if( CCRandomGenerateBytes(out, outLen) != kCCSuccess) err = kC4Err_ResourceUnavailable; #else unsigned long count = sprng_read(out,outLen,NULL); if(count != outLen) err = kC4Err_ResourceUnavailable; #endif return (err); }
SCLError TestGCM() { SCLError err = kSCLError_NoErr; int status = CRYPT_OK; uint8_t key[32]; uint8_t* CT = NULL; size_t CTLen = 0; uint8_t* PT = NULL; size_t PTLen = 0; unsigned char T[32]; unsigned long tagLen = 0; int i; register_cipher (&aes_desc); printf("\nTesting GCM encoding \n\n"); for(i = 0; Msgs[i] != NULL; i++) { unsigned long msgLen; uint8_t seqNum[6]; sprng_read(key,sizeof(key),NULL); msgLen = strlen(Msgs[i]); // sprintf(seqNum, "%05d ", i); // printf("\n%s %3d |%s|\n\n", seqNum, (int)msgLen, Msgs[i]); err = GCM_Encrypt( key, sizeof(key), seqNum, sizeof(seqNum), Msgs[i], msgLen, &CT, &CTLen, T, &tagLen); CKERR; // Error test // seqNum[0]= seqNum[0]+1; // T[0]= T[0]+1; err = GCM_Decrypt( key, sizeof(key), seqNum, sizeof(seqNum), CT, CTLen, T, tagLen, &PT, &PTLen); CKERR; // dumpHex(CT, CTLen, 0); // printf("Tag %d: ", (int)tagLen); dumpHex8(T); dumpHex8(T+8); // printf("\n"); if(msgLen != PTLen) { printf("ERROR GCM Decrypt: Expecting %d bytes, got %d\n", (int)msgLen, (int)PTLen ); RETERR(kSCLError_SelfTestFailed); } if( compareResults( Msgs[i], PT, msgLen , kResultFormat_Byte, "GCM Decrypt") != CRYPT_OK) { RETERR(kSCLError_SelfTestFailed); } // printf(" %5d |%.*s|\n\n", (int)PTLen,(int)PTLen, PT ); if(CT) { memset(CT, CTLen, 0); XFREE(CT); CT = NULL; } if(PT) { memset(PT,PTLen, 0); XFREE(PT); PT = NULL; } } done: if(status != CRYPT_OK) err = sCrypt2SCLError(status); if(CT) { memset(CT, CTLen, 0); XFREE(CT); CT = NULL; } if(PT) { memset(PT,PTLen, 0); XFREE(PT); PT = NULL; } return err; }