/** * \file src/decryption/aes_decrypt.h * MegEngine is Licensed under the Apache License, Version 2.0 (the "License") * * Copyright (c) 2014-2021 Megvii Inc. All rights reserved. * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. */ #include "./mbedtls/aes.h" #include "decrypt_base.h" namespace lite { class AESDcryption { public: static std::vector decrypt_model(const void* model_mem, size_t size, const std::vector& key) { mbedtls_aes_context ctx; mbedtls_aes_init(&ctx); mbedtls_aes_setkey_dec(&ctx, key.data(), 256); auto data = static_cast(model_mem); //! first 16 bytes is IV uint8_t iv[16]; //! last 8 bytes is file size(length) auto length_ptr = data + size - 8; size_t length = 0; for (int i = 0; i < 8; i++) { length |= length_ptr[i] << (8 * (7 - i)); } std::copy(data, data + 16, iv); auto output = std::vector(size - 24); mbedtls_aes_crypt_cbc(&ctx, MBEDTLS_AES_DECRYPT, size - 24, iv, data + 16, output.data()); mbedtls_aes_free(&ctx); output.erase(output.begin() + length, output.end()); return output; } static std::vector get_decrypt_key() { std::vector key = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F}; return key; } }; } // namespace lite // vim: syntax=cpp.doxygen foldmethod=marker foldmarker=f{{{,f}}}