summaryrefslogtreecommitdiff
path: root/shared-module/aesio/__init__.c
blob: 2cacaeb66e79bf1e61e38bfd43859e52c4b82cb8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#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;
  }
}