|
1 | | -//nc1 |
2 | | -use crate::ark_std::UniformRand; |
3 | | -use crate::ark_std::Zero; |
4 | | -use crate::Error; |
5 | | -use crate::HomomorphicSignatureScheme; |
6 | 1 | use ark_ec::pairing::Pairing; |
7 | | -use ark_ec::AffineRepr; |
8 | | -use ark_std::{marker::PhantomData, rand::Rng}; |
| 2 | +use ark_std::rand::Rng; |
9 | 3 | use digest::Digest; |
10 | | -use std::ops::MulAssign; |
11 | | - |
12 | | -pub struct HolographicHomomorphicSignatureScheme<P: Pairing, D: Digest> { |
13 | | - _pairing: PhantomData<P>, |
14 | | - _hash: PhantomData<D>, |
15 | | -} |
16 | | - |
17 | | -#[derive(Clone)] |
18 | | -pub struct H2S2Parameters<P: Pairing> { |
19 | | - pub g1_generators: Vec<P::G1>, |
20 | | - pub g2_generator: P::G2, |
21 | | -} |
22 | | - |
23 | | -impl<P: Pairing, D: Digest + Send + Sync> HolographicHomomorphicSignatureScheme for NC1<P, D> { |
24 | | - type Parameters = H2S2Parameters<P>; |
25 | | - type PublicKey = P::G2; |
26 | | - type SecretKey = P::ScalarField; |
27 | | - type Signature = P::G1; |
28 | | - type Message = P::ScalarField; |
29 | | - type Weight = usize; |
30 | | - |
31 | | - /// Generate G2 element and `n` G1 elements |
32 | | - fn setup<R: Rng>(rng: &mut R, n: usize) -> Result<Self::Parameters, Error> {} |
33 | | - |
34 | | - /// Generate hash aggregate (H_a) with `tag` and `n` lanes |
35 | | - fn precompute(tag: &[u8], n: usize) -> Result<P::G1, Error> {} |
| 4 | +use std::error::Error; |
| 5 | + |
| 6 | +pub trait HolographicHomomorphicSignatureScheme<P: Pairing, D: Digest + Send + Sync> { |
| 7 | + type Parameters; |
| 8 | + type PublicKey; |
| 9 | + type SecretKey; |
| 10 | + type Signature; |
| 11 | + type Message; |
| 12 | + type Weight; |
| 13 | + type AggregatedSignature; |
| 14 | + |
| 15 | + /// Generate one G2 element and `n` G1 elements |
| 16 | + fn setup(n: usize) -> Result<Self::Parameters, Box<dyn Error>>; |
| 17 | + |
| 18 | + /// Generate hash aggregate (H_a) with `tag` and `n` lanes, and a |
| 19 | + /// allocation_id as a ScalarField |
| 20 | + fn precompute( |
| 21 | + pp: &Self::Parameters, |
| 22 | + tag: P::ScalarField, |
| 23 | + n: usize, |
| 24 | + ) -> Result<(P::G1, P::ScalarField), Box<dyn Error>>; |
36 | 25 |
|
37 | 26 | /// Generate private and public receipt keys using `pp` parameters from `setup` |
38 | 27 | fn keygen<R: Rng>( |
39 | 28 | pp: &Self::Parameters, |
40 | 29 | rng: &mut R, |
41 | | - ) -> Result<(Self::PublicKey, Self::SecretKey), Error> { |
42 | | - } |
| 30 | + ) -> Result<(Self::PublicKey, Self::SecretKey), Box<dyn Error>>; |
43 | 31 |
|
44 | 32 | /// Sign `message` with `tag` at `index` |
45 | 33 | fn sign( |
46 | 34 | pp: &Self::Parameters, |
47 | | - sk: &Self::SecretKey, |
48 | | - tag: &[u8], |
49 | | - index: &[u8], |
50 | | - message: &[Self::Message], |
51 | | - ) -> Result<Self::Signature, Error> { |
52 | | - } |
| 35 | + tag: P::ScalarField, |
| 36 | + index: usize, |
| 37 | + message: Self::Message, |
| 38 | + ) -> Result<Self::Signature, Box<dyn Error>>; |
53 | 39 |
|
54 | 40 | /// Verify a single `signature` matches `message` with `tag` at `index` using `pp` parameter and `pk` public key |
| 41 | + /// TODO: index should be restricted to a number from 1 to N (max number of lanes) |
55 | 42 | fn verify( |
56 | 43 | pp: &Self::Parameters, |
57 | | - pk: &Self::PublicKey, |
58 | | - tag: &[u8], |
59 | | - index: &[u8], |
60 | | - message: &[Self::Message], |
| 44 | + tag: P::ScalarField, |
| 45 | + index: usize, |
| 46 | + message: &Self::Message, |
61 | 47 | signature: &Self::Signature, |
62 | | - ) -> Result<bool, Error> { |
63 | | - } |
| 48 | + ) -> Result<bool, Box<dyn Error>>; |
64 | 49 |
|
65 | | - /// Verify aggregate `signature` matches `message_aggregate` with `tag` and `hash_aggregate`using `pp` parameter and `pk` public key |
| 50 | + /// Verify aggregate `signature` matches `message_aggregate` |
| 51 | + /// contained in [`AggregatedSignature`] with `tag` and `hash_aggregate` using `pp` parameter and `pk` public key |
66 | 52 | fn verify_aggregate( |
67 | 53 | pp: &Self::Parameters, |
68 | | - pk: &Self::PublicKey, |
69 | | - tag: &[u8], |
70 | | - message_aggregate: &[Self::Message], |
71 | 54 | hash_aggregate: &P::G1, |
72 | | - signature: &Self::Signature, |
73 | | - ) -> Result<bool, Error> { |
74 | | - } |
| 55 | + signature: &Self::AggregatedSignature, |
| 56 | + ) -> Result<bool, Box<dyn Error>>; |
75 | 57 |
|
76 | 58 | /// Aggregate `signatures` with `weights` |
77 | 59 | fn evaluate( |
78 | 60 | signatures: &[Self::Signature], |
79 | 61 | weights: &[Self::Weight], |
80 | | - ) -> Result<Self::Signature, Error> { |
81 | | - } |
| 62 | + ) -> Result<Self::AggregatedSignature, Box<dyn Error>>; |
82 | 63 | } |
0 commit comments