void LRWMode::EncryptBlock(ThreadContext& context, uint8 *data, size_t length, uint64 blockIndex) { uint8 i[8]; uint8 t[16]; uint32 b; blockIndex = ((blockIndex - fOffset) << 5) + 1; *(uint64*)i = B_HOST_TO_BENDIAN_INT64(blockIndex); for (b = 0; b < length >> 4; b++) { gf128_mul_by_tab64(i, t, (galois_field_context*)context.BufferFor(fGaloisField)); xor128((uint64*)data, (uint64*)t); fAlgorithm->Encrypt(context, data, 16); xor128((uint64*)data, (uint64*)t); data += 16; if (i[7] != 0xff) i[7]++; else { *(uint64*)i = B_HOST_TO_BENDIAN_INT64( B_BENDIAN_TO_HOST_INT64(*(uint64*)i) + 1); } } memset(t, 0, sizeof (t)); }
void AESAlgorithm::Encrypt(ThreadContext& context, uint8 *data, size_t length) { //dprintf(" aes-encrypt-pre: %x\n", *(int*)data); aes_encrypt(data, data, (const aes_encrypt_ctx*)context.BufferFor(fEncryptScheduler)); //dprintf(" aes-encrypt-post: %x\n", *(int*)data); }
status_t AESAlgorithm::SetKey(ThreadContext& context, const uint8* key, size_t keyLength) { //dprintf("%s-aes key: %x (%lu)\n", fMode == MODE_LRW ? "lrw" : "xts", *(int*)key, keyLength); if (aes_encrypt_key(key, keyLength, (aes_encrypt_ctx*)context.BufferFor(fEncryptScheduler)) != EXIT_SUCCESS) return B_ERROR; if (aes_decrypt_key(key, keyLength, (aes_decrypt_ctx*)context.BufferFor(fDecryptScheduler)) != EXIT_SUCCESS) return B_ERROR; return B_OK; }
status_t LRWMode::SetKey(ThreadContext& context, const uint8* key, size_t keyLength) { //dprintf("lrw key: %x\n", *(int*)key); gf128_tab64_init(key, (struct galois_field_context*)context.BufferFor(fGaloisField)); return B_OK; }