11use criterion:: { Criterion , criterion_group, criterion_main} ;
22use bouncycastle_core_interface:: key_material:: { KeyMaterial256 , KeyType } ;
33use std:: hint:: black_box;
4- use bouncycastle_mldsa:: { MLDSA44 , MLDSA65 , MLDSA87 } ;
4+ use bouncycastle_core_interface:: traits:: Signature ;
5+ use bouncycastle_mldsa:: { MLDSA44 , MLDSA44_SIG_LEN , MLDSA65 , MLDSA87 } ;
56use bouncycastle_hex as hex;
67
78fn bench_mldsa_keygen ( c : & mut Criterion ) {
@@ -53,11 +54,11 @@ fn bench_mldsa_sign(c: &mut Criterion) {
5354 KeyType :: Seed ,
5455 ) . unwrap ( ) ;
5556
57+ let msg = b"The quick brown fox jumped over the lazy dog" ;
58+
59+ /** ML-DSA-44 **/
5660 let ( _mldsa44_pk, mldsa44_sk) = MLDSA44 :: keygen_from_seed ( & seed) . unwrap ( ) ;
57- let ( _mldsa65_pk, mldsa65_sk) = MLDSA65 :: keygen_from_seed ( & seed) . unwrap ( ) ;
58- let ( _mldsa87_pk, mldsa87_sk) = MLDSA87 :: keygen_from_seed ( & seed) . unwrap ( ) ;
5961
60- let msg = b"The quick brown fox jumped over the lazy dog" ;
6162
6263 // signing nonce; we'll increment each time
6364 let mut rnd= [ 0u8 ; 32 ] ;
@@ -73,6 +74,10 @@ fn bench_mldsa_sign(c: &mut Criterion) {
7374 } )
7475 } ) ;
7576
77+
78+ /** ML-DSA-65 **/
79+ let ( _mldsa65_pk, mldsa65_sk) = MLDSA65 :: keygen_from_seed ( & seed) . unwrap ( ) ;
80+
7681 group. bench_function ( "ML-DSA-65" , |b| {
7782 b. iter ( || {
7883 let mu = MLDSA65 :: compute_mu_from_sk ( msg, & [ 0u8 ; 0 ] , & mldsa65_sk) . unwrap ( ) ;
@@ -82,6 +87,11 @@ fn bench_mldsa_sign(c: &mut Criterion) {
8287 } )
8388 } ) ;
8489
90+
91+ /** ML-DSA-87 **/
92+
93+ let ( _mldsa87_pk, mldsa87_sk) = MLDSA87 :: keygen_from_seed ( & seed) . unwrap ( ) ;
94+
8595 group. bench_function ( "ML-DSA-87" , |b| {
8696 b. iter ( || {
8797 let mu = MLDSA87 :: compute_mu_from_sk ( msg, & [ 0u8 ; 0 ] , & mldsa87_sk) . unwrap ( ) ;
@@ -94,8 +104,98 @@ fn bench_mldsa_sign(c: &mut Criterion) {
94104 group. finish ( ) ;
95105}
96106
107+ fn bench_mldsa_verify ( c : & mut Criterion ) {
108+ let mut group = c. benchmark_group ( "Verify" ) ;
109+
110+ // set up the seeds outside of the timing loop
111+ // Doing different seeds so that the CPU doesn't cache them or do too much branch prediction
112+ let seed = KeyMaterial256 :: from_bytes_as_type (
113+ & hex:: decode ( "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f" ) . unwrap ( ) ,
114+ KeyType :: Seed ,
115+ ) . unwrap ( ) ;
116+
117+ let msg = b"The quick brown fox jumped over the lazy dog" ;
118+
119+
120+ /** ML-DSA-44 **/
121+ let ( mldsa44_pk, mldsa44_sk) = MLDSA44 :: keygen_from_seed ( & seed) . unwrap ( ) ;
122+
123+ // Create a vec of 1000 different signatures to verify
124+ // use ctx to make them different (in addition to the signing nonce being different)
125+ let mut sigs = Vec :: < ( Vec < u8 > , u128 ) > :: with_capacity ( 1000 ) ;
126+
127+ let mut ctx = 0u128 ;
128+ for _ in 0 ..1000 {
129+ sigs. push ( ( MLDSA44 :: sign ( & mldsa44_sk, msg, & ctx. to_le_bytes ( ) ) . unwrap ( ) , ctx) ) ;
130+ ctx += 1
131+ }
132+
133+ group. throughput ( criterion:: Throughput :: Elements ( sigs. len ( ) as u64 ) ) ;
134+
135+ group. bench_function ( "ML-DSA-44" , |b| {
136+ b. iter ( || {
137+ for i in 0 ..sigs. len ( ) {
138+ let ( sig, ctx) = & sigs[ i] ;
139+ black_box ( MLDSA44 :: verify ( & mldsa44_pk, msg, & ctx. to_le_bytes ( ) , & sig) . unwrap ( ) )
140+ }
141+ } )
142+ } ) ;
143+
144+
145+ /** ML-DSA-65 **/
146+ let ( mldsa65_pk, mldsa65_sk) = MLDSA65 :: keygen_from_seed ( & seed) . unwrap ( ) ;
147+
148+ // Create a vec of 1000 different signatures to verify
149+ // use ctx to make them different (in addition to the signing nonce being different)
150+ let mut sigs = Vec :: < ( Vec < u8 > , u128 ) > :: with_capacity ( 1000 ) ;
151+
152+ let mut ctx = 0u128 ;
153+ for _ in 0 ..1000 {
154+ sigs. push ( ( MLDSA65 :: sign ( & mldsa65_sk, msg, & ctx. to_le_bytes ( ) ) . unwrap ( ) , ctx) ) ;
155+ ctx += 1
156+ }
157+
158+ group. throughput ( criterion:: Throughput :: Elements ( sigs. len ( ) as u64 ) ) ;
159+
160+ group. bench_function ( "ML-DSA-65" , |b| {
161+ b. iter ( || {
162+ for i in 0 ..sigs. len ( ) {
163+ let ( sig, ctx) = & sigs[ i] ;
164+ black_box ( MLDSA65 :: verify ( & mldsa65_pk, msg, & ctx. to_le_bytes ( ) , & sig) . unwrap ( ) )
165+ }
166+ } )
167+ } ) ;
168+
169+
170+ /** ML-DSA-87 **/
171+ let ( mldsa87_pk, mldsa87_sk) = MLDSA87 :: keygen_from_seed ( & seed) . unwrap ( ) ;
172+
173+ // Create a vec of 1000 different signatures to verify
174+ // use ctx to make them different (in addition to the signing nonce being different)
175+ let mut sigs = Vec :: < ( Vec < u8 > , u128 ) > :: with_capacity ( 1000 ) ;
176+
177+ let mut ctx = 0u128 ;
178+ for _ in 0 ..1000 {
179+ sigs. push ( ( MLDSA87 :: sign ( & mldsa87_sk, msg, & ctx. to_le_bytes ( ) ) . unwrap ( ) , ctx) ) ;
180+ ctx += 1
181+ }
182+
183+ group. throughput ( criterion:: Throughput :: Elements ( sigs. len ( ) as u64 ) ) ;
184+
185+ group. bench_function ( "ML-DSA-87" , |b| {
186+ b. iter ( || {
187+ for i in 0 ..sigs. len ( ) {
188+ let ( sig, ctx) = & sigs[ i] ;
189+ black_box ( MLDSA87 :: verify ( & mldsa87_pk, msg, & ctx. to_le_bytes ( ) , & sig) . unwrap ( ) )
190+ }
191+ } )
192+ } ) ;
193+
194+ group. finish ( ) ;
195+ }
196+
97197
98- criterion_group ! ( benches, bench_mldsa_keygen, bench_mldsa_sign) ;
198+ criterion_group ! ( benches, bench_mldsa_keygen, bench_mldsa_sign, bench_mldsa_verify ) ;
99199criterion_main ! ( benches) ;
100200
101201const DUMMY_SEED_1024 : & [ u8 ; 1024 ] = b"\x00 \x01 \x02 \x03 \x04 \x05 \x06 \x07 \x08 \x09 \x0a \x0b \x0c \x0d \x0e \x0f \x10 \x11 \x12 \x13 \x14 \x15 \x16 \x17 \x18 \x19 \x1a \x1b \x1c \x1d \x1e \x1f \x20 \x21 \x22 \x23 \x24 \x25 \x26 \x27 \x28 \x29 \x2a \x2b \x2c \x2d \x2e \x2f \x30 \x31 \x32 \x33 \x34 \x35 \x36 \x37 \x38 \x39 \x3a \x3b \x3c \x3d \x3e \x3f \x40 \x41 \x42 \x43 \x44 \x45 \x46 \x47 \x48 \x49 \x4a \x4b \x4c \x4d \x4e \x4f \x50 \x51 \x52 \x53 \x54 \x55 \x56 \x57 \x58 \x59 \x5a \x5b \x5c \x5d \x5e \x5f \x60 \x61 \x62 \x63 \x64 \x65 \x66 \x67 \x68 \x69 \x6a \x6b \x6c \x6d \x6e \x6f \x70 \x71 \x72 \x73 \x74 \x75 \x76 \x77 \x78 \x79 \x7a \x7b \x7c \x7d \x7e \x7f \x80 \x81 \x82 \x83 \x84 \x85 \x86 \x87 \x88 \x89 \x8a \x8b \x8c \x8d \x8e \x8f \x90 \x91 \x92 \x93 \x94 \x95 \x96 \x97 \x98 \x99 \x9a \x9b \x9c \x9d \x9e \x9f \xa0 \xa1 \xa2 \xa3 \xa4 \xa5 \xa6 \xa7 \xa8 \xa9 \xaa \xab \xac \xad \xae \xaf \xb0 \xb1 \xb2 \xb3 \xb4 \xb5 \xb6 \xb7 \xb8 \xb9 \xba \xbb \xbc \xbd \xbe \xbf \xc0 \xc1 \xc2 \xc3 \xc4 \xc5 \xc6 \xc7 \xc8 \xc9 \xca \xcb \xcc \xcd \xce \xcf \xd0 \xd1 \xd2 \xd3 \xd4 \xd5 \xd6 \xd7 \xd8 \xd9 \xda \xdb \xdc \xdd \xde \xdf \xe0 \xe1 \xe2 \xe3 \xe4 \xe5 \xe6 \xe7 \xe8 \xe9 \xea \xeb \xec \xed \xee \xef \xf0 \xf1 \xf2 \xf3 \xf4 \xf5 \xf6 \xf7 \xf8 \xf9 \xfa \xfb \xfc \xfd \xfe \xff \x00 \x01 \x02 \x03 \x04 \x05 \x06 \x07 \x08 \x09 \x0a \x0b \x0c \x0d \x0e \x0f \x10 \x11 \x12 \x13 \x14 \x15 \x16 \x17 \x18 \x19 \x1a \x1b \x1c \x1d \x1e \x1f \x20 \x21 \x22 \x23 \x24 \x25 \x26 \x27 \x28 \x29 \x2a \x2b \x2c \x2d \x2e \x2f \x30 \x31 \x32 \x33 \x34 \x35 \x36 \x37 \x38 \x39 \x3a \x3b \x3c \x3d \x3e \x3f \x40 \x41 \x42 \x43 \x44 \x45 \x46 \x47 \x48 \x49 \x4a \x4b \x4c \x4d \x4e \x4f \x50 \x51 \x52 \x53 \x54 \x55 \x56 \x57 \x58 \x59 \x5a \x5b \x5c \x5d \x5e \x5f \x60 \x61 \x62 \x63 \x64 \x65 \x66 \x67 \x68 \x69 \x6a \x6b \x6c \x6d \x6e \x6f \x70 \x71 \x72 \x73 \x74 \x75 \x76 \x77 \x78 \x79 \x7a \x7b \x7c \x7d \x7e \x7f \x80 \x81 \x82 \x83 \x84 \x85 \x86 \x87 \x88 \x89 \x8a \x8b \x8c \x8d \x8e \x8f \x90 \x91 \x92 \x93 \x94 \x95 \x96 \x97 \x98 \x99 \x9a \x9b \x9c \x9d \x9e \x9f \xa0 \xa1 \xa2 \xa3 \xa4 \xa5 \xa6 \xa7 \xa8 \xa9 \xaa \xab \xac \xad \xae \xaf \xb0 \xb1 \xb2 \xb3 \xb4 \xb5 \xb6 \xb7 \xb8 \xb9 \xba \xbb \xbc \xbd \xbe \xbf \xc0 \xc1 \xc2 \xc3 \xc4 \xc5 \xc6 \xc7 \xc8 \xc9 \xca \xcb \xcc \xcd \xce \xcf \xd0 \xd1 \xd2 \xd3 \xd4 \xd5 \xd6 \xd7 \xd8 \xd9 \xda \xdb \xdc \xdd \xde \xdf \xe0 \xe1 \xe2 \xe3 \xe4 \xe5 \xe6 \xe7 \xe8 \xe9 \xea \xeb \xec \xed \xee \xef \xf0 \xf1 \xf2 \xf3 \xf4 \xf5 \xf6 \xf7 \xf8 \xf9 \xfa \xfb \xfc \xfd \xfe \xff \x00 \x01 \x02 \x03 \x04 \x05 \x06 \x07 \x08 \x09 \x0a \x0b \x0c \x0d \x0e \x0f \x10 \x11 \x12 \x13 \x14 \x15 \x16 \x17 \x18 \x19 \x1a \x1b \x1c \x1d \x1e \x1f \x20 \x21 \x22 \x23 \x24 \x25 \x26 \x27 \x28 \x29 \x2a \x2b \x2c \x2d \x2e \x2f \x30 \x31 \x32 \x33 \x34 \x35 \x36 \x37 \x38 \x39 \x3a \x3b \x3c \x3d \x3e \x3f \x40 \x41 \x42 \x43 \x44 \x45 \x46 \x47 \x48 \x49 \x4a \x4b \x4c \x4d \x4e \x4f \x50 \x51 \x52 \x53 \x54 \x55 \x56 \x57 \x58 \x59 \x5a \x5b \x5c \x5d \x5e \x5f \x60 \x61 \x62 \x63 \x64 \x65 \x66 \x67 \x68 \x69 \x6a \x6b \x6c \x6d \x6e \x6f \x70 \x71 \x72 \x73 \x74 \x75 \x76 \x77 \x78 \x79 \x7a \x7b \x7c \x7d \x7e \x7f \x80 \x81 \x82 \x83 \x84 \x85 \x86 \x87 \x88 \x89 \x8a \x8b \x8c \x8d \x8e \x8f \x90 \x91 \x92 \x93 \x94 \x95 \x96 \x97 \x98 \x99 \x9a \x9b \x9c \x9d \x9e \x9f \xa0 \xa1 \xa2 \xa3 \xa4 \xa5 \xa6 \xa7 \xa8 \xa9 \xaa \xab \xac \xad \xae \xaf \xb0 \xb1 \xb2 \xb3 \xb4 \xb5 \xb6 \xb7 \xb8 \xb9 \xba \xbb \xbc \xbd \xbe \xbf \xc0 \xc1 \xc2 \xc3 \xc4 \xc5 \xc6 \xc7 \xc8 \xc9 \xca \xcb \xcc \xcd \xce \xcf \xd0 \xd1 \xd2 \xd3 \xd4 \xd5 \xd6 \xd7 \xd8 \xd9 \xda \xdb \xdc \xdd \xde \xdf \xe0 \xe1 \xe2 \xe3 \xe4 \xe5 \xe6 \xe7 \xe8 \xe9 \xea \xeb \xec \xed \xee \xef \xf0 \xf1 \xf2 \xf3 \xf4 \xf5 \xf6 \xf7 \xf8 \xf9 \xfa \xfb \xfc \xfd \xfe \xff \x00 \x01 \x02 \x03 \x04 \x05 \x06 \x07 \x08 \x09 \x0a \x0b \x0c \x0d \x0e \x0f \x10 \x11 \x12 \x13 \x14 \x15 \x16 \x17 \x18 \x19 \x1a \x1b \x1c \x1d \x1e \x1f \x20 \x21 \x22 \x23 \x24 \x25 \x26 \x27 \x28 \x29 \x2a \x2b \x2c \x2d \x2e \x2f \x30 \x31 \x32 \x33 \x34 \x35 \x36 \x37 \x38 \x39 \x3a \x3b \x3c \x3d \x3e \x3f \x40 \x41 \x42 \x43 \x44 \x45 \x46 \x47 \x48 \x49 \x4a \x4b \x4c \x4d \x4e \x4f \x50 \x51 \x52 \x53 \x54 \x55 \x56 \x57 \x58 \x59 \x5a \x5b \x5c \x5d \x5e \x5f \x60 \x61 \x62 \x63 \x64 \x65 \x66 \x67 \x68 \x69 \x6a \x6b \x6c \x6d \x6e \x6f \x70 \x71 \x72 \x73 \x74 \x75 \x76 \x77 \x78 \x79 \x7a \x7b \x7c \x7d \x7e \x7f \x80 \x81 \x82 \x83 \x84 \x85 \x86 \x87 \x88 \x89 \x8a \x8b \x8c \x8d \x8e \x8f \x90 \x91 \x92 \x93 \x94 \x95 \x96 \x97 \x98 \x99 \x9a \x9b \x9c \x9d \x9e \x9f \xa0 \xa1 \xa2 \xa3 \xa4 \xa5 \xa6 \xa7 \xa8 \xa9 \xaa \xab \xac \xad \xae \xaf \xb0 \xb1 \xb2 \xb3 \xb4 \xb5 \xb6 \xb7 \xb8 \xb9 \xba \xbb \xbc \xbd \xbe \xbf \xc0 \xc1 \xc2 \xc3 \xc4 \xc5 \xc6 \xc7 \xc8 \xc9 \xca \xcb \xcc \xcd \xce \xcf \xd0 \xd1 \xd2 \xd3 \xd4 \xd5 \xd6 \xd7 \xd8 \xd9 \xda \xdb \xdc \xdd \xde \xdf \xe0 \xe1 \xe2 \xe3 \xe4 \xe5 \xe6 \xe7 \xe8 \xe9 \xea \xeb \xec \xed \xee \xef \xf0 \xf1 \xf2 \xf3 \xf4 \xf5 \xf6 \xf7 \xf8 \xf9 \xfa \xfb \xfc \xfd \xfe \xff " ;
0 commit comments