aboutsummaryrefslogtreecommitdiff
path: root/v_windows/v/vlib/crypto/aes/aes.v
diff options
context:
space:
mode:
Diffstat (limited to 'v_windows/v/vlib/crypto/aes/aes.v')
-rw-r--r--v_windows/v/vlib/crypto/aes/aes.v77
1 files changed, 77 insertions, 0 deletions
diff --git a/v_windows/v/vlib/crypto/aes/aes.v b/v_windows/v/vlib/crypto/aes/aes.v
new file mode 100644
index 0000000..f7e2cec
--- /dev/null
+++ b/v_windows/v/vlib/crypto/aes/aes.v
@@ -0,0 +1,77 @@
+// Copyright (c) 2019-2021 Alexander Medvednikov. All rights reserved.
+// Use of this source code is governed by an MIT license
+// that can be found in the LICENSE file.
+// Based off: https://github.com/golang/go/blob/master/src/crypto/aes
+// Last commit: https://github.com/golang/go/commit/691a2d457ab1bf03bd46d4b69e0f93b8993c0055
+module aes
+
+import crypto.internal.subtle
+
+pub const (
+ // The AES block size in bytes.
+ block_size = 16
+)
+
+// AesCipher represents an AES encryption using a particular key.
+struct AesCipher {
+mut:
+ enc []u32
+ dec []u32
+}
+
+// new_cipher creates and returns a new `AesCipher`.
+// The key argument should be the AES key,
+// either 16, 24, or 32 bytes to select
+// AES-128, AES-192, or AES-256.
+pub fn new_cipher(key []byte) AesCipher {
+ k := key.len
+ match k {
+ 16, 24, 32 {
+ // break
+ }
+ else {
+ panic('crypto.aes: invalid key size ' + k.str())
+ // return error('crypto.aes: invalid key size ' + k.str())
+ }
+ }
+ // for now use generic version
+ return new_cipher_generic(key)
+}
+
+// block_size returns the block size of the checksum in bytes.
+pub fn (c &AesCipher) block_size() int {
+ return aes.block_size
+}
+
+// encrypt encrypts the blocks in `src` to `dst`.
+// Please note: `dst` and `src` are both mutable for performance reasons.
+pub fn (c &AesCipher) encrypt(mut dst []byte, mut src []byte) {
+ if src.len < aes.block_size {
+ panic('crypto.aes: input not full block')
+ }
+ if dst.len < aes.block_size {
+ panic('crypto.aes: output not full block')
+ }
+ // if subtle.inexact_overlap(dst[:block_size], src[:block_size]) {
+ if subtle.inexact_overlap((*dst)[..aes.block_size], (*src)[..aes.block_size]) {
+ panic('crypto.aes: invalid buffer overlap')
+ }
+ // for now use generic version
+ encrypt_block_generic(c.enc, mut dst, src)
+}
+
+// decrypt decrypts the blocks in `src` to `dst`.
+// Please note: `dst` and `src` are both mutable for performance reasons.
+pub fn (c &AesCipher) decrypt(mut dst []byte, mut src []byte) {
+ if src.len < aes.block_size {
+ panic('crypto.aes: input not full block')
+ }
+ if dst.len < aes.block_size {
+ panic('crypto.aes: output not full block')
+ }
+ if subtle.inexact_overlap((*dst)[..aes.block_size], (*src)[..aes.block_size]) {
+ panic('crypto.aes: invalid buffer overlap')
+ }
+ // for now use generic version
+ decrypt_block_generic(c.dec, mut dst, src)
+}