44 * All rights reserved.
55 **********************************************************************************************/
66
7- use criterion:: { BenchmarkGroup , Criterion , SamplingMode , criterion_group, criterion_main, measurement :: Measurement } ;
7+ use criterion:: { criterion_group, criterion_main} ;
88use rand:: { Rng , rng} ;
9- use std:: {
10- env,
11- hint:: black_box,
12- num:: NonZeroUsize ,
13- sync:: {
14- Once ,
15- atomic:: { AtomicUsize , Ordering } ,
16- } ,
17- time:: Duration ,
18- } ;
9+ use std:: { env, sync:: Once } ;
1910use uuid:: Uuid ;
2011
2112use tss2_fapi_rs:: { BaseErrorCode , ErrorCode , FapiContext , KeyFlags } ;
@@ -27,85 +18,113 @@ use tss2_fapi_rs::{BaseErrorCode, ErrorCode, FapiContext, KeyFlags};
2718const FLAGS_STORAGE : [ KeyFlags ; 3usize ] = [ KeyFlags :: Decrypt , KeyFlags :: Restricted , KeyFlags :: NoDA ] ;
2819const FLAGS_SIGNING : [ KeyFlags ; 2usize ] = [ KeyFlags :: Sign , KeyFlags :: NoDA ] ;
2920
30- /// Benchmark #1: Get random
31- /// ------------------------
32- /// This benchmark measures the performance of the [`FapiContext::get_random()`] function.
33- fn bench_get_random < M : Measurement > ( group : & mut BenchmarkGroup < M > ) {
34- // Initialize TPM
35- let mut manager = TpmManager :: new ( ) ;
21+ mod bench_fapi {
22+ use super :: { FLAGS_SIGNING , FapiContext , TpmManager } ;
23+ use criterion:: { BenchmarkGroup , Criterion , SamplingMode , measurement:: Measurement } ;
24+ use std:: {
25+ hint:: black_box,
26+ num:: NonZeroUsize ,
27+ sync:: atomic:: { AtomicUsize , Ordering } ,
28+ time:: Duration ,
29+ } ;
30+
31+ /// Benchmark #1: Get random
32+ /// ------------------------
33+ /// This benchmark measures the performance of the [`FapiContext::get_random()`] function.
34+ fn get_random < M : Measurement > ( group : & mut BenchmarkGroup < M > ) {
35+ // Initialize TPM
36+ let mut manager = TpmManager :: new ( ) ;
37+
38+ // Measurement!
39+ let counter: AtomicUsize = AtomicUsize :: new ( 0usize ) ;
40+ group. bench_function ( "get_random" , |b| b. iter ( || _get_random ( & mut manager. 0 , black_box ( counter. fetch_add ( 1usize , Ordering :: Relaxed ) ) ) ) ) ;
41+ }
3642
37- // Measurement!
38- let counter : AtomicUsize = AtomicUsize :: new ( 0usize ) ;
39- group . bench_function ( "get_random" , |b| b . iter ( || _get_random ( & mut manager . 0 , black_box ( counter . fetch_add ( 1usize , Ordering :: Relaxed ) ) ) ) ) ;
40- }
43+ fn _get_random ( context : & mut FapiContext , _n : usize ) {
44+ let length = unsafe { NonZeroUsize :: new ( 32usize ) . unwrap_unchecked ( ) } ;
45+ let _buffer = black_box ( context . get_random ( length ) . expect ( "Failed to get random data!" ) ) ;
46+ }
4147
42- fn _get_random ( context : & mut FapiContext , _n : usize ) {
43- let length = unsafe { NonZeroUsize :: new ( 32usize ) . unwrap_unchecked ( ) } ;
44- let _buffer = black_box ( context. get_random ( length) . expect ( "Failed to get random data!" ) ) ;
45- }
48+ /// Benchmark #2: Create key
49+ /// ------------------------
50+ /// This benchmark measures the performance of the [`FapiContext::create_key()`] function.
51+ fn create_key < M : Measurement > ( group : & mut BenchmarkGroup < M > ) {
52+ // Initialize TPM
53+ let mut manager = TpmManager :: new ( ) ;
4654
47- /// Benchmark #2: Create key
48- /// ------------------------
49- /// This benchmark measures the performance of the [`FapiContext::create_key()`] function.
50- fn bench_create_key < M : Measurement > ( group : & mut BenchmarkGroup < M > ) {
51- // Initialize TPM
52- let mut manager = TpmManager :: new ( ) ;
55+ // Measurement!
56+ let counter: AtomicUsize = AtomicUsize :: new ( 0usize ) ;
57+ group. bench_function ( "create_key" , |b| b. iter ( || _create_key ( & mut manager. 0 , & manager. 1 , black_box ( counter. fetch_add ( 1usize , Ordering :: Relaxed ) ) ) ) ) ;
58+ }
5359
54- // Measurement!
55- let counter: AtomicUsize = AtomicUsize :: new ( 0usize ) ;
56- group. bench_function ( "create_key" , |b| b. iter ( || _create_key ( & mut manager. 0 , & manager. 1 , black_box ( counter. fetch_add ( 1usize , Ordering :: Relaxed ) ) ) ) ) ;
57- }
60+ fn _create_key ( context : & mut FapiContext , parent_path : & str , n : usize ) {
61+ context. create_key ( & format ! ( "{}/key_{}" , parent_path, n) , Some ( & FLAGS_SIGNING ) , None , None ) . expect ( "Failed to create key!" )
62+ }
5863
59- fn _create_key ( context : & mut FapiContext , parent_path : & str , n : usize ) {
60- context. create_key ( & format ! ( "{}/key_{}" , parent_path, n) , Some ( & FLAGS_SIGNING ) , None , None ) . expect ( "Failed to create key!" )
61- }
64+ /// Benchmark #3: Sign
65+ /// ------------------
66+ /// This benchmark measures the performance of the [`FapiContext::sign()`] function.
67+ fn sign < M : Measurement > ( group : & mut BenchmarkGroup < M > ) {
68+ // Initialize TPM
69+ let mut manager = TpmManager :: new ( ) ;
6270
63- /// Benchmark #3: Sign
64- /// ------------------
65- /// This benchmark measures the performance of the [`FapiContext::sign()`] function.
66- fn bench_sign < M : Measurement > ( group : & mut BenchmarkGroup < M > ) {
67- // Initialize TPM
68- let mut manager = TpmManager :: new ( ) ;
71+ // Create siging key
72+ let sign_key_path = format ! ( "{}/sign_key" , & manager. 1 ) ;
73+ manager. 0 . create_key ( & sign_key_path, Some ( & FLAGS_SIGNING ) , None , None ) . expect ( "Failed to create sign key!" ) ;
6974
70- // Create siging key
71- let sign_key_path = format ! ( "{}/sign_key" , & manager. 1 ) ;
72- manager. 0 . create_key ( & sign_key_path, Some ( & FLAGS_SIGNING ) , None , None ) . expect ( "Failed to create sign key!" ) ;
75+ // Measurement!
76+ let counter: AtomicUsize = AtomicUsize :: new ( 0usize ) ;
77+ group. bench_function ( "sign" , |b| b. iter ( || _sign ( & mut manager. 0 , & sign_key_path, black_box ( counter. fetch_add ( 1usize , Ordering :: Relaxed ) ) ) ) ) ;
78+ }
7379
74- // Measurement!
75- let counter: AtomicUsize = AtomicUsize :: new ( 0usize ) ;
76- group. bench_function ( "sign" , |b| b. iter ( || _sign ( & mut manager. 0 , & sign_key_path, black_box ( counter. fetch_add ( 1usize , Ordering :: Relaxed ) ) ) ) ) ;
77- }
80+ fn _sign ( context : & mut FapiContext , sign_key_path : & str , n : usize ) {
81+ let mut digest = [ 0u8 ; 32usize ] ;
82+ digest[ ..size_of :: < usize > ( ) ] . copy_from_slice ( & n. to_be_bytes ( ) ) ;
83+ let _signature = black_box ( context. sign ( sign_key_path, None , & digest, false , false ) . expect ( "Failed to sign message!" ) ) ;
84+ }
7885
79- fn _sign ( context : & mut FapiContext , sign_key_path : & str , n : usize ) {
80- let mut digest = [ 0u8 ; 32usize ] ;
81- digest[ ..size_of :: < usize > ( ) ] . copy_from_slice ( & n. to_be_bytes ( ) ) ;
82- let _signature = black_box ( context. sign ( sign_key_path, None , & digest, false , false ) . expect ( "Failed to sign message!" ) ) ;
83- }
86+ /// Benchmark #4: Verify signature
87+ /// ------------------------------
88+ /// This benchmark measures the performance of the [`FapiContext::verify_signature()`] function.
89+ fn verify_signature < M : Measurement > ( group : & mut BenchmarkGroup < M > ) {
90+ // Initialize TPM
91+ let mut manager = TpmManager :: new ( ) ;
8492
85- /// Benchmark #4: Verify signature
86- /// ------------------------------
87- /// This benchmark measures the performance of the [`FapiContext::verify_signature()`] function.
88- fn bench_verify_signature < M : Measurement > ( group : & mut BenchmarkGroup < M > ) {
89- // Initialize TPM
90- let mut manager = TpmManager :: new ( ) ;
91-
92- // Create siging key
93- let sign_key_path = format ! ( "{}/sign_key" , & manager. 1 ) ;
94- manager. 0 . create_key ( & sign_key_path, Some ( & FLAGS_SIGNING ) , None , None ) . expect ( "Failed to create sign key!" ) ;
95-
96- // Sign message
97- let digest = [ 0u8 ; 32usize ] ;
98- let signature = manager. 0 . sign ( & sign_key_path, None , & digest, false , false ) . expect ( "Failed to sign message!" ) ;
99-
100- // Measurement!
101- group. bench_function ( "verify_signature" , |b| {
102- b. iter ( || _verify_signature ( & mut manager. 0 , & sign_key_path, black_box ( & digest) , & black_box ( & signature) . sign_value ) )
103- } ) ;
104- }
93+ // Create siging key
94+ let sign_key_path = format ! ( "{}/sign_key" , & manager. 1 ) ;
95+ manager. 0 . create_key ( & sign_key_path, Some ( & FLAGS_SIGNING ) , None , None ) . expect ( "Failed to create sign key!" ) ;
96+
97+ // Sign message
98+ let digest = [ 0u8 ; 32usize ] ;
99+ let signature = manager. 0 . sign ( & sign_key_path, None , & digest, false , false ) . expect ( "Failed to sign message!" ) ;
100+
101+ // Measurement!
102+ group. bench_function ( "verify_signature" , |b| {
103+ b. iter ( || _verify_signature ( & mut manager. 0 , & sign_key_path, black_box ( & digest) , & black_box ( & signature) . sign_value ) )
104+ } ) ;
105+ }
106+
107+ fn _verify_signature ( context : & mut FapiContext , sign_key_path : & str , digest : & [ u8 ] , signature : & [ u8 ] ) {
108+ let result = black_box ( context. verify_signature ( sign_key_path, digest, signature) . expect ( "Failed to verify signature!" ) ) ;
109+ assert ! ( result) ;
110+ }
105111
106- fn _verify_signature ( context : & mut FapiContext , sign_key_path : & str , digest : & [ u8 ] , signature : & [ u8 ] ) {
107- let result = black_box ( context. verify_signature ( sign_key_path, digest, signature) . expect ( "Failed to verify signature!" ) ) ;
108- assert ! ( result) ;
112+ /// FAPI benchmarks runner
113+ /// ----------------------
114+ /// This is the entry point for running the `fapi_rs` benchmarks
115+ pub fn run ( c : & mut Criterion ) {
116+ let mut group = c. benchmark_group ( "fapi_rs" ) ;
117+ group. sampling_mode ( SamplingMode :: Flat ) . warm_up_time ( Duration :: from_secs ( 12 ) ) . measurement_time ( Duration :: from_secs ( 30 ) ) ;
118+
119+ // Run benchmarks
120+ get_random ( & mut group) ;
121+ create_key ( & mut group) ;
122+ sign ( & mut group) ;
123+ verify_signature ( & mut group) ;
124+
125+ // Finish benchmark
126+ group. finish ( ) ;
127+ }
109128}
110129
111130// ==========================================================================
@@ -167,19 +186,5 @@ impl Drop for TpmManager {
167186// Main
168187// ==========================================================================
169188
170- fn bench ( c : & mut Criterion ) {
171- let mut group = c. benchmark_group ( "fapi_rs" ) ;
172- group. sampling_mode ( SamplingMode :: Flat ) . warm_up_time ( Duration :: from_secs ( 12 ) ) . measurement_time ( Duration :: from_secs ( 30 ) ) ;
173-
174- // Run benchmarks
175- bench_get_random ( & mut group) ;
176- bench_create_key ( & mut group) ;
177- bench_sign ( & mut group) ;
178- bench_verify_signature ( & mut group) ;
179-
180- // Finish benchmark
181- group. finish ( ) ;
182- }
183-
184- criterion_group ! ( benches, bench) ;
189+ criterion_group ! ( benches, bench_fapi:: run) ;
185190criterion_main ! ( benches) ;
0 commit comments