vendor/aes/aes.nim
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 59 60 61 62 |
when not(defined(AES_H)):
const
AES_H* = true
# #define the macros below to 1/0 to enable/disable the mode of operation.
#
# CBC enables AES encryption in CBC-mode of operation.
# CTR enables encryption in counter-mode.
# ECB enables the basic ECB 16-byte block algorithm. All can be enabled simultaneously.
# The #ifndef-guard allows it to be configured before #include'ing or at compile time.
const
CBC* = 1
ECB* = 1
CTR* = 1
AES128* = 1
AES192* = 1
AES256* = 1
const
AES_BLOCKLEN* = 16
when defined(AES256) and (AES256 == 1):
const
AES_KEYLEN* = 32
AES_keyExpSize* = 240
elif defined(AES192) and (AES192 == 1):
const
AES_KEYLEN* = 24
AES_keyExpSize* = 208
else:
const
AES_KEYLEN* = 16
AES_keyExpSize* = 176
type
AES_ctx* = object
RoundKey*: array[AES_keyExpSize, uint8]
Iv*: array[AES_BLOCKLEN, uint8]
{.push importc, cdecl.}
proc AES_init_ctx*(ctx: ptr AES_ctx; key: ptr uint8)
proc AES_init_ctx_iv*(ctx: ptr AES_ctx; key: ptr uint8; iv: ptr uint8)
proc AES_ctx_set_iv*(ctx: ptr AES_ctx; iv: ptr uint8)
when defined(ECB) and (ECB == 1):
# buffer size is exactly AES_BLOCKLEN bytes;
# you need only AES_init_ctx as IV is not used in ECB
# NB: ECB is considered insecure for most uses
proc AES_ECB_encrypt*(ctx: ptr AES_ctx; buf: ptr uint8)
proc AES_ECB_decrypt*(ctx: ptr AES_ctx; buf: ptr uint8)
when defined(CBC) and (CBC == 1):
# buffer size MUST be mutile of AES_BLOCKLEN;
# Suggest https://en.wikipedia.org/wiki/Padding_(cryptography)#PKCS7 for padding scheme
# NOTES: you need to set IV in ctx via AES_init_ctx_iv() or AES_ctx_set_iv()
# no IV should ever be reused with the same key
proc AES_CBC_encrypt_buffer*(ctx: ptr AES_ctx; buf: ptr uint8;
length: uint32_t)
proc AES_CBC_decrypt_buffer*(ctx: ptr AES_ctx; buf: ptr uint8;
length: uint32_t)
# Same function for encrypting as for decrypting.
# IV is incremented for every block, and used after encryption as XOR-compliment for output
# Suggesting https://en.wikipedia.org/wiki/Padding_(cryptography)#PKCS7 for padding scheme
# NOTES: you need to set IV in ctx with AES_init_ctx_iv() or AES_ctx_set_iv()
# no IV should ever be reused with the same key
proc AES_CTR_xcrypt_buffer*(ctx: ptr AES_ctx; buf: ptr uint8;
length: uint32)
{.pop.}
|