| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149 |
- #include "_aes_AES.h"
- #include "mbedtls/aes.h"
- enum {
- MODE_ECB,
- MODE_CBC,
- } pika_aes_t;
- void _aes_AES___init__(PikaObj* self) {
- obj_setInt(self, "MODE_ECB", MODE_ECB);
- obj_setInt(self, "MODE_CBC", MODE_CBC);
- }
- void _aes_AES_new(PikaObj* self, Arg* password, int mode, Arg* iv) {
- ArgType t;
- mbedtls_aes_context context;
- t = arg_getType(password);
- if (ARG_TYPE_BYTES != t) {
- obj_setErrorCode(self, -2); // io error
- }
- t = arg_getType(iv);
- if (ARG_TYPE_NONE != t) {
- if (ARG_TYPE_BYTES != t) {
- obj_setErrorCode(self, -2); // io error
- } else {
- size_t len = arg_getBytesSize(iv);
- if (len != 16) {
- obj_setErrorCode(self, -2); // io error
- } else {
- obj_setBytes(self, "_iv", arg_getBytes(iv), len);
- }
- }
- }
- obj_setBytes(self, "_password", arg_getBytes(password),
- arg_getBytesSize(password));
- obj_setInt(self, "_mode", mode);
- mbedtls_aes_init(&context);
- obj_setStruct(self, "context", context);
- }
- Arg* _aes_AES_encrypt(PikaObj* self, Arg* msg) {
- ArgType t;
- t = arg_getType(msg);
- if (ARG_TYPE_BYTES != t) {
- obj_setErrorCode(self, -2); // io error
- }
- uint8_t* data = arg_getBytes(msg);
- uint8_t data_len = arg_getBytesSize(msg);
- uint8_t mode = obj_getInt(self, "_mode");
- void* context = obj_getStruct(self, "context");
- uint8_t* password = obj_getBytes(self, "_password");
- uint8_t password_len = obj_getBytesSize(self, "_password");
- uint8_t* iv = obj_getBytes(self, "_iv");
- uint8_t iv_in[16];
- if (obj_getBytes(self, "_buff") != NULL) {
- obj_removeArg(self, "_buff");
- }
- obj_setBytes(self, "_buff", NULL, data_len * sizeof(uint8_t));
- uint8_t* buff = obj_getBytes(self, "_buff");
- if (mode == MODE_CBC) {
- if (iv != NULL) {
- __platform_memcpy(iv_in, iv, 16);
- } else {
- obj_setErrorCode(self, -2); // io error
- }
- }
- mbedtls_aes_setkey_enc((mbedtls_aes_context*)context, password,
- password_len * 8);
- switch (mode) {
- case MODE_ECB:
- mbedtls_aes_crypt_ecb((mbedtls_aes_context*)context,
- MBEDTLS_AES_ENCRYPT, data, buff);
- break;
- case MODE_CBC:
- mbedtls_aes_crypt_cbc((mbedtls_aes_context*)context,
- MBEDTLS_AES_ENCRYPT, data_len, iv_in, data,
- buff);
- break;
- default:
- obj_setSysOut(self, "[%s]not support mode", __FUNCTION__);
- obj_setErrorCode(self, -3); // not support now
- break;
- }
- return arg_newBytes(buff, data_len);
- }
- Arg* _aes_AES_decrypt(PikaObj* self, Arg* msg) {
- ArgType t;
- t = arg_getType(msg);
- if (ARG_TYPE_BYTES != t) {
- obj_setErrorCode(self, -2); // io error
- }
- uint8_t* data = arg_getBytes(msg);
- uint8_t data_len = arg_getBytesSize(msg);
- void* context = obj_getStruct(self, "context");
- uint8_t mode = obj_getInt(self, "_mode");
- uint8_t* password = obj_getBytes(self, "_password");
- uint8_t password_len = obj_getBytesSize(self, "_password");
- uint8_t* iv = obj_getBytes(self, "_iv");
- uint8_t iv_in[16];
- if (obj_getBytes(self, "_buff") != NULL) {
- obj_removeArg(self, "_buff");
- }
- obj_setBytes(self, "_buff", NULL, data_len * sizeof(uint8_t));
- uint8_t* buff = obj_getBytes(self, "_buff");
- if (mode == MODE_CBC) {
- if (iv != NULL) {
- __platform_memcpy(iv_in, iv, 16);
- } else {
- obj_setErrorCode(self, -2); // io error
- }
- }
- mbedtls_aes_setkey_dec((mbedtls_aes_context*)context, password,
- password_len * 8);
- switch (mode) {
- case MODE_ECB:
- mbedtls_aes_crypt_ecb((mbedtls_aes_context*)context,
- MBEDTLS_AES_DECRYPT, data, buff);
- break;
- case MODE_CBC:
- mbedtls_aes_crypt_cbc((mbedtls_aes_context*)context,
- MBEDTLS_AES_DECRYPT, data_len, iv_in, data,
- buff);
- break;
- default:
- obj_setSysOut(self, "[%s]not support mode", __FUNCTION__);
- obj_setErrorCode(self, -3); // not support now
- break;
- }
- return arg_newBytes(buff, data_len);
- }
|