1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
|
//===----------------------------------------------------------------------===//
//
// This source file is part of the SwiftCertificates open source project
//
// Copyright (c) 2023 Apple Inc. and the SwiftCertificates project authors
// Licensed under Apache License v2.0
//
// See LICENSE.txt for license information
// See CONTRIBUTORS.txt for the list of SwiftCertificates project authors
//
// SPDX-License-Identifier: Apache-2.0
//
//===----------------------------------------------------------------------===//
import SwiftASN1
/// ``CMSSignerIdentifier`` is defined in ASN.1 as:
/// ```
/// SignerIdentifier ::= CHOICE {
/// issuerAndSerialNumber IssuerAndSerialNumber,
/// subjectKeyIdentifier [0] SubjectKeyIdentifier }
/// ```
@usableFromInline
enum CMSSignerIdentifier: DERParseable, DERSerializable, Hashable, Sendable {
@usableFromInline
static let skiIdentifier = ASN1Identifier(tagWithNumber: 0, tagClass: .contextSpecific)
case issuerAndSerialNumber(CMSIssuerAndSerialNumber)
case subjectKeyIdentifier(SubjectKeyIdentifier)
@inlinable
init(derEncoded node: ASN1Node) throws {
switch node.identifier {
case CMSIssuerAndSerialNumber.defaultIdentifier:
self = try .issuerAndSerialNumber(.init(derEncoded: node))
case Self.skiIdentifier:
self = try .subjectKeyIdentifier(
.init(keyIdentifier: .init(derEncoded: node, withIdentifier: Self.skiIdentifier))
)
default:
throw ASN1Error.unexpectedFieldType(node.identifier)
}
}
@inlinable
func serialize(into coder: inout DER.Serializer) throws {
switch self {
case .issuerAndSerialNumber(let issuerAndSerialNumber):
try issuerAndSerialNumber.serialize(into: &coder)
case .subjectKeyIdentifier(let subjectKeyIdentifier):
try subjectKeyIdentifier.keyIdentifier.serialize(into: &coder, withIdentifier: Self.skiIdentifier)
}
}
@inlinable
init(issuerAndSerialNumber certificate: Certificate) {
self = .issuerAndSerialNumber(.init(issuer: certificate.issuer, serialNumber: certificate.serialNumber))
}
}
|