static int aes_crypt_cfb128_wrap( void *ctx, mbedtls_operation_t operation, size_t length, size_t *iv_off, unsigned char *iv, const unsigned char *input, unsigned char *output ) { return mbedtls_aes_crypt_cfb128( (mbedtls_aes_context *) ctx, operation, length, iv_off, iv, input, output ); }
int blufi_aes_decrypt(uint8_t iv8, uint8_t *crypt_data, int crypt_len) { int ret; size_t iv_offset = 0; uint8_t iv0[16]; memcpy(iv0, blufi_sec->iv, sizeof(blufi_sec->iv)); iv0[0] = iv8; /* set iv8 as the iv0[0] */ ret = mbedtls_aes_crypt_cfb128(&blufi_sec->aes, MBEDTLS_AES_DECRYPT, crypt_len, &iv_offset, iv0, crypt_data, crypt_data); if (ret) { return -1; } return crypt_len; }
int AESContext::cryptCFB128(State & state, mbedtls_aes_context * context){ Stack * stack = state.stack; if (stack->is<LUA_TNUMBER>(1) && stack->is<LUA_TNUMBER>(2) && stack->is<LUA_TSTRING>(3) && stack->is<LUA_TSTRING>(4)){ std::string ivStr = stack->toLString(3); std::string input = stack->toLString(4); int length = input.length(); if (((length % 16) == 0) && (ivStr.length() == 16)){ int mode = stack->to<int>(1); size_t ivOff = stack->to<int>(2); unsigned char iv[16]; unsigned char * output = new unsigned char[length]; memcpy(iv, ivStr.c_str(), 16); int result = mbedtls_aes_crypt_cfb128(context, mode, length, &ivOff, iv, reinterpret_cast<const unsigned char *>(input.c_str()), output); if (result == 0){ stack->push<int>(ivOff); stack->pushLString(std::string(reinterpret_cast<char*>(iv), 16)); stack->pushLString(std::string(reinterpret_cast<char*>(output), length)); delete[] output; return 3; } else{ stack->push<int>(result); delete[] output; return 1; } } else{ stack->push<bool>(false); return 1; } } return 0; }