@@ -10,6 +10,23 @@ pub(crate) fn bytes_to_binary<'env>(env: Env<'env>, bytes: &[u8]) -> Binary<'env
10
10
binary. into ( )
11
11
}
12
12
13
+ // Deserialize a PublicKey from a slice of bytes.
14
+ // Faster than PublicKey::deserialize() as it doesn't validate the key
15
+ // Returns Error on invalid BLST encoding or on Infinity Public Key.
16
+ fn fast_public_key_deserialize ( pk : & [ u8 ] ) -> Result < PublicKey , String > {
17
+ if pk == & bls:: INFINITY_PUBLIC_KEY [ ..] {
18
+ Err ( "Infinity public Key" . to_owned ( ) )
19
+ } else {
20
+ bls:: impls:: blst:: types:: PublicKey :: from_bytes ( pk)
21
+ . map_err ( |err| format ! ( "BlstError({:?})" , err) )
22
+ . and_then ( |pk| {
23
+ PublicKey :: deserialize_uncompressed ( pk. serialize ( ) . as_slice ( ) )
24
+ // This should never be an error as the pk is obtained from an uncompressed valid key
25
+ . map_err ( |e| format ! ( "Deserialization error: {:?}" , e) )
26
+ } )
27
+ }
28
+ }
29
+
13
30
#[ rustler:: nif]
14
31
fn sign < ' env > (
15
32
env : Env < ' env > ,
@@ -59,7 +76,7 @@ fn verify<'env>(public_key: Binary, message: Binary, signature: Binary) -> Resul
59
76
}
60
77
let sig = Signature :: deserialize ( signature. as_slice ( ) ) . map_err ( |err| format ! ( "{:?}" , err) ) ?;
61
78
let pubkey =
62
- PublicKey :: deserialize ( public_key. as_slice ( ) ) . map_err ( |err| format ! ( "{:?}" , err) ) ?;
79
+ fast_public_key_deserialize ( public_key. as_slice ( ) ) . map_err ( |err| format ! ( "{:?}" , err) ) ?;
63
80
64
81
Ok ( sig. verify ( & pubkey, Hash256 :: from_slice ( message. as_slice ( ) ) ) )
65
82
}
@@ -74,7 +91,7 @@ fn aggregate_verify<'env>(
74
91
. map_err ( |err| format ! ( "{:?}" , err) ) ?;
75
92
let pubkeys_result = public_keys
76
93
. iter ( )
77
- . map ( |pkb| PublicKey :: deserialize ( pkb. as_slice ( ) ) )
94
+ . map ( |pkb| fast_public_key_deserialize ( pkb. as_slice ( ) ) )
78
95
. collect :: < Result < Vec < PublicKey > , _ > > ( ) ;
79
96
let pubkeys = pubkeys_result. map_err ( |err| format ! ( "{:?}" , err) ) ?;
80
97
@@ -86,7 +103,7 @@ fn aggregate_verify<'env>(
86
103
Ok ( aggregate_sig. aggregate_verify ( & msgs, & pubkey_refs) )
87
104
}
88
105
89
- #[ rustler:: nif]
106
+ #[ rustler:: nif( schedule = "DirtyCpu" ) ]
90
107
fn fast_aggregate_verify < ' env > (
91
108
public_keys : Vec < Binary > ,
92
109
message : Binary ,
@@ -99,7 +116,8 @@ fn fast_aggregate_verify<'env>(
99
116
. map_err ( |err| format ! ( "{:?}" , err) ) ?;
100
117
let pubkeys_result = public_keys
101
118
. iter ( )
102
- . map ( |pkb| PublicKey :: deserialize ( pkb. as_slice ( ) ) )
119
+ . map ( |pkb| fast_public_key_deserialize ( pkb. as_slice ( ) ) )
120
+ //.map(|pkb| PublicKey::deserialize(pkb.as_slice()))
103
121
. collect :: < Result < Vec < PublicKey > , _ > > ( ) ;
104
122
let pubkeys = pubkeys_result. map_err ( |err| format ! ( "{:?}" , err) ) ?;
105
123
@@ -120,7 +138,7 @@ fn eth_fast_aggregate_verify<'env>(
120
138
. map_err ( |err| format ! ( "{:?}" , err) ) ?;
121
139
let pubkeys_result = public_keys
122
140
. iter ( )
123
- . map ( |pkb| PublicKey :: deserialize ( pkb. as_slice ( ) ) )
141
+ . map ( |pkb| fast_public_key_deserialize ( pkb. as_slice ( ) ) )
124
142
. collect :: < Result < Vec < PublicKey > , _ > > ( ) ;
125
143
let pubkeys = pubkeys_result. map_err ( |err| format ! ( "{:?}" , err) ) ?;
126
144
@@ -139,7 +157,7 @@ fn eth_aggregate_pubkeys<'env>(
139
157
_ => {
140
158
let pubkeys_result = public_keys
141
159
. iter ( )
142
- . map ( |pkb| PublicKey :: deserialize ( pkb. as_slice ( ) ) )
160
+ . map ( |pkb| fast_public_key_deserialize ( pkb. as_slice ( ) ) )
143
161
. collect :: < Result < Vec < PublicKey > , _ > > ( ) ;
144
162
145
163
let pubkeys = pubkeys_result. map_err ( |err| format ! ( "{:?}" , err) ) ?;
@@ -156,8 +174,7 @@ fn eth_aggregate_pubkeys<'env>(
156
174
}
157
175
#[ rustler:: nif]
158
176
fn key_validate < ' env > ( public_key : Binary ) -> Result < bool , String > {
159
- let _pubkey =
160
- PublicKey :: deserialize ( public_key. as_slice ( ) ) . map_err ( |err| format ! ( "{:?}" , err) ) ?;
177
+ let _pubkey = fast_public_key_deserialize ( public_key. as_slice ( ) ) ?;
161
178
162
179
Ok ( true )
163
180
}
@@ -173,17 +190,4 @@ fn derive_pubkey<'env>(env: Env<'env>, private_key: Binary) -> Result<Binary<'en
173
190
Ok ( bytes_to_binary ( env, & public_key_bytes) )
174
191
}
175
192
176
- rustler:: init!(
177
- "Elixir.Bls" ,
178
- [
179
- sign,
180
- aggregate,
181
- aggregate_verify,
182
- fast_aggregate_verify,
183
- eth_fast_aggregate_verify,
184
- eth_aggregate_pubkeys,
185
- verify,
186
- key_validate,
187
- derive_pubkey
188
- ]
189
- ) ;
193
+ rustler:: init!( "Elixir.Bls" ) ;
0 commit comments