ENHANCED: Eliminate the OpenSSL dependency of library(crypto).

This is achieved by using the newly available crrl crate by @pornin
to implement crypto_curve_scalar_mult/4 for secp256k1. Many thanks!
This commit is contained in:
Markus Triska
2022-09-03 13:30:57 +02:00
committed by Mark Thom
parent 1109e05e06
commit 9c1de8e00b
5 changed files with 130 additions and 90 deletions

124
Cargo.lock generated
View File

@@ -78,10 +78,19 @@ checksum = "94cb07b0da6a73955f8fb85d24c466778e70cda767a568229b104f0264089330"
dependencies = [ dependencies = [
"byte-tools", "byte-tools",
"crypto-mac", "crypto-mac",
"digest", "digest 0.8.1",
"opaque-debug", "opaque-debug",
] ]
[[package]]
name = "blake2"
version = "0.10.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b9cf849ee05b2ee5fba5e36f97ff8ec2533916700fc0758d40d92136a42f3388"
dependencies = [
"digest 0.10.3",
]
[[package]] [[package]]
name = "block-buffer" name = "block-buffer"
version = "0.7.3" version = "0.7.3"
@@ -91,7 +100,16 @@ dependencies = [
"block-padding", "block-padding",
"byte-tools", "byte-tools",
"byteorder", "byteorder",
"generic-array", "generic-array 0.12.4",
]
[[package]]
name = "block-buffer"
version = "0.10.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0bf7fe51849ea569fd452f37822f606a5cabb684dc918707a0193fd4664ff324"
dependencies = [
"generic-array 0.14.6",
] ]
[[package]] [[package]]
@@ -209,6 +227,15 @@ dependencies = [
"winapi", "winapi",
] ]
[[package]]
name = "cpufeatures"
version = "0.2.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dc948ebb96241bb40ab73effeb80d9f93afaad49359d159a5e61be51619fe813"
dependencies = [
"libc",
]
[[package]] [[package]]
name = "crossterm" name = "crossterm"
version = "0.20.0" version = "0.20.0"
@@ -234,14 +261,35 @@ dependencies = [
"winapi", "winapi",
] ]
[[package]]
name = "crrl"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2db40892a506901e4e8281f00e42687df82d1d3448cb0289ae9183a60cb42ec1"
dependencies = [
"blake2 0.10.4",
"rand_core 0.6.3",
"sha2",
]
[[package]]
name = "crypto-common"
version = "0.1.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3"
dependencies = [
"generic-array 0.14.6",
"typenum",
]
[[package]] [[package]]
name = "crypto-mac" name = "crypto-mac"
version = "0.7.0" version = "0.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4434400df11d95d556bac068ddfedd482915eb18fe8bea89bc80b6e4b1c179e5" checksum = "4434400df11d95d556bac068ddfedd482915eb18fe8bea89bc80b6e4b1c179e5"
dependencies = [ dependencies = [
"generic-array", "generic-array 0.12.4",
"subtle", "subtle 1.0.0",
] ]
[[package]] [[package]]
@@ -266,7 +314,18 @@ version = "0.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f3d0c8c8752312f9713efd397ff63acb9f85585afbf179282e720e7704954dd5" checksum = "f3d0c8c8752312f9713efd397ff63acb9f85585afbf179282e720e7704954dd5"
dependencies = [ dependencies = [
"generic-array", "generic-array 0.12.4",
]
[[package]]
name = "digest"
version = "0.10.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f2fb860ca6fafa5552fb6d0e816a69c8e49f0908bf524e30a90d97c85892d506"
dependencies = [
"block-buffer 0.10.2",
"crypto-common",
"subtle 2.4.1",
] ]
[[package]] [[package]]
@@ -518,6 +577,16 @@ dependencies = [
"typenum", "typenum",
] ]
[[package]]
name = "generic-array"
version = "0.14.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bff49e947297f3312447abdca79f45f4738097cc82b06e72054d2223f601f1b9"
dependencies = [
"typenum",
"version_check",
]
[[package]] [[package]]
name = "getrandom" name = "getrandom"
version = "0.2.6" version = "0.2.6"
@@ -1087,15 +1156,6 @@ version = "0.1.5"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf"
[[package]]
name = "openssl-src"
version = "111.18.0+1.1.1n"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7897a926e1e8d00219127dc020130eca4292e5ca666dd592480d72c3eca2ff6c"
dependencies = [
"cc",
]
[[package]] [[package]]
name = "openssl-sys" name = "openssl-sys"
version = "0.9.72" version = "0.9.72"
@@ -1105,7 +1165,6 @@ dependencies = [
"autocfg 1.1.0", "autocfg 1.1.0",
"cc", "cc",
"libc", "libc",
"openssl-src",
"pkg-config", "pkg-config",
"vcpkg", "vcpkg",
] ]
@@ -1565,8 +1624,8 @@ version = "0.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ad5112e0dbbb87577bfbc56c42450235e3012ce336e29c5befd7807bd626da4a" checksum = "ad5112e0dbbb87577bfbc56c42450235e3012ce336e29c5befd7807bd626da4a"
dependencies = [ dependencies = [
"block-buffer", "block-buffer 0.7.3",
"digest", "digest 0.8.1",
"opaque-debug", "opaque-debug",
] ]
@@ -1671,10 +1730,11 @@ version = "0.9.0"
dependencies = [ dependencies = [
"assert_cmd", "assert_cmd",
"base64", "base64",
"blake2", "blake2 0.8.1",
"chrono", "chrono",
"cpu-time", "cpu-time",
"crossterm", "crossterm",
"crrl",
"ctrlc", "ctrlc",
"dirs-next", "dirs-next",
"divrem", "divrem",
@@ -1691,7 +1751,6 @@ dependencies = [
"modular-bitfield", "modular-bitfield",
"native-tls", "native-tls",
"num-rug-adapter", "num-rug-adapter",
"openssl",
"ordered-float", "ordered-float",
"phf 0.9.0", "phf 0.9.0",
"predicates-core", "predicates-core",
@@ -1802,15 +1861,26 @@ dependencies = [
"syn 1.0.90", "syn 1.0.90",
] ]
[[package]]
name = "sha2"
version = "0.10.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cf9db03534dff993187064c4e0c05a5708d2a9728ace9a8959b77bedf415dac5"
dependencies = [
"cfg-if",
"cpufeatures",
"digest 0.10.3",
]
[[package]] [[package]]
name = "sha3" name = "sha3"
version = "0.8.2" version = "0.8.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dd26bc0e7a2e3a7c959bc494caf58b72ee0c71d67704e9520f736ca7e4853ecf" checksum = "dd26bc0e7a2e3a7c959bc494caf58b72ee0c71d67704e9520f736ca7e4853ecf"
dependencies = [ dependencies = [
"block-buffer", "block-buffer 0.7.3",
"byte-tools", "byte-tools",
"digest", "digest 0.8.1",
"keccak", "keccak",
"opaque-debug", "opaque-debug",
] ]
@@ -1974,6 +2044,12 @@ version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2d67a5a62ba6e01cb2192ff309324cb4875d0c451d55fe2319433abe7a05a8ee" checksum = "2d67a5a62ba6e01cb2192ff309324cb4875d0c451d55fe2319433abe7a05a8ee"
[[package]]
name = "subtle"
version = "2.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601"
[[package]] [[package]]
name = "syn" name = "syn"
version = "0.15.44" version = "0.15.44"
@@ -2219,6 +2295,12 @@ version = "0.2.15"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426"
[[package]]
name = "version_check"
version = "0.9.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f"
[[package]] [[package]]
name = "wait-timeout" name = "wait-timeout"
version = "0.2.0" version = "0.2.0"

View File

@@ -54,7 +54,7 @@ ring = "0.16.13"
ripemd160 = "0.8.0" ripemd160 = "0.8.0"
sha3 = "0.8.2" sha3 = "0.8.2"
blake2 = "0.8.1" blake2 = "0.8.1"
openssl = { version = "0.10.29", features = ["vendored"] } crrl ="0.2.0"
native-tls = "0.2.4" native-tls = "0.2.4"
chrono = "0.4.11" chrono = "0.4.11"
select = "0.4.3" select = "0.4.3"

View File

@@ -492,7 +492,7 @@ enum SystemClauseType {
CryptoDataEncrypt, CryptoDataEncrypt,
#[strum_discriminants(strum(props(Arity = "6", Name = "$crypto_data_decrypt")))] #[strum_discriminants(strum(props(Arity = "6", Name = "$crypto_data_decrypt")))]
CryptoDataDecrypt, CryptoDataDecrypt,
#[strum_discriminants(strum(props(Arity = "5", Name = "$crypto_curve_scalar_mult")))] #[strum_discriminants(strum(props(Arity = "4", Name = "$crypto_curve_scalar_mult")))]
CryptoCurveScalarMult, CryptoCurveScalarMult,
#[strum_discriminants(strum(props(Arity = "4", Name = "$ed25519_sign")))] #[strum_discriminants(strum(props(Arity = "4", Name = "$ed25519_sign")))]
Ed25519Sign, Ed25519Sign,

View File

@@ -763,10 +763,14 @@ crypto_curve_scalar_mult(Curve, Scalar, point(X,Y), point(RX, RY)) :-
curve_field_length(Curve, L0), curve_field_length(Curve, L0),
L #= 2*L0, % for hex encoding L #= 2*L0, % for hex encoding
phrase(format_("04~|~`0t~16r~*+~`0t~16r~*+", [X,L,Y,L]), Hex), phrase(format_("04~|~`0t~16r~*+~`0t~16r~*+", [X,L,Y,L]), Hex),
hex_bytes(Hex, Bytes), hex_bytes(Hex, PointBytes),
'$crypto_curve_scalar_mult'(Name, Scalar, Bytes, SX, SY), once(bytes_integer(ScalarBytes, Scalar)),
number_chars(RX, SX), '$crypto_curve_scalar_mult'(Name, ScalarBytes, PointBytes, [_|Us]),
number_chars(RY, SY). maplist(char_code, Us, Bs),
length(BXs0, 32),
append(BXs0, BYs0, Bs),
maplist(reverse, [BXs0,BYs0], Rs),
maplist(bytes_integer, Rs, [RX,RY]).
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
?- crypto_name_curve(secp256k1, Curve), ?- crypto_name_curve(secp256k1, Curve),
@@ -818,16 +822,6 @@ fitting_exponent(N, E0, E) :-
fitting_exponent(N, E1, E) fitting_exponent(N, E1, E)
). ).
crypto_name_curve(secp112r1,
curve(secp112r1,
0x00db7c2abf62e35e668076bead208b,
0x00db7c2abf62e35e668076bead2088,
0x659ef8ba043916eede8911702b22,
point(0x09487239995a5ee76b55f9c2f098,
0xa89ce5af8724c0a23e0e0ff77500),
0x00db7c2abf62e35e7628dfac6561c5,
14,
1)).
crypto_name_curve(secp256k1, crypto_name_curve(secp256k1,
curve(secp256k1, curve(secp256k1,
0x00fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f, 0x00fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f,

View File

@@ -69,9 +69,7 @@ use ring::{
use ripemd160::{Digest, Ripemd160}; use ripemd160::{Digest, Ripemd160};
use sha3::{Sha3_224, Sha3_256, Sha3_384, Sha3_512}; use sha3::{Sha3_224, Sha3_256, Sha3_384, Sha3_512};
use openssl::bn::{BigNum, BigNumContext}; use crrl::secp256k1;
use openssl::ec::{EcGroup, EcPoint};
use openssl::nid::Nid;
use sodiumoxide::crypto::scalarmult::curve25519::*; use sodiumoxide::crypto::scalarmult::curve25519::*;
@@ -6348,60 +6346,26 @@ impl Machine {
#[inline(always)] #[inline(always)]
pub(crate) fn crypto_curve_scalar_mult(&mut self) { pub(crate) fn crypto_curve_scalar_mult(&mut self) {
let curve = cell_as_atom!(self.machine_st.registers[1]);
let curve_id = match curve { let stub_gen = || functor_stub(atom!("crypto_curve_scalar_mult"), 4);
atom!("secp112r1") => Nid::SECP112R1, let scalar_bytes = self.machine_st.integers_to_bytevec(self.machine_st.registers[2], stub_gen);
atom!("secp256k1") => Nid::SECP256K1, let point_bytes = self.machine_st.integers_to_bytevec(self.machine_st.registers[3], stub_gen);
_ => {
unreachable!() let mut point = secp256k1::Point::decode(&point_bytes).unwrap();
let scalar = secp256k1::Scalar::decode_reduce(&scalar_bytes);
point *= scalar;
let uncompressed = {
let buffer = String::from_iter(point.encode_uncompressed().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))
} }
}; };
let scalar = self.machine_st.store(self.machine_st.deref(self.machine_st.registers[2])); unify!(self.machine_st, self.machine_st.registers[4], uncompressed);
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 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();
result.mul(&group, &mut point, &scalar_bn, &mut bnctx).ok();
let mut rx = BigNum::new().unwrap();
let mut ry = BigNum::new().unwrap();
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))
};
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))
};
unify!(self.machine_st, self.machine_st.registers[4], sx);
unify!(self.machine_st, self.machine_st.registers[5], sy);
} }
#[inline(always)] #[inline(always)]