-
-
Notifications
You must be signed in to change notification settings - Fork 74
Expand file tree
/
Copy pathAlgorithmFinderTests.pas
More file actions
251 lines (225 loc) · 9.14 KB
/
AlgorithmFinderTests.pas
File metadata and controls
251 lines (225 loc) · 9.14 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
{ *********************************************************************************** }
{ * CryptoLib Library * }
{ * Author - Ugochukwu Mmaduekwe * }
{ * Github Repository <https://github.com/Xor-el> * }
{ * * }
{ * Distributed under the MIT software license, see the accompanying file LICENSE * }
{ * or visit http://www.opensource.org/licenses/mit-license.php. * }
{ * * }
{ * Acknowledgements: * }
{ * * }
{ * Thanks to Sphere 10 Software (http://www.sphere10.com/) for sponsoring * }
{ * the development of this library * }
{ * ******************************************************************************* * }
(* &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& *)
unit AlgorithmFinderTests;
interface
{$IFDEF FPC}
{$MODE DELPHI}
{$ENDIF FPC}
uses
SysUtils,
{$IFDEF FPC}
fpcunit,
testregistry,
{$ELSE}
TestFramework,
{$ENDIF FPC}
ClpAsn1Objects,
ClpIAsn1Objects,
ClpIX509Asn1Objects,
ClpX509Asn1Objects,
ClpPkcsObjectIdentifiers,
ClpNistObjectIdentifiers,
ClpOiwObjectIdentifiers,
ClpEdECObjectIdentifiers,
ClpX9ObjectIdentifiers,
ClpPkcsRsaAsn1Objects,
ClpIPkcsRsaAsn1Objects,
ClpDefaultDigestAlgorithmFinder,
ClpIDigestAlgorithmFinder,
ClpDefaultMacAlgorithmFinder,
ClpIMacAlgorithmFinder,
ClpDefaultSignatureAlgorithmFinder,
ClpISignatureAlgorithmFinder,
ClpX509Utilities,
ClpCryptoLibTypes,
CryptoLibTestBase;
type
TAlgorithmFinderTest = class(TCryptoLibAlgorithmTestCase)
published
procedure TestDigestFindByName;
procedure TestDigestFindBySignatureAlgorithm;
procedure TestDigestFindByOid;
procedure TestDigestFindPssDelegation;
procedure TestDigestFindUnknownName;
procedure TestDigestFindNilOid;
procedure TestMacFindKnown;
procedure TestMacFindUnknown;
procedure TestSignatureFindKnown;
procedure TestSignatureFindPss;
procedure TestSignatureFindEd25519;
procedure TestSignatureFindEcdsa;
procedure TestSignatureFindUnknown;
end;
implementation
{ TAlgorithmFinderTest }
procedure TAlgorithmFinderTest.TestDigestFindByName;
var
LDigestAlg: IAlgorithmIdentifier;
begin
LDigestAlg := TDefaultDigestAlgorithmFinder.Instance.Find('SHA-256');
CheckNotNull(LDigestAlg, 'digest algorithm should not be nil');
CheckTrue(LDigestAlg.Algorithm.Equals(TNistObjectIdentifiers.IdSha256),
'SHA-256 digest OID mismatch');
end;
procedure TAlgorithmFinderTest.TestDigestFindBySignatureAlgorithm;
var
LSignatureAlg, LDigestAlg: IAlgorithmIdentifier;
begin
LSignatureAlg := TAlgorithmIdentifier.Create(TPkcsObjectIdentifiers.Sha256WithRsaEncryption,
TDerNull.Instance);
LDigestAlg := TDefaultDigestAlgorithmFinder.Instance.Find(LSignatureAlg);
CheckNotNull(LDigestAlg, 'digest algorithm should not be nil');
CheckTrue(LDigestAlg.Algorithm.Equals(TNistObjectIdentifiers.IdSha256),
'signature-to-digest OID mismatch');
end;
procedure TAlgorithmFinderTest.TestDigestFindByOid;
var
LDigestAlg: IAlgorithmIdentifier;
begin
LDigestAlg := TDefaultDigestAlgorithmFinder.Instance.Find(TNistObjectIdentifiers.IdSha384);
CheckNotNull(LDigestAlg, 'digest algorithm should not be nil');
CheckTrue(LDigestAlg.Algorithm.Equals(TNistObjectIdentifiers.IdSha384),
'digest OID mismatch');
end;
procedure TAlgorithmFinderTest.TestDigestFindPssDelegation;
var
LHashAlgId, LSignatureAlg, LDigestAlg: IAlgorithmIdentifier;
LPssParams: IRsassaPssParameters;
begin
LHashAlgId := TAlgorithmIdentifier.Create(TNistObjectIdentifiers.IdSha256, TDerNull.Instance);
LPssParams := TRsassaPssParameters.Create(LHashAlgId,
TAlgorithmIdentifier.Create(TPkcsObjectIdentifiers.IdMgf1, LHashAlgId) as IAlgorithmIdentifier,
TDerInteger.Create(32) as IDerInteger, TRsassaPssParameters.DefaultTrailerField);
LSignatureAlg := TAlgorithmIdentifier.Create(TPkcsObjectIdentifiers.IdRsassaPss, LPssParams);
LDigestAlg := TDefaultDigestAlgorithmFinder.Instance.Find(LSignatureAlg);
CheckNotNull(LDigestAlg, 'PSS digest algorithm should not be nil');
CheckTrue(LDigestAlg.Algorithm.Equals(TNistObjectIdentifiers.IdSha256),
'PSS digest OID mismatch');
end;
procedure TAlgorithmFinderTest.TestDigestFindUnknownName;
var
LDigestAlg: IAlgorithmIdentifier;
begin
LDigestAlg := TDefaultDigestAlgorithmFinder.Instance.Find('UNKNOWN-DIGEST-NAME');
CheckNull(LDigestAlg, 'unknown digest name should return nil');
end;
procedure TAlgorithmFinderTest.TestDigestFindNilOid;
var
LNilOid: IDerObjectIdentifier;
begin
LNilOid := nil;
try
TDefaultDigestAlgorithmFinder.Instance.Find(LNilOid);
Fail('expected EArgumentNilCryptoLibException');
except
on E: EArgumentNilCryptoLibException do
CheckEquals('digestOid', E.Message);
end;
end;
procedure TAlgorithmFinderTest.TestMacFindKnown;
var
LMacAlg: IAlgorithmIdentifier;
begin
LMacAlg := TDefaultMacAlgorithmFinder.Instance.Find('HMACSHA256');
CheckNotNull(LMacAlg, 'HMACSHA256 should not be nil');
CheckTrue(LMacAlg.Algorithm.Equals(TPkcsObjectIdentifiers.IdHmacWithSha256),
'HMACSHA256 OID mismatch');
CheckTrue(LMacAlg.Parameters.Equals(TDerNull.Instance), 'HMACSHA256 params should be NULL');
LMacAlg := TDefaultMacAlgorithmFinder.Instance.Find('HMACSHA1');
CheckNotNull(LMacAlg, 'HMACSHA1 should not be nil');
CheckTrue(LMacAlg.Algorithm.Equals(TOiwObjectIdentifiers.IdSha1),
'HMACSHA1 OID mismatch');
CheckTrue(TX509Utilities.IsAbsentParameters(LMacAlg.Parameters),
'HMACSHA1 params should be absent');
LMacAlg := TDefaultMacAlgorithmFinder.Instance.Find('HMACSHA3-512');
CheckNotNull(LMacAlg, 'HMACSHA3-512 should not be nil');
CheckTrue(LMacAlg.Algorithm.Equals(TNistObjectIdentifiers.IdHMacWithSha3_512),
'HMACSHA3-512 OID mismatch');
CheckTrue(TX509Utilities.IsAbsentParameters(LMacAlg.Parameters),
'HMACSHA3-512 params should be absent');
end;
procedure TAlgorithmFinderTest.TestMacFindUnknown;
var
LMacAlg: IAlgorithmIdentifier;
begin
LMacAlg := TDefaultMacAlgorithmFinder.Instance.Find('HMACUNKNOWN');
CheckNull(LMacAlg, 'unknown MAC name should return nil');
end;
procedure TAlgorithmFinderTest.TestSignatureFindKnown;
var
LSignatureAlg: IAlgorithmIdentifier;
begin
LSignatureAlg := TDefaultSignatureAlgorithmFinder.Instance.Find('SHA256WITHRSA');
CheckNotNull(LSignatureAlg, 'SHA256WITHRSA should not be nil');
CheckTrue(LSignatureAlg.Algorithm.Equals(TPkcsObjectIdentifiers.Sha256WithRsaEncryption),
'SHA256WITHRSA OID mismatch');
CheckTrue(LSignatureAlg.Parameters.Equals(TDerNull.Instance),
'SHA256WITHRSA params should be NULL');
end;
procedure TAlgorithmFinderTest.TestSignatureFindPss;
var
LSignatureAlg: IAlgorithmIdentifier;
LPssParams: IRsassaPssParameters;
begin
LSignatureAlg := TDefaultSignatureAlgorithmFinder.Instance.Find('SHA256WITHRSAANDMGF1');
CheckNotNull(LSignatureAlg, 'SHA256WITHRSAANDMGF1 should not be nil');
CheckTrue(LSignatureAlg.Algorithm.Equals(TPkcsObjectIdentifiers.IdRsassaPss),
'SHA256WITHRSAANDMGF1 OID mismatch');
LPssParams := TRsassaPssParameters.GetInstance(LSignatureAlg.Parameters);
CheckNotNull(LPssParams, 'PSS parameters should not be nil');
CheckTrue(LPssParams.HashAlgorithm.Algorithm.Equals(TNistObjectIdentifiers.IdSha256),
'PSS hash algorithm mismatch');
CheckEquals(32, LPssParams.SaltLength.IntValueExact, 'PSS salt length mismatch');
end;
procedure TAlgorithmFinderTest.TestSignatureFindEd25519;
var
LSignatureAlg: IAlgorithmIdentifier;
begin
LSignatureAlg := TDefaultSignatureAlgorithmFinder.Instance.Find('Ed25519');
CheckNotNull(LSignatureAlg, 'Ed25519 should not be nil');
CheckTrue(LSignatureAlg.Algorithm.Equals(TEdECObjectIdentifiers.IdEd25519),
'Ed25519 OID mismatch');
CheckTrue(TX509Utilities.IsAbsentParameters(LSignatureAlg.Parameters),
'Ed25519 params should be absent');
end;
procedure TAlgorithmFinderTest.TestSignatureFindEcdsa;
var
LSignatureAlg: IAlgorithmIdentifier;
begin
LSignatureAlg := TDefaultSignatureAlgorithmFinder.Instance.Find('SHA256WITHECDSA');
CheckNotNull(LSignatureAlg, 'SHA256WITHECDSA should not be nil');
CheckTrue(LSignatureAlg.Algorithm.Equals(TX9ObjectIdentifiers.ECDsaWithSha256),
'SHA256WITHECDSA OID mismatch');
CheckTrue(TX509Utilities.IsAbsentParameters(LSignatureAlg.Parameters),
'SHA256WITHECDSA params should be absent');
end;
procedure TAlgorithmFinderTest.TestSignatureFindUnknown;
begin
try
TDefaultSignatureAlgorithmFinder.Instance.Find('UNKNOWN-SIGNATURE-NAME');
Fail('expected EArgumentCryptoLibException');
except
on E: EArgumentCryptoLibException do
CheckTrue(Pos('Unknown signature name:', E.Message) > 0,
'Wrong exception message: ' + E.Message);
end;
end;
initialization
{$IFDEF FPC}
RegisterTest(TAlgorithmFinderTest);
{$ELSE}
RegisterTest(TAlgorithmFinderTest.Suite);
{$ENDIF FPC}
end.