1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
use crate::{ ecmult::ECMultContext, group::{Affine, Jacobian}, scalar::Scalar, }; use digest::{generic_array::GenericArray, Digest}; impl ECMultContext { pub fn ecdh_raw<D: Digest + Default>( &self, point: &Affine, scalar: &Scalar, ) -> Option<GenericArray<u8, D::OutputSize>> { let mut digest: D = Default::default(); let mut pt = *point; let s = *scalar; if s.is_zero() { return None; } let mut res = Jacobian::default(); self.ecmult_const(&mut res, &pt, &s); pt.set_gej(&res); pt.x.normalize(); pt.y.normalize(); let x = pt.x.b32(); let y = 0x02 | (if pt.y.is_odd() { 1 } else { 0 }); digest.update(&[y]); digest.update(&x); Some(digest.finalize_reset()) } }