1 // Copyright 2015-present 650 Industries. All rights reserved.
2 
3 import Foundation
4 import ABI49_0_0EXStructuredHeaders
5 
6 struct SignatureHeaderFields {
7   static let SignatureFieldKey = "sig"
8   static let KeyIdFieldKey = "keyid"
9   static let AlgorithmFieldKey = "alg"
10 }
11 
12 internal final class SignatureHeaderInfo {
13   static let DefaultKeyId = "root"
14 
15   let signature: String
16   let keyId: String
17   let algorithm: CodeSigningAlgorithm
18 
19   private init(signature: String, keyId: String, algorithm: CodeSigningAlgorithm) {
20     self.signature = signature
21     self.keyId = keyId
22     self.algorithm = algorithm
23   }
24 
parseSignatureHeadernull25   static func parseSignatureHeader(signatureHeader: String) throws -> SignatureHeaderInfo {
26     let parser = ABI49_0_0EXStructuredHeadersParser(
27       rawInput: signatureHeader,
28       fieldType: ABI49_0_0EXStructuredHeadersParserFieldType.dictionary,
29       ignoringParameters: true
30     )
31     guard let parserOutputDictionary = try parser.parseStructuredFields() as? [String: String] else {
32       throw CodeSigningError.SignatureHeaderStructuredFieldParseError
33     }
34 
35     guard let signatureFieldValue = parserOutputDictionary[SignatureHeaderFields.SignatureFieldKey] else {
36       throw CodeSigningError.SignatureHeaderSigMissing
37     }
38 
39     return SignatureHeaderInfo(
40       signature: signatureFieldValue,
41       keyId: parserOutputDictionary[SignatureHeaderFields.KeyIdFieldKey] ?? SignatureHeaderInfo.DefaultKeyId,
42       algorithm: try CodeSigningAlgorithm.parseFromString(parserOutputDictionary[SignatureHeaderFields.AlgorithmFieldKey])
43     )
44   }
45 }
46