Skip to content

Commit ccbde9e

Browse files
Merge pull request #34 from Rudde/check-signing-time
adding check on signatures signing time
2 parents 6c4590a + c853c02 commit ccbde9e

4 files changed

Lines changed: 41 additions & 3 deletions

File tree

PassValidator.Console/VerbosePrinter.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ public static void PrintValidationResults(bool isVerbose, ValidationResult valid
2525
System.Console.WriteLine($"\tSigned By Apple: {validationResult.SignedByApple}");
2626
System.Console.WriteLine($"\tSignature Expiration Date: {validationResult.SignatureExpirationDate}");
2727
System.Console.WriteLine($"\tSignature Valid: {validationResult.SignatureValid}");
28+
System.Console.WriteLine($"\tSigning Time: {validationResult.SigningTime?.ToString("o") ?? "<null>"}");
2829
System.Console.WriteLine($"\tHas Icon 3x: {validationResult.HasIcon3x}");
2930
System.Console.WriteLine($"\tHas Icon 2x: {validationResult.HasIcon2x}");
3031
System.Console.WriteLine($"\tHas Icon 1x: {validationResult.HasIcon1x}");

PassValidator.Validator/ValidationResult.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ public class ValidationResult
1919
public string SignatureExpirationDate { get; set; }
2020

2121
public bool SignatureValid { get; set; }
22+
23+
public DateTime? SigningTime { get; set; }
2224

2325
public bool HasIcon3x { get; set; }
2426

@@ -69,4 +71,4 @@ public class ValidationResult
6971

7072
public bool AuthenticationTokenCorrectLength { get; internal set; }
7173
public bool PassKitCertificateIssuedByApple { get; internal set; }
72-
}
74+
}

PassValidator.Validator/Validator.cs

Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
using System.IO.Compression;
2+
using System.Security.Cryptography;
23
using System.Security.Cryptography.Pkcs;
3-
using System.Security.Cryptography.X509Certificates;
44
using System.Text;
55
using Newtonsoft.Json.Linq;
66
using Org.BouncyCastle.Asn1;
@@ -157,6 +157,11 @@ public ValidationResult Validate(byte[] passContent)
157157
result.SignatureValid = false;
158158
}
159159

160+
if (result.SignatureValid)
161+
{
162+
result.SigningTime = GetSigningTime(signedCms);
163+
}
164+
160165
var signer = signedCms.SignerInfos[0];
161166

162167
// There are two certificates attached. One is the PassType certificate. One is the WWDR certificate.
@@ -280,4 +285,31 @@ public static List<string> Parse(string data, string delimiter)
280285
}
281286
return result;
282287
}
283-
}
288+
289+
private static DateTime? GetSigningTime(SignedCms cms)
290+
{
291+
try
292+
{
293+
foreach (SignerInfo signer in cms.SignerInfos)
294+
{
295+
foreach (CryptographicAttributeObject attr in signer.SignedAttributes)
296+
{
297+
if (attr.Oid.Value == "1.2.840.113549.1.9.5")
298+
{
299+
foreach (var value in attr.Values)
300+
{
301+
var pkcs9 = new Pkcs9SigningTime(value.RawData);
302+
return pkcs9.SigningTime;
303+
}
304+
}
305+
}
306+
}
307+
}
308+
catch (Exception)
309+
{
310+
// ignored
311+
}
312+
313+
return null;
314+
}
315+
}

PassValidator.Web/Views/Home/Index.cshtml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,7 @@
154154
<h3>Signature</h3>
155155
<ul>
156156
<li><i data-bind="css: getStyle(hasMatchingPassTypeIdentifier())"></i>PassTypeIdentifier in signature matches value in pass.json</li>
157+
<li><i data-bind="css: getStyle(hasSigningTime())"></i>Signature has signing time</li>
157158
<li><i data-bind="css: getStyle(hasMatchingTeamIdentifier())"></i>TeamIdentifier in signature matches value in pass.json</li>
158159
</ul>
159160
<h3>WWDR Certificate</h3>
@@ -272,6 +273,7 @@
272273
273274
self.hasMatchingPassTypeIdentifier(jsonResponse.passTypeIdentifierMatches);
274275
self.hasMatchingTeamIdentifier(jsonResponse.teamIdentifierMatches);
276+
self.hasSigningTime(jsonResponse.signingTime);
275277
276278
self.wwdrCertificateFound(jsonResponse.wwdrCertificateFound);
277279
self.wwdrCertificateIsCorrectVersion(jsonResponse.wwdrCertificateIsCorrectVersion);
@@ -321,6 +323,7 @@
321323
322324
self.hasMatchingPassTypeIdentifier = ko.observable(false);
323325
self.hasMatchingTeamIdentifier = ko.observable(false);
326+
self.hasSigningTime = ko.observable(false);
324327
self.signedByApple = ko.observable(false);
325328
326329
self.passKitCertificateFound = ko.observable(false);

0 commit comments

Comments
 (0)