x.crypto.ascon #
ascon
ascon
is an implementation of Ascon-Based Cryptography module implemented in pure V language. This module was mostly based on NIST Special Publication of 800 NIST SP 800-232 document. Its describes an Ascon-Based Lightweight Cryptography Standards for Constrained Devices thats provides Authenticated Encryption, Hash, and Extendable Output Functions. See the NIST.SP.800-232 Standard for more detail.
This module mostly implements all the features availables on the document. It currently implements:- Ascon-Hash256
, Ascon-based hashing implementation that produces 256-bits output.
Ascon-XOF128
, Ascon-based eXtendable Output Function (XOF) where the output size ofthe hash of the message can be selected by the user.-Ascon-CXOF128
, a customized XOF that allows users to specify a customizationstring and choose the output size of the message hash.-Ascon-AEAD128
, an Authenticated Encryption with Additional Data (AEAD) Scheme basedon Ascon-family crypto.
Constants #
const default_xof_size = 64
default_xof_size is the size of Ascon-XOF128 (and Ascon-CXOF128) checksum that has 512-bits length.
const max_hash_size = 4096 // in bytes
max_hash_size is a maximum size of Ascon-XOF128 (and Ascon-CXOF128) checksum output. Its very rare where checksum output bigger than 512-bits, So, we limiting it to prevent unconditional thing. This limitation was only occurs on this module, wee can change it later.
const tag_size = 16
tag_size is 128-bit size of Ascon-AEAD128 authentication tag
const nonce_size = 16
nonce_size is 128-bit size of Ascon-AEAD128 nonce
const key_size = 16
The constants for Ascon-AEAD128
key_size is 128-bit size of Ascon-AEAD128 key
fn cxof128 #
fn cxof128(msg []u8, size int, cs []u8) ![]u8
cxof128 creates an Ascon-CXOF128 checksum of msg with supplied size and custom string cs.
fn cxof128_64 #
fn cxof128_64(msg []u8, cs []u8) ![]u8
cxof128_64 creates a 64-bytes of Ascon-CXOF128 checksum of msg with supplied custom string in cs.
fn decrypt #
fn decrypt(key []u8, nonce []u8, ad []u8, ciphertext []u8) ![]u8
decrypt decrypts authenticated encrypted messages in ciphertext that encrypted under provided key and nonce with additional data in ad
. It would check if authentication tag mas matching and return decrypted message if success or error on fails.
fn encrypt #
fn encrypt(key []u8, nonce []u8, ad []u8, msg []u8) ![]u8
encrypt encrypts the message under provided key and nonce and supplied additional data in ad. It returns an authenticated output of Ascon-AEAD128 ciphertext where authentication tag was stored within the end of ciphertext.
Note: The Ascon-AEAD128 key shall be kept secret,
fn new_aead128 #
fn new_aead128(key []u8) !&Aead128
new_aead128 creates a new Aead128 instance and initialized with supplied key.
fn new_cxof128 #
fn new_cxof128(size int, cs []u8) !&CXof128
new_cxof128 creates a new Ascon-CXOF128 instanace with cheksum size was set to size and custom string in cs. It returns error on fails.
fn new_hash256 #
fn new_hash256() &Hash256
new_hash256 creates a new Ascon-Hash256 instance.
fn new_xof128 #
fn new_xof128(size int) &Xof128
new_xof128 creates a new Ascon-XOF128 instance with provided size parameter.
fn sum256 #
fn sum256(msg_ []u8) []u8
sum256 creates an Ascon-Hash256 checksum for bytes on msg and produces a 256-bit hash.
fn xof128 #
fn xof128(msg []u8, size int) ![]u8
xof128 creates an Ascon-XOF128 checksum of msg with specified desired size of output.
fn xof128_64 #
fn xof128_64(msg []u8) ![]u8
xof128_64 creates a 64-bytes of Ascon-XOF128 checksum of msg.
struct Aead128 #
struct Aead128 {
State
mut:
// 32-bytes of underlying key
key [2]u64
}
Aead128 is an opaque provides an implementation of Ascon-AEAD128 from NIST.SP.800-232 standard. Its implements x.crypto.chacha20poly1305.AEAD
interfaces.
fn (Aead128) nonce_size #
fn (c &Aead128) nonce_size() int
nonce_size returns the nonce size of Ascon-AEAD128 Aead128.
fn (Aead128) overhead #
fn (c &Aead128) overhead() int
overhead returns the maximum difference between the lengths of a plaintext and its ciphertext.
fn (Aead128) encrypt #
fn (mut c Aead128) encrypt(msg []u8, nonce []u8, ad []u8) ![]u8
encrypt encrypts the message under provided key and nonce and supplied additional data in ad. It returns an authenticated output of Ascon-AEAD128 ciphertext where authentication tag was stored within the end of ciphertext.
fn (Aead128) decrypt #
fn (mut c Aead128) decrypt(ciphertext []u8, nonce []u8, ad []u8) ![]u8
decrypt decrypts the ciphertext and validates authentication tag with provided nonce and additional data ad. It returns error on fails or tag unmatching.
struct CXof128 #
struct CXof128 {
Digest
mut:
// Customization string
cs []u8
// checksum size, for fixed-output
size int = default_xof_size
}
CXof128 is an opaque provides an implementation of Ascon-CXOF128 from NIST.SP.800-232 standard. Its implements hash.Hash
interface with checksum-size stored on instance creation.
fn (CXof128) size #
fn (x &CXof128) size() int
size returns an underlying size of CXof128 checksum in fixed-sized manner. Internally, its return underlying size stored on current CXof128 instance.
fn (CXof128) block_size #
fn (x &CXof128) block_size() int
block_size returns an underlying CXof128 block size operates on, ie, 8-bytes
fn (CXof128) write #
fn (mut x CXof128) write(msg []u8) !int
write writes out the content of message and updates internal CXof128 state.
fn (CXof128) sum #
fn (mut x CXof128) sum(msg []u8) []u8
sum returns an Ascon-CXOF128 checksum of the bytes in msg. Its produces x.size
of checksum bytes. If you want to more extendible output, use .read
call instead.
fn (CXof128) read #
fn (mut x CXof128) read(mut dst []u8) !int
read tries to read dst.len
bytes of hash output from current CXof128 state and stored into dst.
fn (CXof128) reset #
fn (mut x CXof128) reset()
reset resets internal CXof128 state into default initialized state.
fn (CXof128) free #
fn (mut x CXof128) free()
free releases out the resources taken by the x
. Dont use x after .free call.
struct Hash256 #
struct Hash256 {
Digest
}
Hash256 is an opaque provides an implementation of Ascon-Hash256 from NIST.SP.800-232 standard. Its implements hash.Hash
interface.
fn (Hash256) size #
fn (h &Hash256) size() int
size returns an underlying size of Hash256 checksum, ie, 32-bytes
fn (Hash256) block_size #
fn (h &Hash256) block_size() int
block_size returns an underlying Hash256 block size operates on, ie, 8-bytes
fn (Hash256) reset #
fn (mut h Hash256) reset()
reset resets and reinit internal Hash256 state into default initialized state.
fn (Hash256) free #
fn (mut h Hash256) free()
free releases out the resources taken by the h
. Dont use x after .free call.
fn (Hash256) write #
fn (mut h Hash256) write(msg []u8) !int
write writes out the content of message and updates internal Hash256 state.
fn (Hash256) sum #
fn (mut h Hash256) sum(data []u8) []u8
sum returns an Ascon-Hash256 checksum of the bytes in data.
struct Xof128 #
struct Xof128 {
Digest
mut:
// The size of Xof128 cheksum, when you dont specify it
size int = default_xof_size
}
Xof128 is an opaque provides an implementation of Ascon-XOF128 from NIST.SP.800-232 standard. Its implements hash.Hash
interface with checksum size stored on instance creation.
fn (Xof128) size #
fn (x &Xof128) size() int
size returns an underlying size of Xof128 checksum in fixed-sized manner. Internally, its return underlying size stored on current Xof128 instance.
fn (Xof128) block_size #
fn (x &Xof128) block_size() int
block_size returns an underlying Xof128 block size operates on, ie, 8-bytes
fn (Xof128) write #
fn (mut x Xof128) write(msg []u8) !int
write writes out the content of message and updates internal Xof128 state.
fn (Xof128) sum #
fn (mut x Xof128) sum(msg []u8) []u8
sum returns an Ascon-XOF128 checksum of the bytes in msg. Its produces x.size
of checksum bytes. If you want to more extendible output, use .read
call instead.
fn (Xof128) read #
fn (mut x Xof128) read(mut dst []u8) !int
read tries to read dst.len
bytes of hash output from current Xof128 state and stored into dst.
Note: 1 ≤ dst.len ≤ max_hash_size.
fn (Xof128) reset #
fn (mut x Xof128) reset()
reset resets internal Xof128 state into default initialized state.
fn (Xof128) free #
fn (mut x Xof128) free()
free releases out the resources taken by the x
. Dont use x after .free call.