@@ -40,6 +40,7 @@ interface
4040 ClpAsn1Core,
4141 ClpIAsn1Core,
4242 ClpCryptoLibTypes,
43+ ClpArrayUtilities,
4344 CryptoLibTestBase;
4445
4546type
@@ -58,6 +59,9 @@ TX509ExtensionsTest = class(TCryptoLibAlgorithmTestCase)
5859 procedure TestDuplicateExtensions ;
5960 procedure TestAllowedDuplicateExtensions ;
6061 procedure TestEqualsAndEquivalent ;
62+ procedure TestExtensionRoundTrip ;
63+ procedure TestExtensionsBridge ;
64+ procedure TestExtensionsGeneratorIExtension ;
6165
6266 end ;
6367
@@ -243,6 +247,80 @@ procedure TX509ExtensionsTest.TestEqualsAndEquivalent;
243247 end ;
244248end ;
245249
250+ procedure TX509ExtensionsTest.TestExtensionRoundTrip ;
251+ var
252+ LExt: IExtension;
253+ LDecoded: IExtension;
254+ LBytes: TCryptoLibByteArray;
255+ begin
256+ LExt := TExtension.Create(FOid1, TDerBoolean.False,
257+ TDerOctetString.FromContents([$01 , $02 , $03 ]));
258+ LBytes := LExt.GetEncoded();
259+ LDecoded := TExtension.GetInstance(LBytes);
260+ CheckTrue(LDecoded.ExtnID.Equals(FOid1), ' extnID' );
261+ CheckTrue(LDecoded.Critical.IsFalse, ' critical false' );
262+ CheckTrue(TArrayUtilities.AreEqual(LDecoded.ExtnValue.GetOctets(), LExt.ExtnValue.GetOctets()),
263+ ' extnValue' );
264+
265+ LExt := TExtension.Create(FOid2, TDerBoolean.True,
266+ TDerOctetString.FromContents([$0A]));
267+ LBytes := LExt.GetEncoded();
268+ LDecoded := TExtension.GetInstance(LBytes);
269+ CheckTrue(LDecoded.Critical.IsTrue, ' critical true' );
270+ end ;
271+
272+ procedure TX509ExtensionsTest.TestExtensionsBridge ;
273+ var
274+ LGen: IX509ExtensionsGenerator;
275+ LX509Exts: IX509Extensions;
276+ LExts, LRoundTrip: IExtensions;
277+ LBytes: TCryptoLibByteArray;
278+ begin
279+ LGen := TX509ExtensionsGenerator.Create();
280+ LGen.AddExtension(FOid1, True, TCryptoLibByteArray.Create(1 , 2 ));
281+ LGen.AddExtension(FOid2, False, TCryptoLibByteArray.Create(3 ));
282+ LX509Exts := LGen.Generate();
283+
284+ LExts := TExtensions.FromX509Extensions(LX509Exts);
285+ CheckTrue(LExts.Count = 2 , ' extensions count' );
286+ CheckTrue(LExts.Equivalent(TExtensions.FromX509Extensions(LX509Exts)), ' self equivalent' );
287+
288+ LRoundTrip := TExtensions.FromX509Extensions(TExtensions.ToX509Extensions(LExts));
289+ CheckTrue(LExts.Equivalent(LRoundTrip), ' bridge round-trip' );
290+
291+ LBytes := LExts.GetEncoded();
292+ CheckTrue(TExtensions.GetInstance(TAsn1Sequence.GetInstance(LBytes)).Equivalent(LExts),
293+ ' encoded round-trip' );
294+ end ;
295+
296+ procedure TX509ExtensionsTest.TestExtensionsGeneratorIExtension ;
297+ var
298+ LExtGen: IX509ExtensionsGenerator;
299+ LExtension: IExtension;
300+ LExts: IX509Extensions;
301+ LReplacement: IExtension;
302+ begin
303+ LExtension := TExtension.Create(FOid1, TDerBoolean.False,
304+ TDerOctetString.FromContents([$05 ]));
305+ LExtGen := TX509ExtensionsGenerator.Create();
306+ LExtGen.AddExtension(LExtension);
307+ LExts := LExtGen.Generate();
308+ CheckNotNull(LExts.GetExtension(FOid1), ' added via IExtension' );
309+
310+ LReplacement := TExtension.Create(FOid1, TDerBoolean.True,
311+ TDerOctetString.FromContents([$06 ]));
312+ LExtGen.ReplaceExtension(LReplacement);
313+ LExts := LExtGen.Generate();
314+ CheckTrue(LExts.GetExtension(FOid1).IsCritical, ' replaced critical flag' );
315+ CheckTrue(TArrayUtilities.AreEqual(LExts.GetExtension(FOid1).Value .GetOctets(),
316+ LReplacement.ExtnValue.GetOctets()), ' replaced value' );
317+
318+ LExtGen.Reset();
319+ LExtGen.AddExtensions(TExtensions.Create(LExtension) as IExtensions);
320+ LExts := LExtGen.Generate();
321+ CheckNotNull(LExts.GetExtension(FOid1), ' added via IExtensions' );
322+ end ;
323+
246324initialization
247325
248326{ $IFDEF FPC}
0 commit comments