Skip to content

Commit

Permalink
xaes-256-gcm: initial crate (#642)
Browse files Browse the repository at this point in the history
Specification: https://github.com/C2SP/C2SP/blob/main/XAES-256-GCM.md

Implementation by Sergio Benitez

---------

Co-authored-by: Sergio Benitez <[email protected]>
  • Loading branch information
tarcieri and SergioBenitez authored Oct 25, 2024
1 parent 37fc591 commit c7bc959
Show file tree
Hide file tree
Showing 13 changed files with 682 additions and 23 deletions.
69 changes: 69 additions & 0 deletions .github/workflows/xaes-256-gcm.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
name: xaes-256-gcm

on:
pull_request:
paths:
- ".github/workflows/xaes-256-gcm.yml"
- "xaes-256-gcm/**"
- "Cargo.*"
push:
branches: master

defaults:
run:
working-directory: xaes-256-gcm

env:
CARGO_INCREMENTAL: 0
RUSTFLAGS: "-Dwarnings"

jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
rust:
- 1.81.0 # MSRV
- stable
target:
- armv7a-none-eabi
- thumbv7em-none-eabi
- wasm32-unknown-unknown
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@master
with:
toolchain: ${{ matrix.rust }}
targets: ${{ matrix.target }}
- run: cargo build --no-default-features --release --target ${{ matrix.target }}

test:
runs-on: ubuntu-latest
strategy:
matrix:
include:
# 32-bit Linux
- target: i686-unknown-linux-gnu
rust: 1.81.0 # MSRV
deps: sudo apt update && sudo apt install gcc-multilib
- target: i686-unknown-linux-gnu
rust: stable
deps: sudo apt update && sudo apt install gcc-multilib

# 64-bit Linux
- target: x86_64-unknown-linux-gnu
rust: 1.81.0 # MSRV
- target: x86_64-unknown-linux-gnu
rust: stable
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@master
with:
toolchain: ${{ matrix.rust }}
targets: ${{ matrix.target }}
- run: ${{ matrix.deps }}
- run: cargo test --target ${{ matrix.target }} --release --no-default-features --lib
- run: cargo test --target ${{ matrix.target }} --release
- run: cargo test --target ${{ matrix.target }} --release --features stream,std
- run: cargo test --target ${{ matrix.target }} --release --all-features
- run: cargo build --target ${{ matrix.target }} --benches
57 changes: 41 additions & 16 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -10,5 +10,6 @@ members = [
"deoxys",
"eax",
"ocb3",
"xaes-256-gcm",
]
resolver = "2"
2 changes: 1 addition & 1 deletion aes-gcm/tests/aes128gcm.rs
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ use hex_literal::hex;
/// <https://csrc.nist.gov/Projects/cryptographic-algorithm-validation-program/CAVP-TESTING-BLOCK-CIPHER-MODES>
///
/// From: `gcmEncryptExtIV128.rsp`
const TEST_VECTORS: &[TestVector<[u8; 16]>] = &[
const TEST_VECTORS: &[TestVector<[u8; 16], [u8; 12]>] = &[
TestVector {
key: &hex!("11754cd72aec309bf52f7687212e8957"),
nonce: &hex!("3c819d9a9bed087615030b65"),
Expand Down
2 changes: 1 addition & 1 deletion aes-gcm/tests/aes256gcm.rs
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ use hex_literal::hex;
/// <https://csrc.nist.gov/Projects/cryptographic-algorithm-validation-program/CAVP-TESTING-BLOCK-CIPHER-MODES>
///
/// From: `gcmEncryptExtIV256.rsp`
const TEST_VECTORS: &[TestVector<[u8; 32]>] = &[
const TEST_VECTORS: &[TestVector<[u8; 32], [u8; 12]>] = &[
TestVector {
key: &hex!("b52c505a37d78eda5dd34f20c22540ea1b58963cf8e5bf8ffa85f9f2492505b4"),
nonce: &hex!("516c33929df5a3284ff463d7"),
Expand Down
13 changes: 8 additions & 5 deletions aes-gcm/tests/common/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@
/// Test vectors
#[derive(Debug)]
pub struct TestVector<K: 'static> {
pub struct TestVector<K: 'static, N: 'static> {
pub key: &'static K,
pub nonce: &'static [u8; 12],
pub nonce: &'static N,
pub aad: &'static [u8],
pub plaintext: &'static [u8],
pub ciphertext: &'static [u8],
Expand All @@ -27,8 +27,11 @@ macro_rules! tests {
let cipher = <$aead>::new(&key);
let ciphertext = cipher.encrypt(&nonce, payload).unwrap();
let (ct, tag) = ciphertext.split_at(ciphertext.len() - 16);
assert_eq!(vector.ciphertext, ct);
assert_eq!(vector.tag, tag);
assert_eq!(
vector.ciphertext, ct,
"ciphertext mismatch (expected != actual)"
);
assert_eq!(vector.tag, tag, "tag mismatch (expected != actual)");
}
}

Expand All @@ -48,7 +51,7 @@ macro_rules! tests {
let cipher = <$aead>::new(&key);
let plaintext = cipher.decrypt(&nonce, payload).unwrap();

assert_eq!(vector.plaintext, plaintext.as_slice());
assert_eq!(vector.plaintext, plaintext.as_slice(), "plaintext mismatch");
}
}

Expand Down
8 changes: 8 additions & 0 deletions xaes-256-gcm/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
# Changelog
All notable changes to this project will be documented in this file.

The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## 0.1.0 (TBD)
- Initial release
40 changes: 40 additions & 0 deletions xaes-256-gcm/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
[package]
name = "xaes-256-gcm"
version = "0.0.1-pre.0"
description = """
Pure Rust implementation of the XAES-256-GCM extended-nonce Authenticated
Encryption with Associated Data (AEAD).
"""
authors = ["RustCrypto Developers"]
edition = "2021"
license = "Apache-2.0 OR MIT"
readme = "README.md"
documentation = "https://docs.rs/xaes-256-gcm"
repository = "https://github.com/RustCrypto/AEADs"
keywords = ["aead", "aes", "xaes", "encryption", "extended-nonce"]
categories = ["cryptography", "no-std"]
rust-version = "1.81"

[dependencies]
aead = { version = "0.6.0-rc.0", default-features = false }
aes = "=0.9.0-pre.2"
aes-gcm = { version = "=0.11.0-pre.2", default-features = false, features = ["aes"] }
cipher = "=0.5.0-pre.7"

[dev-dependencies]
aead = { version = "0.6.0-rc.0", features = ["dev"], default-features = false }
hex-literal = "0.4"

[features]
default = ["alloc", "getrandom"]
std = ["aead/std", "aes-gcm/std", "cipher/std", "alloc"]
alloc = ["aead/alloc", "aes-gcm/alloc"]
arrayvec = ["aead/arrayvec", "aes-gcm/arrayvec"]
getrandom = ["aead/getrandom", "aes-gcm/getrandom", "rand_core"]
heapless = ["aead/heapless", "aes-gcm/heapless"]
rand_core = ["aead/rand_core", "aes-gcm/rand_core"]
stream = ["aead/stream", "aes-gcm/stream"]

[package.metadata.docs.rs]
all-features = true
rustdoc-args = ["--cfg", "docsrs"]
Loading

0 comments on commit c7bc959

Please sign in to comment.