Skip to content

Commit 6cc9728

Browse files
committed
Added fractional time and new tests
1 parent 41c26ef commit 6cc9728

File tree

2 files changed

+627
-1
lines changed

2 files changed

+627
-1
lines changed

crypto/src/tsp/TimeStampTokenGenerator.cs

Lines changed: 76 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
using System;
22
using System.Collections;
33
using System.IO;
4+
using System.Text;
45
using Org.BouncyCastle.Asn1;
6+
using Org.BouncyCastle.Asn1.Cms;
57
using Org.BouncyCastle.Asn1.Ess;
68
using Org.BouncyCastle.Asn1.Oiw;
79
using Org.BouncyCastle.Asn1.Pkcs;
@@ -17,6 +19,11 @@
1719

1820
namespace Org.BouncyCastle.Tsp
1921
{
22+
public enum Resolution
23+
{
24+
R_SECONDS, R_TENTHS_OF_SECONDS, R_HUNDREDTHS_OF_SECONDS, R_MILLISECONDS
25+
}
26+
2027
public class TimeStampTokenGenerator
2128
{
2229
private int accuracySeconds = -1;
@@ -31,6 +38,14 @@ public class TimeStampTokenGenerator
3138
private SignerInfoGenerator signerInfoGenerator;
3239
IDigestFactory digestCalculator;
3340

41+
private Resolution resolution = Resolution.R_SECONDS;
42+
43+
public Resolution Resolution
44+
{
45+
get { return resolution; }
46+
set { resolution = value; }
47+
}
48+
3449
/**
3550
* basic creation - only the default attributes will be included here.
3651
*/
@@ -289,8 +304,18 @@ public TimeStampToken Generate(
289304
tsaPolicy = new DerObjectIdentifier(request.ReqPolicy);
290305
}
291306

307+
DerGeneralizedTime generalizedTime;
308+
if (resolution != Resolution.R_SECONDS)
309+
{
310+
generalizedTime = new DerGeneralizedTime(createGeneralizedTime(genTime));
311+
} else
312+
{
313+
generalizedTime = new DerGeneralizedTime(genTime);
314+
}
315+
316+
292317
TstInfo tstInfo = new TstInfo(tsaPolicy, messageImprint,
293-
new DerInteger(serialNumber), new DerGeneralizedTime(genTime), accuracy,
318+
new DerInteger(serialNumber), generalizedTime, accuracy,
294319
derOrdering, nonce, tsa, request.Extensions);
295320

296321
try
@@ -333,6 +358,56 @@ public TimeStampToken Generate(
333358
// }
334359
}
335360

361+
private string createGeneralizedTime(DateTime genTime)
362+
{
363+
String format = "yyyyMMddHHmmss.fff";
364+
365+
StringBuilder sBuild = new StringBuilder(genTime.ToString(format));
366+
int dotIndex = sBuild.ToString().IndexOf(".");
367+
368+
if (dotIndex <0)
369+
{
370+
sBuild.Append("Z");
371+
return sBuild.ToString();
372+
}
373+
374+
switch(resolution)
375+
{
376+
case Resolution.R_TENTHS_OF_SECONDS:
377+
if (sBuild.Length > dotIndex + 2)
378+
{
379+
sBuild.Remove(dotIndex + 2, sBuild.Length-(dotIndex+2));
380+
}
381+
break;
382+
case Resolution.R_HUNDREDTHS_OF_SECONDS:
383+
if (sBuild.Length > dotIndex + 3)
384+
{
385+
sBuild.Remove(dotIndex + 3, sBuild.Length-(dotIndex+3));
386+
}
387+
break;
388+
389+
390+
case Resolution.R_SECONDS:
391+
case Resolution.R_MILLISECONDS:
392+
// do nothing.
393+
break;
394+
395+
}
396+
397+
398+
while (sBuild[sBuild.Length - 1] == '0')
399+
{
400+
sBuild.Remove(sBuild.Length - 1,1);
401+
}
402+
403+
if (sBuild.Length - 1 == dotIndex)
404+
{
405+
sBuild.Remove(sBuild.Length - 1, 1);
406+
}
407+
408+
sBuild.Append("Z");
409+
return sBuild.ToString();
410+
}
336411

337412
private class TableGen : CmsAttributeTableGenerator
338413
{

0 commit comments

Comments
 (0)