@@ -45,22 +45,31 @@ fn eval(modulus: &Integer, g: &Integer, t: u64) -> (Integer, Integer) {
4545 let g_b = g. clone ( ) . pow_mod ( & b, modulus) . unwrap ( ) ;
4646 pi = pi_2 * g_b;
4747 }
48-
48+
4949 ( y, pi. div_rem_floor ( modulus. clone ( ) ) . 1 )
5050}
5151
52- /// int(H("residue"||x)) mod N
53- fn h_g ( modulus : & Integer , seed : & Integer ) -> Integer {
52+ fn h_g_inner ( seed : & Integer ) -> Integer {
5453 let mut hasher = Sha256 :: new ( ) ;
5554 hasher. update ( "residue" . as_bytes ( ) ) ;
5655 hasher. update ( seed. to_digits :: < u8 > ( Order :: Lsf ) ) ;
57- let hashed = Integer :: from_digits ( & hasher. finalize ( ) , Order :: Lsf ) ;
56+ Integer :: from_digits ( & hasher. finalize ( ) , Order :: Lsf )
57+ }
5858
59- // inverse, to get enough security bits
60- match hashed. invert ( modulus) {
61- Ok ( inverse) => inverse,
62- Err ( unchanged) => unchanged,
59+ /// int(H("residue"||x)) mod N
60+ fn h_g ( modulus : & Integer , seed : & Integer ) -> Integer {
61+ let mut temp = h_g_inner ( seed) ;
62+ let mut result = temp. clone ( ) ;
63+ let mut ent = 256 ;
64+
65+ while ent < 2048 {
66+ let seed = temp. clone ( ) ;
67+ temp = h_g_inner ( & seed) ;
68+ result = ( result << 256 ) + temp. clone ( ) ;
69+ ent += 256 ;
6370 }
71+
72+ result. div_rem_floor ( modulus. clone ( ) ) . 1
6473}
6574
6675fn hash_to_prime ( modulus : & Integer , inputs : & [ & Integer ] ) -> Integer {
@@ -70,14 +79,7 @@ fn hash_to_prime(modulus: &Integer, inputs: &[&Integer]) -> Integer {
7079 hasher. update ( "\n " . as_bytes ( ) ) ;
7180 }
7281 let hashed = Integer :: from_digits ( & hasher. finalize ( ) , Order :: Lsf ) ;
73-
74- // inverse, to get enough security bits
75- let inverse = match hashed. invert ( modulus) {
76- Ok ( inverse) => inverse,
77- Err ( unchanged) => unchanged,
78- } ;
79-
80- inverse. next_prime ( ) . div_rem_floor ( modulus. clone ( ) ) . 1
82+ hashed. next_prime ( ) . div_rem_floor ( modulus. clone ( ) ) . 1
8183}
8284
8385fn benches_rsa ( c : & mut Criterion ) {
0 commit comments