b168784fa0
This adds initial support for an AES module named aesio. This
implementation supports only a subset of AES modes, namely
ECB, CBC, and CTR modes.
Example usage:
```
>>> import aesio
>>>
>>> key = b'Sixteen byte key'
>>> cipher = aesio.AES(key, aesio.MODE_ECB)
>>> output = bytearray(16)
>>> cipher.encrypt_into(b'Circuit Python!!', output)
>>> output
bytearray(b'E\x14\x85\x18\x9a\x9c\r\x95>\xa7kV\xa2`\x8b\n')
>>>
```
This key is 16-bytes, so it uses AES128. If your key is 24- or 32-
bytes long, it will switch to AES192 or AES256 respectively.
This has been tested with many of the official NIST test vectors,
such as those used in `pycryptodome` at
39626a5b01/lib/Crypto/SelfTest/Cipher/test_vectors/AES
CTR has not been tested as NIST does not provide test vectors for it.
Signed-off-by: Sean Cross <sean@xobs.io>
59 lines
1.6 KiB
C
59 lines
1.6 KiB
C
#include <string.h>
|
|
|
|
#include "py/runtime.h"
|
|
|
|
#include "shared-bindings/aesio/__init__.h"
|
|
#include "shared-module/aesio/__init__.h"
|
|
|
|
void common_hal_aesio_aes_construct(aesio_aes_obj_t *self, const uint8_t *key,
|
|
uint32_t key_length, const uint8_t *iv,
|
|
int mode, int counter) {
|
|
self->mode = mode;
|
|
self->counter = counter;
|
|
common_hal_aesio_aes_rekey(self, key, key_length, iv);
|
|
}
|
|
|
|
void common_hal_aesio_aes_rekey(aesio_aes_obj_t *self, const uint8_t *key,
|
|
uint32_t key_length, const uint8_t *iv) {
|
|
memset(&self->ctx, 0, sizeof(self->ctx));
|
|
if (iv != NULL) {
|
|
AES_init_ctx_iv(&self->ctx, key, key_length, iv);
|
|
} else {
|
|
AES_init_ctx(&self->ctx, key, key_length);
|
|
}
|
|
}
|
|
|
|
void common_hal_aesio_aes_set_mode(aesio_aes_obj_t *self, int mode) {
|
|
self->mode = mode;
|
|
}
|
|
|
|
void common_hal_aesio_aes_encrypt(aesio_aes_obj_t *self, uint8_t *buffer,
|
|
size_t length) {
|
|
switch (self->mode) {
|
|
case AES_MODE_ECB:
|
|
AES_ECB_encrypt(&self->ctx, buffer);
|
|
break;
|
|
case AES_MODE_CBC:
|
|
AES_CBC_encrypt_buffer(&self->ctx, buffer, length);
|
|
break;
|
|
case AES_MODE_CTR:
|
|
AES_CTR_xcrypt_buffer(&self->ctx, buffer, length);
|
|
break;
|
|
}
|
|
}
|
|
|
|
void common_hal_aesio_aes_decrypt(aesio_aes_obj_t *self, uint8_t *buffer,
|
|
size_t length) {
|
|
switch (self->mode) {
|
|
case AES_MODE_ECB:
|
|
AES_ECB_decrypt(&self->ctx, buffer);
|
|
break;
|
|
case AES_MODE_CBC:
|
|
AES_CBC_decrypt_buffer(&self->ctx, buffer, length);
|
|
break;
|
|
case AES_MODE_CTR:
|
|
AES_CTR_xcrypt_buffer(&self->ctx, buffer, length);
|
|
break;
|
|
}
|
|
}
|