1
1
use std:: fmt;
2
2
3
- use aes:: cipher:: { consts:: U256 , typenum:: { IsLess , Le , NonZero } , BlockSizeUser , InvalidLength , KeyInit } ;
4
- use hmac:: { digest:: { block_buffer:: Eager , core_api:: { BufferKindUser , CoreProxy , FixedOutputCore , UpdateCore } , HashMarker } , Hmac , Mac } ;
5
- use sha2:: { Sha256 , Sha512 } ;
6
3
use super :: utils;
4
+ use aes:: cipher:: {
5
+ consts:: U256 ,
6
+ typenum:: { IsLess , Le , NonZero } ,
7
+ BlockSizeUser , InvalidLength , KeyInit ,
8
+ } ;
9
+ use hmac:: {
10
+ digest:: {
11
+ block_buffer:: Eager ,
12
+ core_api:: { BufferKindUser , CoreProxy , FixedOutputCore , UpdateCore } ,
13
+ HashMarker ,
14
+ } ,
15
+ Hmac , Mac ,
16
+ } ;
17
+ use sha2:: { Sha256 , Sha512 } ;
7
18
8
19
pub type HmacSha256 = Hmac < Sha256 > ;
9
20
pub type HmacSha512 = Hmac < Sha512 > ;
10
21
11
22
#[ derive( Clone , Copy , Debug ) ]
12
23
pub enum HmacError {
13
- InvalidKeyLength ( InvalidLength )
24
+ InvalidKeyLength ( InvalidLength ) ,
14
25
}
15
26
16
27
impl fmt:: Display for HmacError {
@@ -20,26 +31,31 @@ impl fmt::Display for HmacError {
20
31
}
21
32
impl std:: error:: Error for HmacError { }
22
33
23
-
24
34
/// Computes the hmac using the provided Hash algorithm.
25
- ///
35
+ ///
26
36
/// Usage:
27
37
/// ```
38
+ /// use stacks_rs::crypto::hmac::HmacSha256;
39
+ /// use stacks_rs::crypto::hmac::HmacSha512;
40
+ /// use stacks_rs::crypto::hmac::compute_hmac;
28
41
/// let digest_sha256 = compute_hmac::<HmacSha256>("what do ya want for nothing?".as_bytes(), "Jefe".as_bytes()).unwrap();
29
42
/// let digest_sha512 = compute_hmac::<HmacSha512>("what do ya want for nothing?".as_bytes(), "Jefe".as_bytes()).unwrap();
30
43
/// ```
31
- pub fn compute_hmac < D > ( payload : & [ u8 ] , mac_key : & [ u8 ] ) -> Result < Vec < u8 > , HmacError >
44
+ pub fn compute_hmac < D > ( payload : & [ u8 ] , mac_key : & [ u8 ] ) -> Result < Vec < u8 > , HmacError >
32
45
where
33
46
D : KeyInit + Mac ,
34
47
{
35
- let mut hmac_digest = <D as KeyInit >:: new_from_slice ( mac_key) . map_err ( |err|{
36
- HmacError :: InvalidKeyLength ( err)
37
- } ) ?;
48
+ let mut hmac_digest =
49
+ <D as KeyInit >:: new_from_slice ( mac_key) . map_err ( |err| HmacError :: InvalidKeyLength ( err) ) ?;
38
50
hmac_digest. update ( payload) ;
39
51
Ok ( hmac_digest. finalize ( ) . into_bytes ( ) . to_vec ( ) )
40
52
}
41
53
42
- pub fn get_pbkdf2_hmac_keys < D > ( password : & [ u8 ] , salt : Option < [ u8 ; 16 ] > , rounds : u32 ) -> ( Vec < u8 > , Vec < u8 > , Vec < u8 > , Vec < u8 > )
54
+ pub fn get_pbkdf2_hmac_keys < D > (
55
+ password : & [ u8 ] ,
56
+ salt : Option < [ u8 ; 16 ] > ,
57
+ rounds : u32 ,
58
+ ) -> ( Vec < u8 > , Vec < u8 > , Vec < u8 > , Vec < u8 > )
43
59
where
44
60
D : CoreProxy ,
45
61
D :: Core : Sync
61
77
} ;
62
78
let mut keys_and_iv = [ 0u8 ; 48 ] ;
63
79
pbkdf2:: pbkdf2_hmac :: < D > ( password, & salt, rounds, & mut keys_and_iv) ;
64
- ( keys_and_iv[ 0 ..16 ] . to_vec ( ) , keys_and_iv[ 16 ..32 ] . to_vec ( ) , keys_and_iv[ 32 ..48 ] . to_vec ( ) , salt)
80
+ (
81
+ keys_and_iv[ 0 ..16 ] . to_vec ( ) ,
82
+ keys_and_iv[ 16 ..32 ] . to_vec ( ) ,
83
+ keys_and_iv[ 32 ..48 ] . to_vec ( ) ,
84
+ salt,
85
+ )
65
86
}
66
87
67
88
#[ cfg( test) ]
@@ -74,17 +95,22 @@ mod tests {
74
95
* Test vector: https://datatracker.ietf.org/doc/html/rfc4231#section-4
75
96
*/
76
97
let digest = compute_hmac :: < HmacSha256 > (
77
- "what do ya want for nothing?" . as_bytes ( ) , "Jefe" . as_bytes ( )
78
- ) . unwrap ( ) ;
98
+ "what do ya want for nothing?" . as_bytes ( ) ,
99
+ "Jefe" . as_bytes ( ) ,
100
+ )
101
+ . unwrap ( ) ;
79
102
let hex_digest = hex:: encode ( digest) ;
80
- assert_eq ! ( hex_digest, "5bdcc146bf60754e6a042426089575c75a003f089d2739839dec58b964ec3843" ) ;
103
+ assert_eq ! (
104
+ hex_digest,
105
+ "5bdcc146bf60754e6a042426089575c75a003f089d2739839dec58b964ec3843"
106
+ ) ;
81
107
82
108
let digest = compute_hmac :: < HmacSha512 > (
83
- "what do ya want for nothing?" . as_bytes ( ) ,
84
- "Jefe" . as_bytes ( )
85
- ) . unwrap ( ) ;
109
+ "what do ya want for nothing?" . as_bytes ( ) ,
110
+ "Jefe" . as_bytes ( ) ,
111
+ )
112
+ . unwrap ( ) ;
86
113
let hex_digest = hex:: encode ( digest) ;
87
- assert_eq ! ( hex_digest,
88
- "164b7a7bfcf819e2e395fbe73b56e0a387bd64222e831fd610270cd7ea2505549758bf75c05a994a6d034f65f8f0e6fdcaeab1a34d4a6b4b636e070a38bce737" ) ;
114
+ assert_eq ! ( hex_digest, "164b7a7bfcf819e2e395fbe73b56e0a387bd64222e831fd610270cd7ea2505549758bf75c05a994a6d034f65f8f0e6fdcaeab1a34d4a6b4b636e070a38bce737" ) ;
89
115
}
90
- }
116
+ }
0 commit comments