ipcrypt2 0.9.1

A Rust library for format-preserving encryption of IP addresses. Supports both deterministic and non-deterministic encryption modes.
Documentation
use criterion::{criterion_group, criterion_main, Criterion};
use ipcrypt2::{Ipcrypt, IpcryptNdx, IpcryptPfx};
use std::hint::black_box;
use std::net::{IpAddr, Ipv4Addr, Ipv6Addr};

fn deterministic_encryption_benchmark(c: &mut Criterion) {
    let mut group = c.benchmark_group("Deterministic Encryption");
    let ipcrypt = Ipcrypt::new_random();
    let ipv4 = IpAddr::V4(Ipv4Addr::new(192, 168, 1, 1));
    let ipv6 = IpAddr::V6(Ipv6Addr::new(0x2001, 0xdb8, 0, 0, 0, 0, 0, 1));

    // String-based encryption
    group.bench_function("IPv4 String Encrypt", |b| {
        b.iter(|| {
            black_box(ipcrypt.encrypt_ip_str(black_box("192.168.1.1")).unwrap());
        })
    });
    group.bench_function("IPv4 String Decrypt", |b| {
        let encrypted = ipcrypt.encrypt_ip_str("192.168.1.1").unwrap();
        b.iter(|| {
            black_box(ipcrypt.decrypt_ip_str(black_box(&encrypted)).unwrap());
        })
    });
    group.bench_function("IPv6 String Encrypt", |b| {
        b.iter(|| {
            black_box(ipcrypt.encrypt_ip_str(black_box("2001:db8::1")).unwrap());
        })
    });
    group.bench_function("IPv6 String Decrypt", |b| {
        let encrypted = ipcrypt.encrypt_ip_str("2001:db8::1").unwrap();
        b.iter(|| {
            black_box(ipcrypt.decrypt_ip_str(black_box(&encrypted)).unwrap());
        })
    });

    // Raw IP address encryption
    group.bench_function("IPv4 Raw Encrypt", |b| {
        b.iter(|| {
            black_box(ipcrypt.encrypt_ipaddr(black_box(ipv4)).unwrap());
        })
    });
    group.bench_function("IPv4 Raw Decrypt", |b| {
        let encrypted = ipcrypt.encrypt_ipaddr(ipv4).unwrap();
        b.iter(|| {
            black_box(ipcrypt.decrypt_ipaddr(black_box(encrypted)).unwrap());
        })
    });
    group.bench_function("IPv6 Raw Encrypt", |b| {
        b.iter(|| {
            black_box(ipcrypt.encrypt_ipaddr(black_box(ipv6)).unwrap());
        })
    });
    group.bench_function("IPv6 Raw Decrypt", |b| {
        let encrypted = ipcrypt.encrypt_ipaddr(ipv6).unwrap();
        b.iter(|| {
            black_box(ipcrypt.decrypt_ipaddr(black_box(encrypted)).unwrap());
        })
    });
}

