Skip to content

Commit 16941e3

Browse files
committed
finish schnorr
1 parent e0b7999 commit 16941e3

File tree

4 files changed

+105
-34
lines changed

4 files changed

+105
-34
lines changed

Cargo.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ jolt = { package = "jolt-sdk", git = "https://github.com/a16z/jolt", features =
1818
guest = { path = "./guest" }
1919
k256 = "0.13.3"
2020
rand_core = "0.6.4"
21+
# rsa = { version = "0.9.6", default-features = false, features = ["sha2"] }
22+
# rand = "0.8.5"
2123

2224
[patch.crates-io]
2325
ark-ff = { git = "https://github.com/a16z/arkworks-algebra", branch = "optimize/field-from-u64" }

guest/Cargo.toml

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,6 @@ path = "./src/lib.rs"
1111
guest = []
1212

1313
[dependencies]
14-
k256 = { version = "0.13.3", default-features = false, features = [
15-
"arithmetic",
16-
"pkcs8",
17-
"precomputed-tables",
18-
"schnorr",
19-
] }
14+
k256 = { version = "0.13.3", default-features = false, features = ["schnorr"] }
2015
jolt = { package = "jolt-sdk", git = "https://github.com/a16z/jolt" }
16+
# rsa = { version = "0.9.6", default-features = false, features = ["sha2"] }

guest/src/lib.rs

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
#![cfg_attr(feature = "guest", no_std)]
22
#![no_main]
33

4-
use k256::schnorr::Signature;
5-
4+
/// Fibonacci(50)
5+
/// Trace length: 1301
66
#[jolt::provable]
77
fn fib(n: u32) -> u128 {
88
let mut a: u128 = 0;
@@ -17,16 +17,28 @@ fn fib(n: u32) -> u128 {
1717
b
1818
}
1919

20-
use k256::schnorr::{signature::Verifier, VerifyingKey};
21-
22-
#[jolt::provable]
20+
/// Verify Schnorr Signature
21+
/// Trace length: 169422912
22+
#[jolt::provable(stack_size = 100000, memory_size = 10000000)]
2323
fn schnorr(message: &[u8], verifying_key_bytes: &[u8], signature_bytes: &[u8]) {
24-
//
25-
// Verification
26-
//
24+
use k256::schnorr::{Signature, signature::Verifier, VerifyingKey};
2725
let verifying_key = VerifyingKey::from_bytes(&verifying_key_bytes).unwrap();
2826
let signature = Signature::try_from(signature_bytes).unwrap();
2927
verifying_key
3028
.verify(message, &signature)
31-
.expect("invalid signature");
29+
.unwrap();
3230
}
31+
32+
// /// Verify RSA Signature
33+
// /// Trace length:
34+
// #[jolt::provable(stack_size = 100000, memory_size = 10000000)]
35+
// fn rsa(message: &[u8], verifying_key_bytes: &[u8], signature_bytes: &[u8]) {
36+
// use rsa::pkcs1v15::VerifyingKey;
37+
// use rsa::signature::Verifier;
38+
// use rsa::{pkcs1::DecodeRsaPublicKey, pkcs1v15::Signature, sha2::Sha256};
39+
// let verifying_key: VerifyingKey<Sha256> = VerifyingKey::from_pkcs1_der(&verifying_key_bytes).unwrap();
40+
// let signature = Signature::try_from(signature_bytes).unwrap();
41+
// verifying_key
42+
// .verify(message, &signature)
43+
// .unwrap();
44+
// }

src/main.rs

Lines changed: 80 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,87 @@
1-
use k256::schnorr::{signature::Signer, SigningKey};
2-
use rand_core::OsRng; // requires 'getrandom' feature
1+
fn print_time<F: FnOnce()>(name: &str, f: F) {
2+
let start_time = std::time::Instant::now();
3+
f();
4+
let elapsed_time = start_time.elapsed();
5+
println!("{} Elapsed time: {:?}", name, elapsed_time);
6+
}
37

48
pub fn main() {
5-
let message = b"Schnorr signatures prove knowledge of a secret in the random oracle model";
6-
//
7-
// Signing
8-
//
9-
let signing_key = SigningKey::random(&mut OsRng); // serialize with `.to_bytes()`
10-
let verifying_key_bytes = signing_key.verifying_key().to_bytes(); // 32-bytes
9+
print_time("native fib(1000)", || {
10+
guest::execute_fib(1000);
11+
});
12+
let (prove_fib, _verify_fib) = guest::build_fib();
13+
print_time("zkVM fib(1000)", || {
14+
let (_output, _proof) = prove_fib(1000);
15+
});
16+
17+
{
18+
// Schnorr Signature
19+
use k256::schnorr::{signature::Signer, SigningKey};
20+
use rand_core::OsRng; // requires 'getrandom' feature
21+
22+
let message = b"Schnorr signatures prove knowledge of a secret in the random oracle model";
23+
// Signing
24+
let signing_key = SigningKey::random(&mut OsRng); // serialize with `.to_bytes()`
25+
let verifying_key_bytes = signing_key.verifying_key().to_bytes(); // 32-bytes
26+
let signature = signing_key.sign(message); // returns `k256::schnorr::Signature`
27+
let signature_bytes = signature.to_bytes(); // 64-bytes
28+
print_time("native Schnorr verify", || {
29+
guest::execute_schnorr(
30+
message,
31+
verifying_key_bytes.as_slice(),
32+
signature_bytes.as_slice(),
33+
);
34+
});
35+
let (prove_schnorr, _verify_schnorr) = guest::build_schnorr();
36+
print_time("zkVM Schnorr verify", || {
37+
let (_output, _proof) = prove_schnorr(
38+
message,
39+
verifying_key_bytes.as_slice(),
40+
signature_bytes.as_slice(),
41+
);
42+
});
43+
// let is_valid = verify_schnorr(proof);
44+
// println!("output: {}", output);
45+
// println!("valid: {}", is_valid);
46+
}
47+
/*
48+
{
49+
// RSA Signature
50+
use rsa::pkcs1v15::{SigningKey, VerifyingKey};
51+
use rsa::pkcs1::EncodeRsaPublicKey;
52+
use rsa::sha2::{Digest, Sha256};
53+
use rsa::signature::{Keypair, RandomizedSigner, SignatureEncoding, Verifier};
54+
use rsa::RsaPrivateKey;
1155
12-
let signature = signing_key.sign(message); // returns `k256::schnorr::Signature`
13-
let signature_bytes = signature.to_bytes(); // 64-bytes
56+
let mut rng = rand::thread_rng();
1457
15-
let (prove_schnorr, verify_schnorr) = guest::build_schnorr();
58+
let bits = 2048;
59+
let private_key = RsaPrivateKey::new(&mut rng, bits).expect("failed to generate a key");
60+
let signing_key = SigningKey::<Sha256>::new(private_key);
61+
let verifying_key = signing_key.verifying_key();
1662
17-
let (_output, proof) = prove_schnorr(
18-
message,
19-
verifying_key_bytes.as_slice(),
20-
signature_bytes.as_slice(),
21-
);
22-
let is_valid = verify_schnorr(proof);
63+
// Sign
64+
let data = b"hello world";
65+
let signature = signing_key.sign_with_rng(&mut rng, data);
66+
assert_ne!(signature.to_bytes().as_ref(), data.as_slice());
67+
let signature_bytes = signature.to_bytes();
68+
let verifying_key_bytes = verifying_key.to_pkcs1_der().unwrap();
2369
24-
// println!("output: {}", output);
25-
println!("valid: {}", is_valid);
70+
print_time("native RSA verify", || {
71+
guest::execute_rsa(
72+
data,
73+
verifying_key_bytes.as_bytes(),
74+
&signature_bytes.as_ref(),
75+
);
76+
});
77+
let (prove_rsa, _verify_rsa) = guest::build_rsa();
78+
print_time("zkVM RSA verify", || {
79+
let (_output, _proof) = prove_rsa(
80+
data,
81+
verifying_key_bytes.as_bytes(),
82+
&signature_bytes.as_ref(),
83+
);
84+
});
85+
}
86+
*/
2687
}

0 commit comments

Comments
 (0)