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