Skip to content

Conversation

@baloo
Copy link
Member

@baloo baloo commented Sep 20, 2025

This is #1803 rebased and reworked with the new blobby APIs.

Helper utility to split the blob files:

use blobby::encode_blobs;
use std::{
    env,
    fs::File,
    io::{self, BufReader, BufWriter, Read, Write},
    path::PathBuf,
};

fn main() -> io::Result<()> {
    let args: Vec<String> = env::args().skip(1).collect();

    if args.is_empty() {
        println!(
            "Blobby test vector split utility.\n\
            Usage: split <input blb file>"
        );
        return Ok(());
    }

    let in_path: PathBuf = args[0].clone().into();
    let base = in_path.parent().unwrap();
    let name = in_path.file_name().unwrap().to_str().unwrap();
    let (base_name, ext) = name.rsplit_once(".").unwrap();

    let out_pass_path = base.to_path_buf().join(format!("{base_name}_pass.{ext}"));
    let out_fail_path = base.to_path_buf().join(format!("{base_name}_fail.{ext}"));
    println!("out_pass: {}", out_pass_path.display());
    println!("out_fail: {}", out_fail_path.display());

    let mut in_file = BufReader::new(File::open(in_path)?);
    let mut out_pass_file = BufWriter::new(File::create_new(out_pass_path)?);
    let mut out_fail_file = BufWriter::new(File::create_new(out_fail_path)?);

    let mut data = Vec::new();
    in_file.read_to_end(&mut data)?;
    let res = blobby::parse_into_vec(&data).map_err(|e| {
        io::Error::new(
            io::ErrorKind::InvalidData,
            format!("invalid blobby data: {e:?}"),
        )
    })?;

    let mut data_pass: Vec<&[u8]> = Vec::new();
    let mut data_fail: Vec<&[u8]> = Vec::new();
    for row in res.chunks(6) {
        let [key, nonce, aad, plaintext, ciphertext, pass] = row else {
            panic!("invariant failed")
        };
        if pass[0] == 1 {
            data_pass.extend_from_slice(&[key, nonce, aad, plaintext, ciphertext])
        } else if pass[0] == 0 {
            data_fail.extend_from_slice(&[key, nonce, aad, plaintext, ciphertext])
        } else {
            panic!("invalid data");
        }
    }

    let (data_pass, idx_len) = encode_blobs(&data_pass);
    println!("Pass len: {idx_len:?}");
    out_pass_file.write_all(&data_pass)?;

    let (data_fail, idx_len) = encode_blobs(&data_fail);
    println!("Fail len: {idx_len:?}");
    out_fail_file.write_all(&data_fail)?;

    Ok(())
}

Closes #1803

