#! [allow(non_snake_case)]
#! [allow(non_upper_case_globals)]
#! [allow(non_camel_case_types)]
#! [allow(unused_assignments)]
#! [allow(unreachable_patterns)]
use libcrux_macros as krml;
use crate ::fstar;
use crate ::lowstar;
const g25519: [u8; 32 ] = [
9 u8, 0 u8, 0 u8, 0 u8, 0 u8, 0 u8, 0 u8, 0 u8, 0 u8, 0 u8, 0 u8, 0 u8, 0 u8, 0 u8, 0 u8, 0 u8, 0 u8, 0 u8, 0 u8,
0 u8, 0 u8, 0 u8, 0 u8, 0 u8, 0 u8, 0 u8, 0 u8, 0 u8, 0 u8, 0 u8, 0 u8, 0 u8,
];
fn point_add_and_double(q: &[u64], p01_tmp1: &mut [u64], tmp2: &[fstar::uint128::uint128]) {
let nq: (&mut [u64], &mut [u64]) = p01_tmp1.split_at_mut(0 usize);
let nq_p1: (&mut [u64], &mut [u64]) = nq.1 .split_at_mut(10 usize);
let tmp1: (&mut [u64], &mut [u64]) = nq_p1.1 .split_at_mut(10 usize);
let x1: (&[u64], &[u64]) = q.split_at(0 usize);
let x2: (&[u64], &[u64]) = nq_p1.0 .split_at(0 usize);
let z2: (&[u64], &[u64]) = x2.1 .split_at(5 usize);
let dc: (&mut [u64], &mut [u64]) = tmp1.1 .split_at_mut(10 usize);
let ab: (&mut [u64], &mut [u64]) = dc.0 .split_at_mut(0 usize);
let a: (&mut [u64], &mut [u64]) = ab.1 .split_at_mut(0 usize);
let b: (&mut [u64], &mut [u64]) = a.1 .split_at_mut(5 usize);
crate ::bignum25519_51::fadd(b.0 , z2.0 , z2.1 );
crate ::bignum25519_51::fsub(b.1 , z2.0 , z2.1 );
let ab1: (&mut [u64], &mut [u64]) = ab.1 .split_at_mut(0 usize);
let x3: (&mut [u64], &mut [u64]) = tmp1.0 .split_at_mut(0 usize);
let z31: (&mut [u64], &mut [u64]) = x3.1 .split_at_mut(5 usize);
let d: (&mut [u64], &mut [u64]) = dc.1 .split_at_mut(0 usize);
let c: (&mut [u64], &mut [u64]) = d.1 .split_at_mut(5 usize);
crate ::bignum25519_51::fadd(c.1 , z31.0 , z31.1 );
crate ::bignum25519_51::fsub(c.0 , z31.0 , z31.1 );
let mut f1_copy: [u64; 10 ] = [0 u64; 10 usize];
((&mut f1_copy)[0 usize..10 usize]).copy_from_slice(&dc.e='color: green'>1 [0 usize..10 usize]);
crate ::bignum25519_51::fmul2(dc.1 , &f1_copy, ab1.1 , tmp2);
let d1: (&[u64], &[u64]) = dc.1 .split_at(0 usize);
let c1: (&[u64], &[u64]) = d1.1 .split_at(5 usize);
crate ::bignum25519_51::fadd(z31.0 , c1.0 , c1.1 );
crate ::bignum25519_51::fsub(z31.1 , c1.0 , c1.1 );
let ab2: (&mut [u64], &mut [u64]) = ab1.1 .split_at_mut(0 usize);
let dc1: (&mut [u64], &mut [u64]) = dc.1 .split_at_mut(0 usize);
crate ::bignum25519_51::fsqr2(dc1.1 , ab2.1 , tmp2);
let mut f1_copy0: [u64; 10 ] = [0 u64; 10 usize];
((&mut f1_copy0)[0 usize..10 usize]).copy_from_slice(&tmp1.le='color: green'>0 [0 usize..10 usize]);
crate ::bignum25519_51::fsqr2(tmp1.0 , &f1_copy0, tmp2);
let a1: (&mut [u64], &mut [u64]) = ab2.1 .split_at_mut(0 usize);
let b1: (&mut [u64], &mut [u64]) = a1.1 .split_at_mut(5 usize);
let d0: (&mut [u64], &mut [u64]) = dc1.1 .split_at_mut(0 usize);
let c0: (&mut [u64], &mut [u64]) = d0.1 .split_at_mut(5 usize);
b1.0 [0 usize] = c0.1 [0 usize];
b1.0 [1 usize] = c0.1 [1 usize];
b1.0 [2 usize] = c0.1 [2 usize];
b1.0 [3 usize] = c0.1 [3 usize];
b1.0 [4 usize] = c0.1 [4 usize];
let mut f2_copy: [u64; 5 ] = [0 u64; 5 usize];
((&mut f2_copy)[0 usize..5 usize]).copy_from_slice(&c0.='color: green'>1 [0 usize..5 usize]);
crate ::bignum25519_51::fsub(c0.1 , c0.0 , &f2_copy);
crate ::bignum25519_51::fmul1(b1.1 , c0.1 , 121665 u64);
let mut f1_copy1: [u64; 5 ] = [0 u64; 5 usize];
((&mut f1_copy1)[0 usize..5 usize]).copy_from_slice(&b1.e='color: green'>1 [0 usize..5 usize]);
crate ::bignum25519_51::fadd(b1.1 , &f1_copy1, c0.0 );
let ab3: (&[u64], &[u64]) = ab2.1 .split_at(0 usize);
let dc2: (&[u64], &[u64]) = dc1.1 .split_at(0 usize);
crate ::bignum25519_51::fmul2(nq_p1.0 , dc2.1 , ab3.1 , tmp2);
let z310: (&mut [u64], &mut [u64]) = tmp1.0 .split_at_mut(5 usize);
let mut f1_copy2: [u64; 5 ] = [0 u64; 5 usize];
((&mut f1_copy2)[0 usize..5 usize]).copy_from_slice(&z310.e='color: green'>1 [0 usize..5 usize]);
crate ::bignum25519_51::fmul(z310.1 , &f1_copy2, x1.1 , tmp2)
}
fn point_double(nq: &mut [u64], tmp1: &mut [u64], tmp2: &[fstar::uint128::uint128]) {
let x2: (&[u64], &[u64]) = nq.split_at(0 usize);
let z2: (&[u64], &[u64]) = x2.1 .split_at(5 usize);
let ab: (&mut [u64], &mut [u64]) = tmp1.split_at_mut(0 usize);
let dc: (&mut [u64], &mut [u64]) = ab.1 .split_at_mut(10 usize);
let a: (&mut [u64], &mut [u64]) = dc.0 .split_at_mut(0 usize);
let b: (&mut [u64], &mut [u64]) = a.1 .split_at_mut(5 usize);
crate ::bignum25519_51::fadd(b.0 , z2.0 , z2.1 );
crate ::bignum25519_51::fsub(b.1 , z2.0 , z2.1 );
crate ::bignum25519_51::fsqr2(dc.1 , dc.0 , tmp2);
let d: (&mut [u64], &mut [u64]) = dc.1 .split_at_mut(0 usize);
let c: (&mut [u64], &mut [u64]) = d.1 .split_at_mut(5 usize);
let a1: (&mut [u64], &mut [u64]) = dc.0 .split_at_mut(0 usize);
let b1: (&mut [u64], &mut [u64]) = a1.1 .split_at_mut(5 usize);
b1.0 [0 usize] = c.1 [0 usize];
b1.0 [1 usize] = c.1 [1 usize];
b1.0 [2 usize] = c.1 [2 usize];
b1.0 [3 usize] = c.1 [3 usize];
b1.0 [4 usize] = c.1 [4 usize];
let mut f2_copy: [u64; 5 ] = [0 u64; 5 usize];
((&mut f2_copy)[0 usize..5 usize]).copy_from_slice(&c.='color: green'>1 [0 usize..5 usize]);
crate ::bignum25519_51::fsub(c.1 , c.0 , &f2_copy);
crate ::bignum25519_51::fmul1(b1.1 , c.1 , 121665 u64);
let mut f1_copy: [u64; 5 ] = [0 u64; 5 usize];
((&mut f1_copy)[0 usize..5 usize]).copy_from_slice(&b1.='color: green'>1 [0 usize..5 usize]);
crate ::bignum25519_51::fadd(b1.1 , &f1_copy, c.0 );
let ab1: (&[u64], &[u64]) = dc.0 .split_at(0 usize);
let dc1: (&[u64], &[u64]) = dc.1 .split_at(0 usize);
crate ::bignum25519_51::fmul2(nq, dc1.1 , ab1.1 , tmp2)
}
fn montgomery_ladder(out: &mut [u64], key: &[u8], init: &[u64]) {
let tmp2: [fstar::uint128::uint128; 10 ] = [fstar::uint128::uint64_to_uint128(0 u64); 10 usize];
let mut p01_tmp1_swap: [u64; 41 ] = [0 u64; 41 usize];
let p01: (&mut [u64], &mut [u64]) = p01_tmp1_swap.split_at_mut(0 usize);
let p03: (&mut [u64], &mut [u64]) = p01.1 .split_at_mut(0 usize);
let p11: (&mut [u64], &mut [u64]) = p03.1 .split_at_mut(10 usize);
(p11.1 [0 usize..10 usize]).copy_from_slice(&init[0 usize..10 usize]);
let x0: (&mut [u64], &mut [u64]) = p11.0 .split_at_mut(0 usize);
let z0: (&mut [u64], &mut [u64]) = x0.1 .split_at_mut(5 usize);
z0.0 [0 usize] = 1 u64;
z0.0 [1 usize] = 0 u64;
z0.0 [2 usize] = 0 u64;
z0.0 [3 usize] = 0 u64;
z0.0 [4 usize] = 0 u64;
z0.1 [0 usize] = 0 u64;
z0.1 [1 usize] = 0 u64;
z0.1 [2 usize] = 0 u64;
z0.1 [3 usize] = 0 u64;
z0.1 [4 usize] = 0 u64;
let swap: (&mut [u64], &mut [u64]) = p01.1 .split_at_mut(40 usize);
let p01_tmp1: (&mut [u64], &mut [u64]) = swap.0 .split_at_mut(0 usize);
let nq: (&mut [u64], &mut [u64]) = p01_tmp1.1 .split_at_mut(0 usize);
let nq_p1: (&mut [u64], &mut [u64]) = nq.1 .split_at_mut(10 usize);
crate ::bignum25519_51::cswap2(1 u64, nq_p1.0 , nq_p1.1 );
let p01_tmp11: (&mut [u64], &mut [u64]) = p01_tmp1.1 .split_at_mut(0 usize);
crate ::curve25519_51::point_add_and_double(init, p01_tmp11.1 , &tmp2);
swap.1 [0 usize] = 1 u64;
for i in 0 u32..251 u32 {
let p01_tmp12: (&mut [u64], &mut [u64]) = p01_tmp11.1 .split_at_mut(0 usize);
let swap1: (&mut [u64], &mut [u64]) = swap.1 .split_at_mut(0 usize);
let nq1: (&mut [u64], &mut [u64]) = p01_tmp12.1 .split_at_mut(0 usize);
let nq_p11: (&mut [u64], &mut [u64]) = nq1.1 .split_at_mut(10 usize);
let bit: u64 = ((key[253 u32.wrapping_sub(i).wrapping_div(8 u32) as usize])
.wrapping_shr(253 u32.wrapping_sub(i).wrapping_rem(8 u32))
& 1 u8) as u64;
let sw: u64 = swap1.1 [0 usize] ^ bit;
crate ::bignum25519_51::cswap2(sw, nq_p11.0 , nq_p11.1 );
crate ::curve25519_51::point_add_and_double(init, p01_tmp12.1 , &tmp2);
swap1.1 [0 usize] = bit
}
let sw: u64 = swap.1 [0 usize];
let p01_tmp12: (&mut [u64], &mut [u64]) = p01_tmp11.1 .split_at_mut(0 usize);
let nq1: (&mut [u64], &mut [u64]) = p01_tmp12.1 .split_at_mut(0 usize);
let nq_p11: (&mut [u64], &mut [u64]) = nq1.1 .split_at_mut(10 usize);
crate ::bignum25519_51::cswap2(sw, nq_p11.0 , nq_p11.1 );
let p01_tmp10: (&mut [u64], &mut [u64]) = p01_tmp12.1 .split_at_mut(0 usize);
let nq0: (&mut [u64], &mut [u64]) = p01_tmp10.1 .split_at_mut(0 usize);
let tmp1: (&mut [u64], &mut [u64]) = nq0.1 .split_at_mut(20 usize);
crate ::curve25519_51::point_double(tmp1.0 , tmp1.1 , &tmp2);
crate ::curve25519_51::point_double(tmp1.0 , tmp1.1 , &tmp2);
crate ::curve25519_51::point_double(tmp1.0 , tmp1.1 , &tmp2);
let p010: (&[u64], &[u64]) = p01_tmp10.1 .split_at(0 usize);
(out[0 usize..10 usize]).copy_from_slice(&p010.1 [0 usize..10 usize])
}
pub fn fsquare_times(o: &mut [u64], inp: &[u64], tmp: &[fstar::uint128::uint128], n: u32) {
crate ::bignum25519_51::fsqr(o, inp, tmp);
for _i in 0 u32..n.wrapping_sub(1 u32) {
let mut f1_copy: [u64; 5 ] = [0 u64; 5 usize];
((&mut f1_copy)[0 usize..5 usize]).copy_from_slice(&o[='color: green'>0 usize..5 usize]);
crate ::bignum25519_51::fsqr(o, &f1_copy, tmp)
}
}
pub fn finv(o: &mut [u64], i: &[u64], tmp: &[fstar::uint128::uint128]) {
let mut t1: [u64; 20 ] = [0 u64; 20 usize];
let a1: (&mut [u64], &mut [u64]) = t1.split_at_mut(0 usize);
let b1: (&mut [u64], &mut [u64]) = a1.1 .split_at_mut(5 usize);
let t01: (&mut [u64], &mut [u64]) = b1.1 .split_at_mut(10 usize);
let tmp1: (&[fstar::uint128::uint128], &[fstar::uint128::uint128]) = tmp.split_at(0 usize);
crate ::curve25519_51::fsquare_times(b1.0 , i, tmp1.1 , 1 u32);
crate ::curve25519_51::fsquare_times(t01.1 , b1.0 , tmp1.1 , 2 u32);
crate ::bignum25519_51::fmul(t01.0 , t01.1 , i, tmp);
let mut f2_copy: [u64; 5 ] = [0 u64; 5 usize];
((&mut f2_copy)[0 usize..5 usize]).copy_from_slice(&b1.='color: green'>0 [0 usize..5 usize]);
crate ::bignum25519_51::fmul(b1.0 , t01.0 , &f2_copy, tmp);
let tmp11: (&[fstar::uint128::uint128], &[fstar::uint128::uint128]) = tmp.split_at(0 usize);
crate ::curve25519_51::fsquare_times(t01.1 , b1.0 , tmp11.1 , 1 u32);
let mut f2_copy0: [u64; 5 ] = [0 u64; 5 usize];
((&mut f2_copy0)[0 usize..5 usize]).copy_from_slice(&t01.e='color: green'>0 [0 usize..5 usize]);
crate ::bignum25519_51::fmul(t01.0 , t01.1 , &f2_copy0, tmp);
let tmp12: (&[fstar::uint128::uint128], &[fstar::uint128::uint128]) = tmp.split_at(0 usize);
crate ::curve25519_51::fsquare_times(t01.1 , t01.0 , tmp12.1 , 5 u32);
let mut f2_copy1: [u64; 5 ] = [0 u64; 5 usize];
((&mut f2_copy1)[0 usize..5 usize]).copy_from_slice(&t01.e='color: green'>0 [0 usize..5 usize]);
crate ::bignum25519_51::fmul(t01.0 , t01.1 , &f2_copy1, tmp);
let b10: (&mut [u64], &mut [u64]) = t01.0 .split_at_mut(0 usize);
let c1: (&mut [u64], &mut [u64]) = b10.1 .split_at_mut(5 usize);
let t010: (&mut [u64], &mut [u64]) = t01.1 .split_at_mut(0 usize);
let tmp10: (&[fstar::uint128::uint128], &[fstar::uint128::uint128]) = tmp.split_at(0 usize);
crate ::curve25519_51::fsquare_times(t010.1 , c1.0 , tmp10.1 , 10 u32);
crate ::bignum25519_51::fmul(c1.1 , t010.1 , c1.0 , tmp);
let tmp110: (&[fstar::uint128::uint128], &[fstar::uint128::uint128]) = tmp.split_at(0 usize);
crate ::curve25519_51::fsquare_times(t010.1 , c1.1 , tmp110.1 , 20 u32);
let mut f1_copy: [u64; 5 ] = [0 u64; 5 usize];
((&mut f1_copy)[0 usize..5 usize]).copy_from_slice(&t010.='color: green'>1 [0 usize..5 usize]);
crate ::bignum25519_51::fmul(t010.1 , &f1_copy, c1.1 , tmp);
let tmp120: (&[fstar::uint128::uint128], &[fstar::uint128::uint128]) = tmp.split_at(0 usize);
let mut i_copy: [u64; 5 ] = [0 u64; 5 usize];
((&mut i_copy)[0 usize..5 usize]).copy_from_slice(&t010.'color: green'>1 [0 usize..5 usize]);
crate ::curve25519_51::fsquare_times(t010.1 , &i_copy, tmp120.1 , 10 u32);
let mut f2_copy2: [u64; 5 ] = [0 u64; 5 usize];
((&mut f2_copy2)[0 usize..5 usize]).copy_from_slice(&c1.e='color: green'>0 [0 usize..5 usize]);
crate ::bignum25519_51::fmul(c1.0 , t010.1 , &f2_copy2, tmp);
let tmp13: (&[fstar::uint128::uint128], &[fstar::uint128::uint128]) = tmp.split_at(0 usize);
crate ::curve25519_51::fsquare_times(t010.1 , c1.0 , tmp13.1 , 50 u32);
crate ::bignum25519_51::fmul(c1.1 , t010.1 , c1.0 , tmp);
let b11: (&[u64], &[u64]) = c1.0 .split_at(0 usize);
let c10: (&[u64], &[u64]) = c1.1 .split_at(0 usize);
let t011: (&mut [u64], &mut [u64]) = t010.1 .split_at_mut(0 usize);
let tmp14: (&[fstar::uint128::uint128], &[fstar::uint128::uint128]) = tmp.split_at(0 usize);
crate ::curve25519_51::fsquare_times(t011.1 , c10.1 , tmp14.1 , 100 u32);
let mut f1_copy0: [u64; 5 ] = [0 u64; 5 usize];
((&mut f1_copy0)[0 usize..5 usize]).copy_from_slice(&t011.e='color: green'>1 [0 usize..5 usize]);
crate ::bignum25519_51::fmul(t011.1 , &f1_copy0, c10.1 , tmp);
let tmp111: (&[fstar::uint128::uint128], &[fstar::uint128::uint128]) = tmp.split_at(0 usize);
let mut i_copy0: [u64; 5 ] = [0 u64; 5 usize];
((&mut i_copy0)[0 usize..5 usize]).copy_from_slice(&t011.='color: green'>1 [0 usize..5 usize]);
crate ::curve25519_51::fsquare_times(t011.1 , &i_copy0, tmp111.1 , 50 u32);
let mut f1_copy1: [u64; 5 ] = [0 u64; 5 usize];
((&mut f1_copy1)[0 usize..5 usize]).copy_from_slice(&t011.e='color: green'>1 [0 usize..5 usize]);
crate ::bignum25519_51::fmul(t011.1 , &f1_copy1, b11.1 , tmp);
let tmp121: (&[fstar::uint128::uint128], &[fstar::uint128::uint128]) = tmp.split_at(0 usize);
let mut i_copy1: [u64; 5 ] = [0 u64; 5 usize];
((&mut i_copy1)[0 usize..5 usize]).copy_from_slice(&t011.='color: green'>1 [0 usize..5 usize]);
crate ::curve25519_51::fsquare_times(t011.1 , &i_copy1, tmp121.1 , 5 u32);
let a: (&[u64], &[u64]) = b1.0 .split_at(0 usize);
let t0: (&[u64], &[u64]) = t011.1 .split_at(0 usize);
crate ::bignum25519_51::fmul(o, t0.1 , a.1 , tmp)
}
fn encode_point(o: &mut [u8], i: &[u64]) {
let x: (&[u64], &[u64]) = i.split_at(0 usize);
let z: (&[u64], &[u64]) = x.1 .split_at(5 usize);
let mut tmp: [u64; 5 ] = [0 u64; 5 usize];
let mut u64s: [u64; 4 ] = [0 u64; 4 usize];
let tmp_w: [fstar::uint128::uint128; 10 ] = [fstar::uint128::uint64_to_uint128(0 u64); 10 usize];
crate ::curve25519_51::finv(&mut tmp, z.1 , &tmp_w);
let mut f1_copy: [u64; 5 ] = [0 u64; 5 usize];
((&mut f1_copy)[0 usize..5 usize]).copy_from_slice(&(&tmp)[0 usize..5 usize]);
crate ::bignum25519_51::fmul(&mut tmp, &f1_copy, z.0 , &tmp_w);
crate ::bignum25519_51::store_felem(&mut u64s, &tmp);
krml::unroll_for!(
4 ,
"i0" ,
0 u32,
1 u32,
lowstar::endianness::store64_le(
&mut o[i0.wrapping_mul(8 u32) as usize..],
(&u64s)[i0 as usize]
)
)
}
/**
Compute the scalar multiple of a point .
@ param out Pointer to 32 bytes of memory , allocated by the caller , where the resulting point is written to .
@ param priv Pointer to 32 bytes of memory where the secret / private key is read from .
@ param pub Pointer to 32 bytes of memory where the public point is read from .
*/
pub fn scalarmult(out: &mut [u8], r#priv : &[u8], r#pub : &[u8]) {
let mut init: [u64; 10 ] = [0 u64; 10 usize];
let mut init_copy: [u64; 10 ] = [0 u64; 10 usize];
let mut tmp: [u64; 4 ] = [0 u64; 4 usize];
krml::unroll_for!(4 , "i" , 0 u32, 1 u32, {
let bj: (&[u8], &[u8]) = r#pub .split_at(i.wrapping_mul(8 u32) as usize);
let u: u64 = lowstar::endianness::load64_le(bj.1 );
let r: u64 = u;
let x: u64 = r;
let os: (&mut [u64], &mut [u64]) = tmp.split_at_mut(0 usize);
os.1 [i as usize] = x
});
let tmp3: u64 = (&tmp)[3 usize];
(&mut tmp)[3 usize] = tmp3 & 0 x7fffffffffffffffu64;
let x: (&mut [u64], &mut [u64]) = init.split_at_mut(0 usize);
let z: (&mut [u64], &mut [u64]) = x.1 .split_at_mut(5 usize);
z.1 [0 usize] = 1 u64;
z.1 [1 usize] = 0 u64;
z.1 [2 usize] = 0 u64;
z.1 [3 usize] = 0 u64;
z.1 [4 usize] = 0 u64;
let f0l: u64 = (&tmp)[0 usize] & 0 x7ffffffffffffu64;
let f0h: u64 = ((&tmp)[0 usize]).wrapping_shr(51 u32);
let f1l: u64 = ((&tmp)[1 usize] & 0 x3fffffffffu64).wrapping_shl(13 u32);
let f1h: u64 = ((&tmp)[1 usize]).wrapping_shr(38 u32);
let f2l: u64 = ((&tmp)[2 usize] & 0 x1ffffffu64).wrapping_shl(26 u32);
let f2h: u64 = ((&tmp)[2 usize]).wrapping_shr(25 u32);
let f3l: u64 = ((&tmp)[3 usize] & 0 xfffu64).wrapping_shl(39 u32);
let f3h: u64 = ((&tmp)[3 usize]).wrapping_shr(12 u32);
z.0 [0 usize] = f0l;
z.0 [1 usize] = f0h | f1l;
z.0 [2 usize] = f1h | f2l;
z.0 [3 usize] = f2h | f3l;
z.0 [4 usize] = f3h;
((&mut init_copy)[0 usize..10 usize]).copy_from_slice(&(&init)[0 usize..10 usize]);
crate ::curve25519_51::montgomery_ladder(&mut init, r#priv , &init_copy);
crate ::curve25519_51::encode_point(out, &init)
}
/**
Calculate a public point from a secret / private key .
This computes a scalar multiplication of the secret / private key with the curve ' s basepoint .
@ param pub Pointer to 32 bytes of memory , allocated by the caller , where the resulting point is written to .
@ param priv Pointer to 32 bytes of memory where the secret / private key is read from .
*/
pub fn secret_to_public(r#pub : &mut [u8], r#priv : &[u8]) {
let mut basepoint: [u8; 32 ] = [0 u8; 32 usize];
krml::unroll_for!(32 , "i" , 0 u32, 1 u32, {
let x: u8 = (&crate ::curve25519_51::g25519)[i as usize];
let os: (&mut [u8], &mut [u8]) = basepoint.split_at_mut(0 usize);
os.1 [i as usize] = x
});
crate ::curve25519_51::scalarmult(r#pub , r#priv , &basepoint)
}
/**
Execute the diffie - hellmann key exchange .
@ param out Pointer to 32 bytes of memory , allocated by the caller , where the resulting point is written to .
@ param priv Pointer to 32 bytes of memory where * * our * * secret / private key is read from .
@ param pub Pointer to 32 bytes of memory where * * their * * public point is read from .
*/
pub fn ecdh(out: &mut [u8], r#priv : &[u8], r#pub : &[u8]) -> bool {
let zeros: [u8; 32 ] = [0 u8; 32 usize];
crate ::curve25519_51::scalarmult(out, r#priv , r#pub );
let mut res: [u8; 1 ] = [255 u8; 1 usize];
krml::unroll_for!(32 , "i" , 0 u32, 1 u32, {
let uu____0: u8 = fstar::uint8::eq_mask(out[i as usize], (&zeros)[i as usize]);
(&mut res)[0 usize] = uu____0 & (&res)[0 usize]
});
let z: u8 = (&res)[0 usize];
let r: bool = z == 255 u8;
!r
}
Messung V0.5 in Prozent C=86 H=100 G=93
¤ Dauer der Verarbeitung: 0.10 Sekunden
(vorverarbeitet am 2026-08-25)
¤
*© Formatika GbR, Deutschland