fn non_deterministic_encryption_benchmark(c: &mut Criterion) {
    let mut group = c.benchmark_group("Non-deterministic Encryption");
    let ipcrypt = Ipcrypt::new_random();
    let ipv4 = IpAddr::V4(Ipv4Addr::new(192, 168, 1, 1));
    let ipv6 = IpAddr::V6(Ipv6Addr::new(0x2001, 0xdb8, 0, 0, 0, 0, 0, 1));

    // String-based encryption
    group.bench_function("IPv4 String Encrypt", |b| {
        b.iter(|| {
            black_box(ipcrypt.nd_encrypt_ip_str(black_box("192.168.1.1")).unwrap());
        })
    });
    group.bench_function("IPv4 String Decrypt", |b| {
        let encrypted = ipcrypt.nd_encrypt_ip_str("192.168.1.1").unwrap();
        b.iter(|| {
            black_box(ipcrypt.nd_decrypt_ip_str(black_box(&encrypted)).unwrap());
        })
    });
    group.bench_function("IPv6 String Encrypt", |b| {
        b.iter(|| {
            black_box(ipcrypt.nd_encrypt_ip_str(black_box("2001:db8::1")).unwrap());
        })
    });
    group.bench_function("IPv6 String Decrypt", |b| {
        let encrypted = ipcrypt.nd_encrypt_ip_str("2001:db8::1").unwrap();
        b.iter(|| {
            black_box(ipcrypt.nd_decrypt_ip_str(black_box(&encrypted)).unwrap());
        })
    });

    // Raw IP address encryption
    group.bench_function("IPv4 Raw Encrypt", |b| {
        b.iter(|| {
            black_box(ipcrypt.nd_encrypt_ipaddr(black_box(ipv4)).unwrap());
        })
    });
    group.bench_function("IPv4 Raw Decrypt", |b| {
        let encrypted = ipcrypt.nd_encrypt_ipaddr(ipv4).unwrap();
        b.iter(|| {
            black_box(ipcrypt.nd_decrypt_ipaddr(black_box(encrypted)).unwrap());
        })
    });
    group.bench_function("IPv6 Raw Encrypt", |b| {
        b.iter(|| {
            black_box(ipcrypt.nd_encrypt_ipaddr(black_box(ipv6)).unwrap());
        })
    });
    group.bench_function("IPv6 Raw Decrypt", |b| {
        let encrypted = ipcrypt.nd_encrypt_ipaddr(ipv6).unwrap();
        b.iter(|| {
            black_box(ipcrypt.nd_decrypt_ipaddr(black_box(encrypted)).unwrap());
        })
    });
}

fn ndx_encryption_benchmark(c: &mut Criterion) {
    let mut group = c.benchmark_group("NDX Encryption");
    let ipcrypt_ndx = IpcryptNdx::new_random();
    let ipv4 = IpAddr::V4(Ipv4Addr::new(192, 168, 1, 1));
    let ipv6 = IpAddr::V6(Ipv6Addr::new(0x2001, 0xdb8, 0, 0, 0, 0, 0, 1));

    // String-based encryption
    group.bench_function("IPv4 String Encrypt", |b| {
        b.iter(|| {
            black_box(
                ipcrypt_ndx
                    .nd_encrypt_ip_str(black_box("192.168.1.1"))
                    .unwrap(),
            );
        })
    });
    group.bench_function("IPv4 String Decrypt", |b| {
        let encrypted = ipcrypt_ndx.nd_encrypt_ip_str("192.168.1.1").unwrap();
        b.iter(|| {
            black_box(
                ipcrypt_ndx
                    .nd_decrypt_ip_str(black_box(&encrypted))
                    .unwrap(),
            );
        })
    });
    group.bench_function("IPv6 String Encrypt", |b| {
        b.iter(|| {
            black_box(
                ipcrypt_ndx
                    .nd_encrypt_ip_str(black_box("2001:db8::1"))
                    .unwrap(),
            );
        })
    });
    group.bench_function("IPv6 String Decrypt", |b| {
        let encrypted = ipcrypt_ndx.nd_encrypt_ip_str("2001:db8::1").unwrap();
        b.iter(|| {
            black_box(
                ipcrypt_ndx
                    .nd_decrypt_ip_str(black_box(&encrypted))
                    .unwrap(),
            );
        })
    });

    // Raw IP address encryption
    group.bench_function("IPv4 Raw Encrypt", |b| {
        b.iter(|| {
            black_box(ipcrypt_ndx.nd_encrypt_ipaddr(black_box(ipv4)).unwrap());
        })
    });
    group.bench_function("IPv4 Raw Decrypt", |b| {
        let encrypted = ipcrypt_ndx.nd_encrypt_ipaddr(ipv4).unwrap();
        b.iter(|| {
            black_box(ipcrypt_ndx.nd_decrypt_ipaddr(black_box(encrypted)).unwrap());
        })
    });
    group.bench_function("IPv6 Raw Encrypt", |b| {
        b.iter(|| {
            black_box(ipcrypt_ndx.nd_encrypt_ipaddr(black_box(ipv6)).unwrap());
        })
    });
    group.bench_function("IPv6 Raw Decrypt", |b| {
        let encrypted = ipcrypt_ndx.nd_encrypt_ipaddr(ipv6).unwrap();
        b.iter(|| {
            black_box(ipcrypt_ndx.nd_decrypt_ipaddr(black_box(encrypted)).unwrap());
        })
    });
}

