Skip to content

Commit

Permalink
attempt to use k256
Browse files Browse the repository at this point in the history
  • Loading branch information
triska committed Jul 29, 2022
1 parent cb5e724 commit 98f1efd
Showing 1 changed file with 26 additions and 37 deletions.
63 changes: 26 additions & 37 deletions src/machine/system_calls.rs
Original file line number Diff line number Diff line change
Expand Up @@ -67,9 +67,7 @@ use ring::{
use ripemd160::{Digest, Ripemd160};
use sha3::{Sha3_224, Sha3_256, Sha3_384, Sha3_512};

use openssl::bn::{BigNum, BigNumContext};
use openssl::ec::{EcGroup, EcPoint};
use openssl::nid::Nid;
use k256::{Scalar, AffinePoint};

use sodiumoxide::crypto::scalarmult::curve25519::*;

Expand Down Expand Up @@ -6117,54 +6115,45 @@ impl Machine {
pub(crate) fn crypto_curve_scalar_mult(&mut self) {
let curve = cell_as_atom!(self.machine_st.registers[1]);

let curve_id = match curve {
atom!("secp112r1") => Nid::SECP112R1,
atom!("secp256k1") => Nid::SECP256K1,
match curve {
atom!("secp256k1") => { }
_ => {
unreachable!()
}
};

let scalar = self.machine_st.store(self.machine_st.deref(self.machine_st.registers[2]));
let stub_gen = || functor_stub(atom!("crypto_curve_scalar_mult"), 5);

let scalar = match Number::try_from(scalar) {
Ok(Number::Fixnum(n)) => Integer::from(n.get_num()),
Ok(Number::Integer(n)) => Integer::from(&*n),
_ => {
unreachable!()
}
};
let sbytes = self.machine_st.integers_to_bytevec(self.machine_st.registers[2], stub_gen);
let s = FieldElement::from_bytes(sbytes).unwrap();

let stub_gen = || functor_stub(atom!("crypto_curve_scalar_mult"), 5);
let qbytes = self.machine_st.integers_to_bytevec(self.machine_st.registers[3], stub_gen);

let mut bnctx = BigNumContext::new().unwrap();
let group = EcGroup::from_curve_name(curve_id).unwrap();
let mut point = EcPoint::from_bytes(&group, &qbytes, &mut bnctx).unwrap();
let scalar_bn = BigNum::from_dec_str(&scalar.to_string()).unwrap();
let mut result = EcPoint::new(&group).unwrap();
let mut q = FieldElement::from_bytes(&qbytes).unwrap();
let result = q.mul(s);

result.mul(&group, &mut point, &scalar_bn, &mut bnctx).ok();
let enc = result.to_encoded_point(false);
let x = enc.x().unwrap();
let y = enc.y().unwrap();

let mut rx = BigNum::new().unwrap();
let mut ry = BigNum::new().unwrap();
let sx = {
let buffer = String::from_iter(x.as_ref().iter().map(|b| *b as char));

result
.affine_coordinates_gfp(&group, &mut rx, &mut ry, &mut bnctx)
.ok();

let sx = rx.to_dec_str().unwrap();
let sx = if sx.len() == 0 {
empty_list_as_cell!()
} else {
atom_as_cstr_cell!(self.machine_st.atom_tbl.build_with(&sx))
if buffer.len() == 0 {
empty_list_as_cell!()
} else {
atom_as_cstr_cell!(self.machine_st.atom_tbl.build_with(&buffer))
}
};

let sy = ry.to_dec_str().unwrap();
let sy = if sy.len() == 0 {
empty_list_as_cell!()
} else {
atom_as_cstr_cell!(self.machine_st.atom_tbl.build_with(&sy))
let sy = {
let buffer = String::from_iter(y.as_ref().iter().map(|b| *b as char));

if buffer.len() == 0 {
empty_list_as_cell!()
} else {
atom_as_cstr_cell!(self.machine_st.atom_tbl.build_with(&buffer))
}
};

unify!(self.machine_st, self.machine_st.registers[4], sx);
Expand Down

0 comments on commit 98f1efd

Please sign in to comment.