mirror of
https://github.com/odin-lang/Odin.git
synced 2026-04-18 14:29:47 -04:00
47 lines
1.1 KiB
Odin
47 lines
1.1 KiB
Odin
package aes
|
|
|
|
import "core:crypto"
|
|
import "core:crypto/_aes/ct64"
|
|
import "core:reflect"
|
|
|
|
zero_explicit :: crypto.zero_explicit
|
|
|
|
@(private)
|
|
Context_Impl :: union {
|
|
ct64.Context,
|
|
Context_Impl_Hardware,
|
|
}
|
|
|
|
// DEFAULT_IMPLEMENTATION is the implementation that will be used by
|
|
// default if possible.
|
|
DEFAULT_IMPLEMENTATION :: Implementation.Hardware
|
|
|
|
// Implementation is an AES implementation. Most callers will not need
|
|
// to use this as the package will automatically select the most performant
|
|
// implementation available (See `is_hardware_accelerated()`).
|
|
Implementation :: enum {
|
|
Portable,
|
|
Hardware,
|
|
}
|
|
|
|
@(private)
|
|
init_impl :: proc(ctx: ^Context_Impl, key: []byte, impl: Implementation) {
|
|
impl := impl
|
|
if !is_hardware_accelerated() {
|
|
impl = .Portable
|
|
}
|
|
|
|
switch impl {
|
|
case .Portable:
|
|
reflect.set_union_variant_typeid(ctx^, typeid_of(ct64.Context))
|
|
ct64.init(&ctx.(ct64.Context), key)
|
|
case .Hardware:
|
|
reflect.set_union_variant_typeid(ctx^, typeid_of(Context_Impl_Hardware))
|
|
init_impl_hw(&ctx.(Context_Impl_Hardware), key)
|
|
}
|
|
}
|
|
|
|
@(private)
|
|
reset_impl :: proc "contextless" (ctx: ^Context_Impl) {
|
|
zero_explicit(ctx, size_of(Context_Impl))
|
|
} |