mirror of
https://github.com/odin-lang/Odin.git
synced 2026-05-29 23:25:09 +00:00
54 lines
1.6 KiB
Odin
54 lines
1.6 KiB
Odin
package aes
|
|
|
|
import "core:crypto/_aes/ct64"
|
|
|
|
// Context_ECB is a keyed AES-ECB instance.
|
|
//
|
|
// WARNING: Using ECB mode is strongly discouraged unless it is being
|
|
// used to implement higher level constructs.
|
|
Context_ECB :: struct {
|
|
_impl: Context_Impl,
|
|
_is_initialized: bool,
|
|
}
|
|
|
|
// init_ecb initializes a Context_ECB with the provided key.
|
|
init_ecb :: proc(ctx: ^Context_ECB, key: []byte, impl := DEFAULT_IMPLEMENTATION) {
|
|
init_impl(&ctx._impl, key, impl)
|
|
ctx._is_initialized = true
|
|
}
|
|
|
|
// encrypt_ecb encrypts the BLOCK_SIZE buffer src, and writes the result to dst.
|
|
encrypt_ecb :: proc(ctx: ^Context_ECB, dst, src: []byte) {
|
|
ensure(ctx._is_initialized)
|
|
ensure(len(dst) == BLOCK_SIZE, "crypto/aes: invalid dst size")
|
|
ensure(len(dst) == BLOCK_SIZE, "crypto/aes: invalid src size")
|
|
|
|
switch &impl in ctx._impl {
|
|
case ct64.Context:
|
|
ct64.encrypt_block(&impl, dst, src)
|
|
case Context_Impl_Hardware:
|
|
encrypt_block_hw(&impl, dst, src)
|
|
}
|
|
}
|
|
|
|
// decrypt_ecb decrypts the BLOCK_SIZE buffer src, and writes the result to dst.
|
|
decrypt_ecb :: proc(ctx: ^Context_ECB, dst, src: []byte) {
|
|
ensure(ctx._is_initialized)
|
|
ensure(len(dst) == BLOCK_SIZE, "crypto/aes: invalid dst size")
|
|
ensure(len(dst) == BLOCK_SIZE, "crypto/aes: invalid src size")
|
|
|
|
switch &impl in ctx._impl {
|
|
case ct64.Context:
|
|
ct64.decrypt_block(&impl, dst, src)
|
|
case Context_Impl_Hardware:
|
|
decrypt_block_hw(&impl, dst, src)
|
|
}
|
|
}
|
|
|
|
// reset_ecb sanitizes the Context_ECB. The Context_ECB must be
|
|
// re-initialized to be used again.
|
|
reset_ecb :: proc "contextless" (ctx: ^Context_ECB) {
|
|
reset_impl(&ctx._impl)
|
|
ctx._is_initialized = false
|
|
}
|