123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657 |
- /*
- package aead provides a generic interface to the supported Authenticated
- Encryption with Associated Data algorithms.
- Both a one-shot and context based interface are provided, with similar
- usage. If multiple messages are to be sealed/opened via the same key,
- the context based interface may be more efficient, depending on the
- algorithm.
- WARNING: Reusing the same key + iv to seal (encrypt) multiple messages
- results in catastrophic loss of security for most algorithms.
- Example:
- package aead_example
- import "core:bytes"
- import "core:crypto"
- import "core:crypto/aead"
- main :: proc() {
- algo := aead.Algorithm.XCHACHA20POLY1305
- // The example added associated data, and plaintext.
- aad_str := "Get your ass in gear boys."
- pt_str := "They're immanetizing the Eschaton."
- aad := transmute([]byte)aad_str
- plaintext := transmute([]byte)pt_str
- pt_len := len(plaintext)
- // Generate a random key for the purposes of illustration.
- key := make([]byte, aead.KEY_SIZES[algo])
- defer delete(key)
- crypto.rand_bytes(key)
- // `ciphertext || tag`, is a common way data is transmitted, so
- // demonstrate that.
- buf := make([]byte, pt_len + aead.TAG_SIZES[algo])
- defer delete(buf)
- ciphertext, tag := buf[:pt_len], buf[pt_len:]
- // Seal the AAD + Plaintext.
- iv := make([]byte, aead.IV_SIZES[algo])
- defer delete(iv)
- crypto.rand_bytes(iv) // Random IVs are safe with XChaCha20-Poly1305.
- aead.seal(algo, ciphertext, tag, key, iv, aad, plaintext)
- // Open the AAD + Ciphertext.
- opened_pt := buf[:pt_len]
- if ok := aead.open(algo, opened_pt, key, iv, aad, ciphertext, tag); !ok {
- panic("aead example: failed to open")
- }
- assert(bytes.equal(opened_pt, plaintext))
- }
- */
- package aead
|