Skip to content

Commit 39aa8e7

Browse files
authored
Merge branch 'main' into cb-remove-warnings
2 parents 749b1c9 + c2ca943 commit 39aa8e7

22 files changed

+868
-884
lines changed

Sources/X509/CryptographicMessageSyntax/CMSSignerIdentifier.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ enum CMSSignerIdentifier: DERParseable, DERSerializable, Hashable {
2525
private static let skiIdentifier = ASN1Identifier(tagWithNumber: 0, tagClass: .contextSpecific)
2626

2727
case issuerAndSerialNumber(CMSIssuerAndSerialNumber)
28-
case subjectKeyIdentifier(Certificate.Extensions.SubjectKeyIdentifier)
28+
case subjectKeyIdentifier(SubjectKeyIdentifier)
2929

3030
init(derEncoded node: ASN1Node) throws {
3131
switch node.identifier {

Sources/X509/Docs.docc/Creating Certificates.md

+9-9
Original file line numberDiff line numberDiff line change
@@ -84,22 +84,22 @@ certificate. For self-signed certificates, the issuer and the subject are identi
8484
The bulk of the semantic information in a certificate is contained in its extensions. For our case, we care about only a small
8585
few.
8686

87-
We need ``Certificate/Extensions-swift.struct/BasicConstraints-swift.enum`` to be present, and set to
88-
`isCertificateAuthority`. We also need ``Certificate/Extensions-swift.struct/KeyUsage-swift.struct`` with the appropriate bits
89-
set. Finally, we want to set ``Certificate/Extensions-swift.struct/SubjectAlternativeNames-swift.struct`` to include the domain
87+
We need ``BasicConstraints`` to be present, and set to
88+
`isCertificateAuthority`. We also need ``KeyUsage`` with the appropriate bits
89+
set. Finally, we want to set ``SubjectAlternativeNames`` to include the domain
9090
name we're going to be self-signing for, which in this case we'll set to `localhost`.
9191

9292
We can use the helpful builder syntax for this:
9393

9494
```swift
9595
let extensions = try Certificate.Extensions {
9696
Critical(
97-
Certificate.Extensions.BasicConstraints.isCertificateAuthority(maxPathLength: nil)
97+
BasicConstraints.isCertificateAuthority(maxPathLength: nil)
9898
)
9999
Critical(
100-
Certificate.Extensions.KeyUsage(digitalSignature: true, keyCertSign: true)
100+
KeyUsage(digitalSignature: true, keyCertSign: true)
101101
)
102-
Certificate.Extensions.SubjectAlternativeNames([.dNSName("localhost")])
102+
SubjectAlternativeNames([.dNSName("localhost")])
103103
}
104104
```
105105

@@ -152,12 +152,12 @@ let now = Date()
152152

153153
let extensions = try Certificate.Extensions {
154154
Critical(
155-
Certificate.Extensions.BasicConstraints.isCertificateAuthority(maxPathLength: nil)
155+
BasicConstraints.isCertificateAuthority(maxPathLength: nil)
156156
)
157157
Critical(
158-
Certificate.Extensions.KeyUsage(keyCertSign: true)
158+
KeyUsage(keyCertSign: true)
159159
)
160-
Certificate.Extensions.SubjectAlternativeNames([.dNSName("localhost")])
160+
SubjectAlternativeNames([.dNSName("localhost")])
161161
}
162162

163163
let certificate = try Certificate(

Sources/X509/Docs.docc/Examining Certificates.md

+19-19
Original file line numberDiff line numberDiff line change
@@ -99,22 +99,22 @@ bytes in an extension, as well as wrap themselves back into the opaque ``Certifi
9999

100100
Out of the box, ``X509`` ships support for the following extension types:
101101

102-
- ``Certificate/Extensions-swift.struct/AuthorityInformationAccess-swift.struct``
103-
- ``Certificate/Extensions-swift.struct/AuthorityKeyIdentifier-swift.struct``
104-
- ``Certificate/Extensions-swift.struct/BasicConstraints-swift.enum``
105-
- ``Certificate/Extensions-swift.struct/ExtendedKeyUsage-swift.struct``
106-
- ``Certificate/Extensions-swift.struct/KeyUsage-swift.struct``
107-
- ``Certificate/Extensions-swift.struct/NameConstraints-swift.struct``
108-
- ``Certificate/Extensions-swift.struct/SubjectAlternativeNames-swift.struct``
109-
- ``Certificate/Extensions-swift.struct/SubjectKeyIdentifier-swift.struct``
102+
- ``AuthorityInformationAccess``
103+
- ``AuthorityKeyIdentifier``
104+
- ``BasicConstraints``
105+
- ``ExtendedKeyUsage``
106+
- ``KeyUsage``
107+
- ``NameConstraints``
108+
- ``SubjectAlternativeNames``
109+
- ``SubjectKeyIdentifier``
110110

111111
To decode an extension usually requires examining its ``Certificate/Extension/oid`` field. For example, to search
112-
for the ``Certificate/Extensions-swift.struct/SubjectAlternativeNames-swift.struct``, the typical code would be:
112+
for the ``SubjectAlternativeNames``, the typical code would be:
113113

114114
```swift
115115
let opaqueSANExtension = certificate.extensions.first(where: { $0.oid == .X509ExtensionID.subjectAlternativeName })
116116
if let opaqueSanExtension {
117-
let unwrappedSanExtension = try Certificate.Extensions.SubjectAlternativeName(opaqueSanExtension)
117+
let unwrappedSanExtension = try SubjectAlternativeName(opaqueSanExtension)
118118
}
119119
```
120120

@@ -123,21 +123,21 @@ to search for a specific extension. The above code could be replaced by:
123123

124124
```swift
125125
if let opaqueSanExtension = certificate.extensions[oid: .X509ExtensionID.subjectAlternativeName] {
126-
let unwrappedSanExtension = try Certificate.Extensions.SubjectAlternativeName(opaqueSanExtension)
126+
let unwrappedSanExtension = try SubjectAlternativeName(opaqueSanExtension)
127127
}
128128
```
129129

130130
This pattern is itself still somewhat repetitive, so ``Certificate/Extensions-swift.struct`` offers a number of helper properties
131131
that can be used to get a specific typed extension:
132132

133-
- ``Certificate/Extensions-swift.struct/authorityInformationAccess-swift.property``
134-
- ``Certificate/Extensions-swift.struct/authorityKeyIdentifier-swift.property``
135-
- ``Certificate/Extensions-swift.struct/basicConstraints-swift.property``
136-
- ``Certificate/Extensions-swift.struct/extendedKeyUsage-swift.property``
137-
- ``Certificate/Extensions-swift.struct/keyUsage-swift.property``
138-
- ``Certificate/Extensions-swift.struct/nameConstraints-swift.property``
139-
- ``Certificate/Extensions-swift.struct/subjectAlternativeNames-swift.property``
140-
- ``Certificate/Extensions-swift.struct/subjectKeyIdentifier-swift.property``
133+
- ``Certificate/Extensions-swift.struct/authorityInformationAccess``
134+
- ``Certificate/Extensions-swift.struct/authorityKeyIdentifier``
135+
- ``Certificate/Extensions-swift.struct/basicConstraints``
136+
- ``Certificate/Extensions-swift.struct/extendedKeyUsage``
137+
- ``Certificate/Extensions-swift.struct/keyUsage``
138+
- ``Certificate/Extensions-swift.struct/nameConstraints``
139+
- ``Certificate/Extensions-swift.struct/subjectAlternativeNames``
140+
- ``Certificate/Extensions-swift.struct/subjectKeyIdentifier``
141141

142142
This lets us reduce the above code to a single line:
143143

Sources/X509/Docs.docc/index.md

+8-8
Original file line numberDiff line numberDiff line change
@@ -47,14 +47,14 @@ certificate authorities, authenticating peers, and more.
4747

4848
### Supported Extension Types
4949

50-
- ``Certificate/Extensions-swift.struct/AuthorityInformationAccess-swift.struct``
51-
- ``Certificate/Extensions-swift.struct/AuthorityKeyIdentifier-swift.struct``
52-
- ``Certificate/Extensions-swift.struct/BasicConstraints-swift.enum``
53-
- ``Certificate/Extensions-swift.struct/ExtendedKeyUsage-swift.struct``
54-
- ``Certificate/Extensions-swift.struct/KeyUsage-swift.struct``
55-
- ``Certificate/Extensions-swift.struct/NameConstraints-swift.struct``
56-
- ``Certificate/Extensions-swift.struct/SubjectAlternativeNames-swift.struct``
57-
- ``Certificate/Extensions-swift.struct/SubjectKeyIdentifier-swift.struct``
50+
- ``AuthorityInformationAccess``
51+
- ``AuthorityKeyIdentifier``
52+
- ``BasicConstraints``
53+
- ``ExtendedKeyUsage``
54+
- ``KeyUsage``
55+
- ``NameConstraints``
56+
- ``SubjectAlternativeNames``
57+
- ``SubjectKeyIdentifier``
5858
- ``Critical``
5959

6060
### Names

Sources/X509/Extension Types/AuthorityInformationAccess.swift

+49-51
Original file line numberDiff line numberDiff line change
@@ -14,55 +14,53 @@
1414

1515
import SwiftASN1
1616

17-
extension Certificate.Extensions {
18-
/// Provides details on how to access information about the certificate issuer.
19-
///
20-
/// This extension behaves as a collection of ``Certificate/Extensions-swift.struct/AuthorityInformationAccess-swift.struct/AccessDescription`` objects.
17+
/// Provides details on how to access information about the certificate issuer.
18+
///
19+
/// This extension behaves as a collection of ``AuthorityInformationAccess/AccessDescription`` objects.
20+
///
21+
/// In practice this most commonly contains OCSP servers and links to the issuing CA certificate.
22+
public struct AuthorityInformationAccess {
23+
@usableFromInline
24+
var descriptions: [AccessDescription]
25+
26+
/// Create a new ``AuthorityInformationAccess/`` object
27+
/// containing specific access descriptions.
2128
///
22-
/// In practice this most commonly contains OCSP servers and links to the issuing CA certificate.
23-
public struct AuthorityInformationAccess {
24-
@usableFromInline
25-
var descriptions: [AccessDescription]
29+
/// - Parameter descriptions: The descriptions to include in the AIA extension.
30+
@inlinable
31+
public init<Descriptions: Sequence>(_ descriptions: Descriptions) where Descriptions.Element == AccessDescription {
32+
self.descriptions = Array(descriptions)
33+
}
2634

27-
/// Create a new ``Certificate/Extensions-swift.struct/AuthorityInformationAccess-swift.struct/`` object
28-
/// containing specific access descriptions.
29-
///
30-
/// - Parameter descriptions: The descriptions to include in the AIA extension.
31-
@inlinable
32-
public init<Descriptions: Sequence>(_ descriptions: Descriptions) where Descriptions.Element == AccessDescription {
33-
self.descriptions = Array(descriptions)
35+
/// Create a new ``AuthorityInformationAccess`` object
36+
/// by unwrapping a ``Certificate/Extension``.
37+
///
38+
/// - Parameter ext: The ``Certificate/Extension`` to unwrap
39+
/// - Throws: if the ``Certificate/Extension/oid`` is not equal to
40+
/// `ASN1ObjectIdentifier.X509ExtensionID.authorityInformationAccess`.
41+
@inlinable
42+
public init(_ ext: Certificate.Extension) throws {
43+
guard ext.oid == .X509ExtensionID.authorityInformationAccess else {
44+
throw CertificateError.incorrectOIDForExtension(reason: "Expected \(ASN1ObjectIdentifier.X509ExtensionID.authorityInformationAccess), got \(ext.oid)")
3445
}
3546

36-
/// Create a new ``Certificate/Extensions-swift.struct/AuthorityInformationAccess-swift.struct`` object
37-
/// by unwrapping a ``Certificate/Extension``.
38-
///
39-
/// - Parameter ext: The ``Certificate/Extension`` to unwrap
40-
/// - Throws: if the ``Certificate/Extension/oid`` is not equal to
41-
/// `ASN1ObjectIdentifier.X509ExtensionID.authorityInformationAccess`.
42-
@inlinable
43-
public init(_ ext: Certificate.Extension) throws {
44-
guard ext.oid == .X509ExtensionID.authorityInformationAccess else {
45-
throw CertificateError.incorrectOIDForExtension(reason: "Expected \(ASN1ObjectIdentifier.X509ExtensionID.authorityInformationAccess), got \(ext.oid)")
46-
}
47-
48-
let aiaSyntax = try AuthorityInfoAccessSyntax(derEncoded: ext.value)
49-
self.descriptions = aiaSyntax.descriptions.map { AccessDescription($0) }
50-
}
47+
let aiaSyntax = try AuthorityInfoAccessSyntax(derEncoded: ext.value)
48+
self.descriptions = aiaSyntax.descriptions.map { AccessDescription($0) }
5149
}
5250
}
5351

54-
extension Certificate.Extensions.AuthorityInformationAccess: Hashable { }
52+
extension AuthorityInformationAccess: Hashable { }
5553

56-
extension Certificate.Extensions.AuthorityInformationAccess: Sendable { }
54+
extension AuthorityInformationAccess: Sendable { }
5755

58-
extension Certificate.Extensions.AuthorityInformationAccess: CustomStringConvertible {
56+
extension AuthorityInformationAccess: CustomStringConvertible {
5957
public var description: String {
6058
return self.map { String(describing: $0) }.joined(separator: ", ")
6159
}
6260
}
6361

6462
// TODO(cory): Probably also RangeReplaceableCollection, even though it's kinda crap.
65-
extension Certificate.Extensions.AuthorityInformationAccess: RandomAccessCollection {
63+
extension AuthorityInformationAccess: RandomAccessCollection {
6664
@inlinable
6765
public var startIndex: Int {
6866
self.descriptions.startIndex
@@ -85,7 +83,7 @@ extension Certificate.Extensions.AuthorityInformationAccess: RandomAccessCollect
8583
}
8684
}
8785

88-
extension Certificate.Extensions.AuthorityInformationAccess {
86+
extension AuthorityInformationAccess {
8987
/// Describes the location and format of additional information provided
9088
/// by the issuer of a given certificate.
9189
public struct AccessDescription {
@@ -95,7 +93,7 @@ extension Certificate.Extensions.AuthorityInformationAccess {
9593
/// The location where the information may be found.
9694
public var location: GeneralName
9795

98-
/// Construct a new ``Certificate/Extensions-swift.struct/AuthorityInformationAccess-swift.struct/AccessDescription`` from constituent parts.
96+
/// Construct a new ``AuthorityInformationAccess/AccessDescription`` from constituent parts.
9997
@inlinable
10098
public init(method: AccessMethod, location: GeneralName) {
10199
self.method = method
@@ -110,19 +108,19 @@ extension Certificate.Extensions.AuthorityInformationAccess {
110108
}
111109
}
112110

113-
extension Certificate.Extensions.AuthorityInformationAccess.AccessDescription: Hashable { }
111+
extension AuthorityInformationAccess.AccessDescription: Hashable { }
114112

115-
extension Certificate.Extensions.AuthorityInformationAccess.AccessDescription: Sendable { }
113+
extension AuthorityInformationAccess.AccessDescription: Sendable { }
116114

117-
extension Certificate.Extensions.AuthorityInformationAccess.AccessDescription: CustomStringConvertible {
115+
extension AuthorityInformationAccess.AccessDescription: CustomStringConvertible {
118116
public var description: String {
119117
return "\(self.method): \(self.location)"
120118
}
121119
}
122120

123-
extension Certificate.Extensions.AuthorityInformationAccess.AccessDescription {
121+
extension AuthorityInformationAccess.AccessDescription {
124122
/// The format and meaning of the information included in a single
125-
/// ``Certificate/Extensions-swift.struct/AuthorityInformationAccess-swift.struct/AccessDescription``
123+
/// ``AuthorityInformationAccess/AccessDescription``
126124
/// object.
127125
public struct AccessMethod {
128126
@usableFromInline
@@ -160,11 +158,11 @@ extension Certificate.Extensions.AuthorityInformationAccess.AccessDescription {
160158
}
161159
}
162160

163-
extension Certificate.Extensions.AuthorityInformationAccess.AccessDescription.AccessMethod: Hashable { }
161+
extension AuthorityInformationAccess.AccessDescription.AccessMethod: Hashable { }
164162

165-
extension Certificate.Extensions.AuthorityInformationAccess.AccessDescription.AccessMethod: Sendable { }
163+
extension AuthorityInformationAccess.AccessDescription.AccessMethod: Sendable { }
166164

167-
extension Certificate.Extensions.AuthorityInformationAccess.AccessDescription.AccessMethod: CustomStringConvertible {
165+
extension AuthorityInformationAccess.AccessDescription.AccessMethod: CustomStringConvertible {
168166
@inlinable
169167
public var description: String {
170168
switch self.backing {
@@ -178,9 +176,9 @@ extension Certificate.Extensions.AuthorityInformationAccess.AccessDescription.Ac
178176
}
179177
}
180178

181-
extension Certificate.Extensions.AuthorityInformationAccess.AccessDescription.AccessMethod.Backing: Hashable { }
179+
extension AuthorityInformationAccess.AccessDescription.AccessMethod.Backing: Hashable { }
182180

183-
extension Certificate.Extensions.AuthorityInformationAccess.AccessDescription.AccessMethod.Backing: Sendable { }
181+
extension AuthorityInformationAccess.AccessDescription.AccessMethod.Backing: Sendable { }
184182

185183
extension Certificate.Extension {
186184
/// Construct an opaque ``Certificate/Extension`` from this AIA extension.
@@ -189,15 +187,15 @@ extension Certificate.Extension {
189187
/// - aia: The extension to wrap
190188
/// - critical: Whether this extension should have the critical bit set.
191189
@inlinable
192-
public init(_ aia: Certificate.Extensions.AuthorityInformationAccess, critical: Bool) throws {
190+
public init(_ aia: AuthorityInformationAccess, critical: Bool) throws {
193191
let asn1Representation = AuthorityInfoAccessSyntax(aia)
194192
var serializer = DER.Serializer()
195193
try serializer.serialize(asn1Representation)
196194
self.init(oid: .X509ExtensionID.authorityInformationAccess, critical: critical, value: serializer.serializedBytes[...])
197195
}
198196
}
199197

200-
extension Certificate.Extensions.AuthorityInformationAccess: CertificateExtensionConvertible {
198+
extension AuthorityInformationAccess: CertificateExtensionConvertible {
201199
public func makeCertificateExtension() throws -> Certificate.Extension {
202200
return try .init(self, critical: false)
203201
}
@@ -222,7 +220,7 @@ struct AuthorityInfoAccessSyntax: DERImplicitlyTaggable {
222220
var descriptions: [AIAAccessDescription]
223221

224222
@inlinable
225-
init(_ aia: Certificate.Extensions.AuthorityInformationAccess) {
223+
init(_ aia: AuthorityInformationAccess) {
226224
self.descriptions = aia.descriptions.map { .init($0) }
227225
}
228226

@@ -261,7 +259,7 @@ struct AIAAccessDescription: DERImplicitlyTaggable {
261259
}
262260

263261
@inlinable
264-
init(_ description: Certificate.Extensions.AuthorityInformationAccess.AccessDescription) {
262+
init(_ description: AuthorityInformationAccess.AccessDescription) {
265263
self.accessMethod = ASN1ObjectIdentifier(accessMethod: description.method)
266264
self.accessLocation = description.location
267265
}
@@ -295,7 +293,7 @@ extension ASN1ObjectIdentifier {
295293
}
296294

297295
@inlinable
298-
public init(accessMethod: Certificate.Extensions.AuthorityInformationAccess.AccessDescription.AccessMethod) {
296+
public init(accessMethod: AuthorityInformationAccess.AccessDescription.AccessMethod) {
299297
switch accessMethod.backing {
300298
case .ocspServer:
301299
self = .AccessMethodIdentifiers.ocspServer

0 commit comments

Comments
 (0)