@@ -60,4 +60,71 @@ final class CryptoTests: XCTestCase {
60
60
61
61
XCTAssertEqual ( decryptedText, msg)
62
62
}
63
+
64
+ func testGenerateAndValidateHmac( ) async throws {
65
+ let secret = try Crypto . secureRandomBytes ( count: 32 )
66
+ let info = try Crypto . secureRandomBytes ( count: 32 )
67
+ let message = try Crypto . secureRandomBytes ( count: 32 )
68
+ let hmac = try Crypto . generateHmacSignature ( secret: secret, info: info, message: message)
69
+ let key = try Crypto . hkdfHmacKey ( secret: secret, info: info)
70
+ let valid = Crypto . verifyHmacSignature ( key: key, signature: hmac, message: message)
71
+
72
+ XCTAssertTrue ( valid)
73
+ }
74
+
75
+ func testGenerateAndValidateHmacWithExportedKey( ) async throws {
76
+ let secret = try Crypto . secureRandomBytes ( count: 32 )
77
+ let info = try Crypto . secureRandomBytes ( count: 32 )
78
+ let message = try Crypto . secureRandomBytes ( count: 32 )
79
+ let hmac = try Crypto . generateHmacSignature ( secret: secret, info: info, message: message)
80
+ let key = try Crypto . hkdfHmacKey ( secret: secret, info: info)
81
+ let exportedKey = Crypto . exportHmacKey ( key: key)
82
+ let importedKey = Crypto . importHmacKey ( keyData: exportedKey)
83
+ let valid = Crypto . verifyHmacSignature ( key: importedKey, signature: hmac, message: message)
84
+
85
+ XCTAssertTrue ( valid)
86
+ }
87
+
88
+ func testGenerateDifferentHmacKeysWithDifferentInfos( ) async throws {
89
+ let secret = try Crypto . secureRandomBytes ( count: 32 )
90
+ let info1 = try Crypto . secureRandomBytes ( count: 32 )
91
+ let info2 = try Crypto . secureRandomBytes ( count: 32 )
92
+ let key1 = try Crypto . hkdfHmacKey ( secret: secret, info: info1)
93
+ let key2 = try Crypto . hkdfHmacKey ( secret: secret, info: info2)
94
+ let exportedKey1 = Crypto . exportHmacKey ( key: key1)
95
+ let exportedKey2 = Crypto . exportHmacKey ( key: key2)
96
+
97
+ XCTAssertNotEqual ( exportedKey1, exportedKey2)
98
+ }
99
+
100
+ func testValidateHmacWithWrongMessage( ) async throws {
101
+ let secret = try Crypto . secureRandomBytes ( count: 32 )
102
+ let info = try Crypto . secureRandomBytes ( count: 32 )
103
+ let message = try Crypto . secureRandomBytes ( count: 32 )
104
+ let hmac = try Crypto . generateHmacSignature ( secret: secret, info: info, message: message)
105
+ let key = try Crypto . hkdfHmacKey ( secret: secret, info: info)
106
+ let valid = Crypto . verifyHmacSignature (
107
+ key: key,
108
+ signature: hmac,
109
+ message: try Crypto . secureRandomBytes ( count: 32 )
110
+ )
111
+
112
+ XCTAssertFalse ( valid)
113
+ }
114
+
115
+ func testValidateHmacWithWrongKey( ) async throws {
116
+ let secret = try Crypto . secureRandomBytes ( count: 32 )
117
+ let info = try Crypto . secureRandomBytes ( count: 32 )
118
+ let message = try Crypto . secureRandomBytes ( count: 32 )
119
+ let hmac = try Crypto . generateHmacSignature ( secret: secret, info: info, message: message)
120
+ let valid = Crypto . verifyHmacSignature (
121
+ key: try Crypto . hkdfHmacKey (
122
+ secret: try Crypto . secureRandomBytes ( count: 32 ) ,
123
+ info: try Crypto . secureRandomBytes ( count: 32 ) ) ,
124
+ signature: hmac,
125
+ message: message
126
+ )
127
+
128
+ XCTAssertFalse ( valid)
129
+ }
63
130
}
0 commit comments