diff options
Diffstat (limited to 'v_windows/v/vlib/crypto/aes/aes.v')
-rw-r--r-- | v_windows/v/vlib/crypto/aes/aes.v | 77 |
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) +} |