Skip to content

Commit 7d165d1

Browse files
yim-leecompnerd
andauthored
swift-crypto 2.x upgrade (#3759)
* PackageCollectionsSigning: update for BoringSSL API changes BoringSSL changed more of its types to opaque in https://boringssl-review.googlesource.com/q/I53e915bfae3b8dc4b67642279d0e54dc606f2297. This was picked up by swift-crypto in apple/swift-crypto@127d374. This updates the API usage to use `OpaquePointer` more pervasively to repair the build. * Add CRYPTO_v2 setting to switch between swift-crypto v1.x and 2.x * Use env var to control defining CRYPTO_v2 * Bump to swift-crypto 2.0.0 Co-authored-by: Saleem Abdulrasool <[email protected]>
1 parent 75115d4 commit 7d165d1

File tree

3 files changed

+49
-27
lines changed

3 files changed

+49
-27
lines changed

Package.swift

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,13 @@ automatic linking type with `-auto` suffix appended to product's name.
5353
*/
5454
let autoProducts = [swiftPMProduct, swiftPMDataModelProduct]
5555

56+
let useSwiftCryptoV2 = ProcessInfo.processInfo.environment["SWIFTPM_USE_SWIFT_CRYPTO_V2"] != nil
57+
let minimumCryptoVersion: Version = useSwiftCryptoV2 ? "2.0.0" : "1.1.4"
58+
var swiftSettings: [SwiftSetting] = []
59+
if useSwiftCryptoV2 {
60+
swiftSettings.append(.define("CRYPTO_v2"))
61+
}
62+
5663
let package = Package(
5764
name: "SwiftPM",
5865
platforms: [
@@ -183,7 +190,8 @@ let package = Package(
183190
.target(
184191
/** Package collections signing */
185192
name: "PackageCollectionsSigning",
186-
dependencies: ["PackageCollectionsModel", "PackageCollectionsSigningLibc", "Crypto", "Basics"]),
193+
dependencies: ["PackageCollectionsModel", "PackageCollectionsSigningLibc", "Crypto", "Basics"],
194+
swiftSettings: swiftSettings),
187195

188196
.target(
189197
/** Data structures and support for package collections */
@@ -368,7 +376,7 @@ if ProcessInfo.processInfo.environment["SWIFTCI_USE_LOCAL_DEPS"] == nil {
368376
// dependency version changes here with those projects.
369377
.package(url: "https://github.com/apple/swift-argument-parser.git", .upToNextMinor(from: "0.4.3")),
370378
.package(url: "https://github.com/apple/swift-driver.git", .branch(relatedDependenciesBranch)),
371-
.package(url: "https://github.com/apple/swift-crypto.git", .upToNextMinor(from: "1.1.4")),
379+
.package(url: "https://github.com/apple/swift-crypto.git", .upToNextMinor(from: minimumCryptoVersion)),
372380
]
373381
} else {
374382
package.dependencies += [

Sources/PackageCollectionsSigning/Certificate/Certificate.swift

Lines changed: 35 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -111,15 +111,21 @@ struct CoreCertificate {
111111

112112
#elseif os(Linux) || os(Windows) || os(Android)
113113
final class BoringSSLCertificate {
114-
private let underlying: UnsafeMutablePointer<X509>
114+
#if CRYPTO_v2
115+
typealias Pointer = OpaquePointer
116+
#else
117+
typealias Pointer = UnsafeMutablePointer<X509>
118+
#endif
119+
120+
private let underlying: Pointer
115121

116122
deinit {
117123
CCryptoBoringSSL_X509_free(self.underlying)
118124
}
119125

120126
init(derEncoded data: Data) throws {
121127
let bytes = data.copyBytes()
122-
let x509 = try bytes.withUnsafeBufferPointer { (ptr: UnsafeBufferPointer<UInt8>) throws -> UnsafeMutablePointer<X509> in
128+
let x509 = try bytes.withUnsafeBufferPointer { (ptr: UnsafeBufferPointer<UInt8>) throws -> Pointer in
123129
var pointer = ptr.baseAddress
124130
guard let x509 = CCryptoBoringSSL_d2i_X509(nil, &pointer, numericCast(ptr.count)) else {
125131
throw CertificateError.initializationFailure
@@ -129,7 +135,7 @@ final class BoringSSLCertificate {
129135
self.underlying = x509
130136
}
131137

132-
func withUnsafeMutablePointer<R>(_ body: (UnsafeMutablePointer<X509>) throws -> R) rethrows -> R {
138+
func withUnsafeMutablePointer<R>(_ body: (Pointer) throws -> R) rethrows -> R {
133139
return try body(self.underlying)
134140
}
135141

@@ -195,34 +201,38 @@ final class BoringSSLCertificate {
195201
}
196202

197203
private extension CertificateName {
198-
init(x509Name: UnsafeMutablePointer<X509_NAME>) {
199-
self.userID = x509Name.getStringValue(of: NID_userId)
200-
self.commonName = x509Name.getStringValue(of: NID_commonName)
201-
self.organization = x509Name.getStringValue(of: NID_organizationName)
202-
self.organizationalUnit = x509Name.getStringValue(of: NID_organizationalUnitName)
203-
}
204-
}
204+
#if CRYPTO_v2
205+
typealias Pointer = OpaquePointer
206+
#else
207+
typealias Pointer = UnsafeMutablePointer<X509_NAME>
208+
#endif
209+
210+
init(x509Name: Pointer) {
211+
func getStringValue(from name: Pointer, of nid: CInt) -> String? {
212+
let index = CCryptoBoringSSL_X509_NAME_get_index_by_NID(name, nid, -1)
213+
guard index >= 0 else {
214+
return nil
215+
}
205216

206-
private extension UnsafeMutablePointer where Pointee == X509_NAME {
207-
func getStringValue(of nid: CInt) -> String? {
208-
let index = CCryptoBoringSSL_X509_NAME_get_index_by_NID(self, nid, -1)
209-
guard index >= 0 else {
210-
return nil
211-
}
217+
let entry = CCryptoBoringSSL_X509_NAME_get_entry(name, index)
218+
guard let data = CCryptoBoringSSL_X509_NAME_ENTRY_get_data(entry) else {
219+
return nil
220+
}
212221

213-
let entry = CCryptoBoringSSL_X509_NAME_get_entry(self, index)
214-
guard let data = CCryptoBoringSSL_X509_NAME_ENTRY_get_data(entry) else {
215-
return nil
216-
}
222+
var value: UnsafeMutablePointer<CUnsignedChar>?
223+
defer { CCryptoBoringSSL_OPENSSL_free(value) }
217224

218-
var value: UnsafeMutablePointer<CUnsignedChar>?
219-
defer { CCryptoBoringSSL_OPENSSL_free(value) }
225+
guard CCryptoBoringSSL_ASN1_STRING_to_UTF8(&value, data) >= 0 else {
226+
return nil
227+
}
220228

221-
guard CCryptoBoringSSL_ASN1_STRING_to_UTF8(&value, data) >= 0 else {
222-
return nil
229+
return String.decodeCString(value, as: UTF8.self, repairingInvalidCodeUnits: true)?.result
223230
}
224231

225-
return String.decodeCString(value, as: UTF8.self, repairingInvalidCodeUnits: true)?.result
232+
self.userID = getStringValue(from: x509Name, of: NID_userId)
233+
self.commonName = getStringValue(from: x509Name, of: NID_commonName)
234+
self.organization = getStringValue(from: x509Name, of: NID_organizationName)
235+
self.organizationalUnit = getStringValue(from: x509Name, of: NID_organizationalUnitName)
226236
}
227237
}
228238

Sources/PackageCollectionsSigning/Certificate/CertificatePolicy.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,11 @@ extension CertificatePolicy {
100100
}
101101

102102
#elseif os(Linux) || os(Windows) || os(Android)
103+
#if CRYPTO_v2
104+
typealias BoringSSLVerifyCallback = @convention(c) (CInt, OpaquePointer?) -> CInt
105+
#else
103106
typealias BoringSSLVerifyCallback = @convention(c) (CInt, UnsafeMutablePointer<X509_STORE_CTX>?) -> CInt
107+
#endif
104108

105109
/// Verifies a certificate chain.
106110
///

0 commit comments

Comments
 (0)