fn pfx_encryption_benchmark(c: &mut Criterion) {
    let mut group = c.benchmark_group("PFX Encryption");
    let ipcrypt_pfx = IpcryptPfx::new_random();
    let ipv4 = IpAddr::V4(Ipv4Addr::new(192, 168, 1, 1));
    let ipv6 = IpAddr::V6(Ipv6Addr::new(0x2001, 0xdb8, 0, 0, 0, 0, 0, 1));

    // String-based encryption
    group.bench_function("IPv4 String Encrypt", |b| {
        b.iter(|| {
            black_box(
                ipcrypt_pfx
                    .encrypt_ip_str(black_box("192.168.1.1"))
                    .unwrap(),
            );
        })
    });
    group.bench_function("IPv4 String Decrypt", |b| {
        let encrypted = ipcrypt_pfx.encrypt_ip_str("192.168.1.1").unwrap();
        b.iter(|| {
            black_box(ipcrypt_pfx.decrypt_ip_str(black_box(&encrypted)).unwrap());
        })
    });
    group.bench_function("IPv6 String Encrypt", |b| {
        b.iter(|| {
            black_box(
                ipcrypt_pfx
                    .encrypt_ip_str(black_box("2001:db8::1"))
                    .unwrap(),
            );
        })
    });
    group.bench_function("IPv6 String Decrypt", |b| {
        let encrypted = ipcrypt_pfx.encrypt_ip_str("2001:db8::1").unwrap();
        b.iter(|| {
            black_box(ipcrypt_pfx.decrypt_ip_str(black_box(&encrypted)).unwrap());
        })
    });

    // Raw IP address encryption
    group.bench_function("IPv4 Raw Encrypt", |b| {
        b.iter(|| {
            black_box(ipcrypt_pfx.encrypt_ipaddr(black_box(ipv4)).unwrap());
        })
    });
    group.bench_function("IPv4 Raw Decrypt", |b| {
        let encrypted = ipcrypt_pfx.encrypt_ipaddr(ipv4).unwrap();
        b.iter(|| {
            black_box(ipcrypt_pfx.decrypt_ipaddr(black_box(encrypted)).unwrap());
        })
    });
    group.bench_function("IPv6 Raw Encrypt", |b| {
        b.iter(|| {
            black_box(ipcrypt_pfx.encrypt_ipaddr(black_box(ipv6)).unwrap());
        })
    });
    group.bench_function("IPv6 Raw Decrypt", |b| {
        let encrypted = ipcrypt_pfx.encrypt_ipaddr(ipv6).unwrap();
        b.iter(|| {
            black_box(ipcrypt_pfx.decrypt_ipaddr(black_box(encrypted)).unwrap());
        })
    });
}

fn key_generation_benchmark(c: &mut Criterion) {
    let mut group = c.benchmark_group("Key Generation");

    group.bench_function("Ipcrypt", |b| {
        b.iter(|| {
            black_box(Ipcrypt::generate_key());
        })
    });

    group.bench_function("IpcryptNdx", |b| {
        b.iter(|| {
            black_box(IpcryptNdx::generate_key());
        })
    });

    group.bench_function("IpcryptPfx", |b| {
        b.iter(|| {
            black_box(IpcryptPfx::generate_key());
        })
    });
}

criterion_group!(
    benches,
    deterministic_encryption_benchmark,
    non_deterministic_encryption_benchmark,
    ndx_encryption_benchmark,
    pfx_encryption_benchmark,
    key_generation_benchmark
);
criterion_main!(benches);