hacl-star 0.0.13

HACL*, a formally verified cryptographic library for Rust (binding to hacl-c).
extern crate rand;
extern crate hacl_star;

use hacl_star::curve25519;


const SCALAR1: [u8; 32] = [0xa5, 0x46, 0xe3, 0x6b, 0xf0, 0x52, 0x7c, 0x9d, 0x3b, 0x16, 0x15, 0x4b, 0x82, 0x46, 0x5e, 0xdd, 0x62, 0x14, 0x4c, 0x0a, 0xc1, 0xfc, 0x5a, 0x18, 0x50, 0x6a, 0x22, 0x44, 0xba, 0x44, 0x9a, 0xc4];
const SCALAR2: [u8; 32] = [0x4b, 0x66, 0xe9, 0xd4, 0xd1, 0xb4, 0x67, 0x3c, 0x5a, 0xd2, 0x26, 0x91, 0x95, 0x7d, 0x6a, 0xf5, 0xc1, 0x1b, 0x64, 0x21, 0xe0, 0xea, 0x01, 0xd4, 0x2c, 0xa4, 0x16, 0x9e, 0x79, 0x18, 0xba, 0x0d];
const INPUT1: [u8; 32] = [0xe6, 0xdb, 0x68, 0x67, 0x58, 0x30, 0x30, 0xdb, 0x35, 0x94, 0xc1, 0xa4, 0x24, 0xb1, 0x5f, 0x7c, 0x72, 0x66, 0x24, 0xec, 0x26, 0xb3, 0x35, 0x3b, 0x10, 0xa9, 0x03, 0xa6, 0xd0, 0xab, 0x1c, 0x4c];
const INPUT2: [u8; 32] = [0xe5, 0x21, 0x0f, 0x12, 0x78, 0x68, 0x11, 0xd3, 0xf4, 0xb7, 0x95, 0x9d, 0x05, 0x38, 0xae, 0x2c, 0x31, 0xdb, 0xe7, 0x10, 0x6f, 0xc0, 0x3c, 0x3e, 0xfc, 0x4c, 0xd5, 0x49, 0xc7, 0x15, 0xa4, 0x93];
const EXPECTED1: [u8; 32] = [0xc3, 0xda, 0x55, 0x37, 0x9d, 0xe9, 0xc6, 0x90, 0x8e, 0x94, 0xea, 0x4d, 0xf2, 0x8d, 0x08, 0x4f, 0x32, 0xec, 0xcf, 0x03, 0x49, 0x1c, 0x71, 0xf7, 0x54, 0xb4, 0x07, 0x55, 0x77, 0xa2, 0x85, 0x52];
const EXPECTED2: [u8; 32] = [0x95, 0xcb, 0xde, 0x94, 0x76, 0xe8, 0x90, 0x7d, 0x7a, 0xad, 0xe4, 0x5c, 0xb4, 0xb8, 0x73, 0xf8, 0x8b, 0x59, 0x5a, 0x68, 0x79, 0x9f, 0xa1, 0x52, 0xe6, 0xf8, 0xf7, 0x64, 0x7a, 0xac, 0x79, 0x57];

#[test]
fn test_curve25519() {
    let mut output = [0; 32];

    curve25519::scalarmult(&mut output, &SCALAR1, &INPUT1);
    assert_eq!(output, EXPECTED1);

    curve25519::scalarmult(&mut output, &SCALAR2, &INPUT2);
    assert_eq!(output, EXPECTED2);
}

#[test]
fn test_curve25519_kx() {
    use rand::OsRng;
    use curve25519::*;

    let (mut sk1, mut pk1) = (None, None);
    let (mut sk2, mut pk2) = (None, None);
    let (mut out1, mut out2) = ([0; 32], [0; 32]);

    keypair(OsRng::new().unwrap(), &mut sk1, &mut pk1);
    keypair(OsRng::new().unwrap(), &mut sk2, &mut pk2);

    sk1.unwrap().exchange(&pk2.unwrap(), &mut out1);
    sk2.unwrap().exchange(&pk1.unwrap(), &mut out2);

    assert_eq!(out1, out2);
}