Helper utility to split the blob files
```
use blobby::encode_blobs;
use std::{
    env,
    fs::File,
    io::{self, BufReader, BufWriter, Read, Write},
    path::PathBuf,
};

fn main() -> io::Result<()> {
    let args: Vec<String> = env::args().skip(1).collect();

    if args.is_empty() {
        println!(
            "Blobby test vector split utility.\n\
            Usage: split <input blb file>"
        );
        return Ok(());
    }

    let in_path: PathBuf = args[0].clone().into();
    let base = in_path.parent().unwrap();
    let name = in_path.file_name().unwrap().to_str().unwrap();
    let (base_name, ext) = name.rsplit_once(".").unwrap();

    let out_pass_path = base.to_path_buf().join(format!("{base_name}_pass.{ext}"));
    let out_fail_path = base.to_path_buf().join(format!("{base_name}_fail.{ext}"));
    println!("out_pass: {}", out_pass_path.display());
    println!("out_fail: {}", out_fail_path.display());

    let mut in_file = BufReader::new(File::open(in_path)?);
    let mut out_pass_file = BufWriter::new(File::create_new(out_pass_path)?);
    let mut out_fail_file = BufWriter::new(File::create_new(out_fail_path)?);

    let mut data = Vec::new();
    in_file.read_to_end(&mut data)?;
    let res = blobby::parse_into_vec(&data).map_err(|e| {
        io::Error::new(
            io::ErrorKind::InvalidData,
            format!("invalid blobby data: {e:?}"),
        )
    })?;

    let mut data_pass: Vec<&[u8]> = Vec::new();
    let mut data_fail: Vec<&[u8]> = Vec::new();
    for row in res.chunks(6) {
        let [key, nonce, aad, plaintext, ciphertext, pass] = row else {
            panic!("invariant failed")
        };
        if pass[0] == 1 {
            data_pass.extend_from_slice(&[key, nonce, aad, plaintext, ciphertext])
        } else if pass[0] == 0 {
            data_fail.extend_from_slice(&[key, nonce, aad, plaintext, ciphertext])
        } else {
            panic!("invalid data");
        }
    }

    let (data_pass, idx_len) = encode_blobs(&data_pass);
    println!("Pass len: {idx_len:?}");
    out_pass_file.write_all(&data_pass)?;

    let (data_fail, idx_len) = encode_blobs(&data_fail);
    println!("Fail len: {idx_len:?}");
    out_fail_file.write_all(&data_fail)?;

    Ok(())
}
```
baloo added a commit to baloo/AEADs that referenced this pull request Sep 20, 2025
This uses the tool described in
RustCrypto/traits#2019 and this script:
```
find -name '*.blb' ! -path "./mgm/tests/data/*" -exec ./split-blobby {} \;  -delete
```

and a sed script to split most of the tests:
```
for p in $(rg -l aead::new_test); do
  sed -i '/aead::new_test!/ {
    h; 
    s/new_test!/new_pass_test!/; 
    s/,/_pass,/;
    s/",/_pass",/;
    p;

    g;
    s/new_test!/new_fail_test!/;
    s/,/_fail,/;
    s/",/_fail",/
  }' $p; 
done
```
baloo added a commit to baloo/AEADs that referenced this pull request Sep 20, 2025
This uses the tool described in
RustCrypto/traits#2019 and this script:
```
find -name '*.blb' ! -path "./mgm/tests/data/*" -exec ./split-blobby {} \;  -delete
```

and a sed script to split most of the tests:
```
for p in $(rg -l aead::new_test); do
  sed -i '/aead::new_test!/ {
    h; 
    s/new_test!/new_pass_test!/; 
    s/,/_pass,/;
    s/",/_pass",/;
    p;

    g;
    s/new_test!/new_fail_test!/;
    s/,/_fail,/;
    s/",/_fail",/
  }' $p; 
done
```
@newpavlov newpavlov merged commit aae99a0 into RustCrypto:master Sep 20, 2025
10 checks passed
baloo added a commit to baloo/AEADs that referenced this pull request Sep 20, 2025
This uses the tool described in
RustCrypto/traits#2019 and this script:
```
find -name '*.blb' ! -path "./mgm/tests/data/*" -exec ./split-blobby {} \;  -delete
```

and a sed script to split most of the tests:
```
for p in $(rg -l aead::new_test); do
  sed -i '/aead::new_test!/ {
    h; 
    s/new_test!/new_pass_test!/; 
    s/,/_pass,/;
    s/",/_pass",/;
    p;

    g;
    s/new_test!/new_fail_test!/;
    s/,/_fail,/;
    s/",/_fail",/
  }' $p; 
done
```
baloo added a commit to baloo/AEADs that referenced this pull request Sep 20, 2025
This uses the tool described in
RustCrypto/traits#2019 and this script:
```
find -name '*.blb' ! -path "./mgm/tests/data/*" -exec ./split-blobby {} \;  -delete
```

and a sed script to split most of the tests:
```
for p in $(rg -l aead::new_test); do
  sed -i '/aead::new_test!/ {
    h; 
    s/new_test!/new_pass_test!/; 
    s/,/_pass,/;
    s/",/_pass",/;
    p;

    g;
    s/new_test!/new_fail_test!/;
    s/,/_fail,/;
    s/",/_fail",/
  }' $p; 
done
```
@baloo baloo deleted the baloo/aead/split-test branch October 8, 2025 18:14
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants