Skip to content

Commit ed0dac7

Browse files
authored
Merge pull request #3 from apple/main
Update branch
2 parents c530f73 + a53a7e8 commit ed0dac7

34 files changed

+1914
-143
lines changed

.PrivacyInfo.xcprivacy

Lines changed: 0 additions & 15 deletions
This file was deleted.

Package.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ let package = Package(
127127
resources: [
128128
.copy("PrivacyInfo.xcprivacy"),
129129
],
130-
swiftSettings: swiftSettings
130+
swiftSettings: swiftSettings + [.define("MODULE_IS_CRYPTO")]
131131
),
132132
.target(
133133
name: "_CryptoExtras",

README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@ Swift Crypto is an open-source implementation of a substantial portion of the AP
77
Swift Crypto is available as a Swift Package Manager package. To use it, add the following dependency in your `Package.swift`:
88

99
```swift
10-
// swift-crypto 1.x and 2.x are almost API compatible, so most clients should
11-
// allow either
12-
.package(url: "https://github.com/apple/swift-crypto.git", "1.0.0" ..< "3.0.0"),
10+
// swift-crypto 1.x, 2.x and 3.x are almost API compatible, so most clients
11+
// should allow any of them
12+
.package(url: "https://github.com/apple/swift-crypto.git", "1.0.0" ..< "4.0.0"),
1313
```
1414

1515
and to your target, add `Crypto` to your dependencies. You can then `import Crypto` to get access to Swift Crypto's functionality.

Sources/CCryptoBoringSSL/PrivacyInfo.xcprivacy

Lines changed: 0 additions & 1 deletion
This file was deleted.
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3+
<plist version="1.0">
4+
<dict>
5+
<key>NSPrivacyTracking</key>
6+
<false/>
7+
<key>NSPrivacyAccessedAPITypes</key>
8+
<array/>
9+
<key>NSPrivacyCollectedDataTypes</key>
10+
<array/>
11+
<key>NSPrivacyTrackingDomains</key>
12+
<array/>
13+
</dict>
14+
</plist>
15+

Sources/CCryptoBoringSSL/include/CCryptoBoringSSL_boringssl_prefix_symbols.h

Lines changed: 37 additions & 0 deletions
Large diffs are not rendered by default.

Sources/CCryptoBoringSSLShims/PrivacyInfo.xcprivacy

Lines changed: 0 additions & 1 deletion
This file was deleted.
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3+
<plist version="1.0">
4+
<dict>
5+
<key>NSPrivacyTracking</key>
6+
<false/>
7+
<key>NSPrivacyAccessedAPITypes</key>
8+
<array/>
9+
<key>NSPrivacyCollectedDataTypes</key>
10+
<array/>
11+
<key>NSPrivacyTrackingDomains</key>
12+
<array/>
13+
</dict>
14+
</plist>
15+

Sources/CCryptoBoringSSLShims/include/CCryptoBoringSSLShims.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,8 @@ BIGNUM *CCryptoBoringSSLShims_BN_bin2bn(const void *in, size_t len, BIGNUM *ret)
101101

102102
size_t CCryptoBoringSSLShims_BN_bn2bin(const BIGNUM *in, void *out);
103103

104+
int CCryptoBoringSSLShims_BN_mod(BIGNUM *rem, const BIGNUM *a, const BIGNUM *m, BN_CTX *ctx);
105+
104106
int CCryptoBoringSSLShims_RSA_verify(int hash_nid, const void *msg, size_t msg_len,
105107
const void *sig, size_t sig_len, RSA *rsa);
106108

Sources/CCryptoBoringSSLShims/shims.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,10 @@ size_t CCryptoBoringSSLShims_BN_bn2bin(const BIGNUM *in, void *out) {
118118
return CCryptoBoringSSL_BN_bn2bin(in, out);
119119
}
120120

121+
int CCryptoBoringSSLShims_BN_mod(BIGNUM *rem, const BIGNUM *a, const BIGNUM *m, BN_CTX *ctx) {
122+
return BN_mod(rem, a, m, ctx);
123+
}
124+
121125
int CCryptoBoringSSLShims_RSA_verify(int hash_nid, const void *msg, size_t msg_len,
122126
const void *sig, size_t sig_len, RSA *rsa) {
123127
return CCryptoBoringSSL_RSA_verify(hash_nid, msg, msg_len, sig, sig_len, rsa);

Sources/Crypto/CMakeLists.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,11 +86,11 @@ add_library(Crypto
8686
"Signatures/ECDSA.swift"
8787
"Signatures/Ed25519.swift"
8888
"Signatures/Signature.swift"
89-
"Util/BoringSSL/ArbitraryPrecisionInteger_boring.swift"
9089
"Util/BoringSSL/CryptoKitErrors_boring.swift"
91-
"Util/BoringSSL/FiniteFieldArithmeticContext_boring.swift"
9290
"Util/BoringSSL/RNG_boring.swift"
9391
"Util/BoringSSL/SafeCompare_boring.swift"
92+
"Util/BoringSSL/Shared/ArbitraryPrecisionInteger_boring.swift"
93+
"Util/BoringSSL/Shared/FiniteFieldArithmeticContext_boring.swift"
9494
"Util/BoringSSL/Zeroization_boring.swift"
9595
"Util/PrettyBytes.swift"
9696
"Util/SafeCompare.swift"

Sources/Crypto/Digests/BoringSSL/Digest_boring.swift

Lines changed: 122 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -19,44 +19,128 @@
1919
protocol HashFunctionImplementationDetails: HashFunction where Digest: DigestPrivate {}
2020

2121
protocol BoringSSLBackedHashFunction: HashFunctionImplementationDetails {
22-
static var digestType: DigestContext.DigestType { get }
22+
associatedtype Context
23+
static var digestSize: Int { get }
24+
static func initialize() -> Context?
25+
static func update(_ context: inout Context, data: UnsafeRawBufferPointer) -> Bool
26+
static func finalize(_ context: inout Context, digest: UnsafeMutableRawBufferPointer) -> Bool
2327
}
2428

2529
extension Insecure.MD5: BoringSSLBackedHashFunction {
26-
static var digestType: DigestContext.DigestType {
27-
.md5
30+
static var digestSize: Int {
31+
Int(MD5_DIGEST_LENGTH)
32+
}
33+
34+
static func initialize() -> MD5_CTX? {
35+
var context = MD5_CTX()
36+
guard CCryptoBoringSSL_MD5_Init(&context) == 1 else {
37+
return nil
38+
}
39+
return context
40+
}
41+
42+
static func update(_ context: inout MD5_CTX, data: UnsafeRawBufferPointer) -> Bool {
43+
CCryptoBoringSSL_MD5_Update(&context, data.baseAddress, data.count) == 1
44+
}
45+
46+
static func finalize(_ context: inout MD5_CTX, digest: UnsafeMutableRawBufferPointer) -> Bool {
47+
CCryptoBoringSSL_MD5_Final(digest.baseAddress, &context) == 1
2848
}
2949
}
3050

3151
extension Insecure.SHA1: BoringSSLBackedHashFunction {
32-
static var digestType: DigestContext.DigestType {
33-
.sha1
52+
static var digestSize: Int {
53+
Int(SHA_DIGEST_LENGTH)
54+
}
55+
56+
static func initialize() -> SHA_CTX? {
57+
var context = SHA_CTX()
58+
guard CCryptoBoringSSL_SHA1_Init(&context) == 1 else {
59+
return nil
60+
}
61+
return context
62+
}
63+
64+
static func update(_ context: inout SHA_CTX, data: UnsafeRawBufferPointer) -> Bool {
65+
CCryptoBoringSSL_SHA1_Update(&context, data.baseAddress, data.count) == 1
66+
}
67+
68+
static func finalize(_ context: inout SHA_CTX, digest: UnsafeMutableRawBufferPointer) -> Bool {
69+
CCryptoBoringSSL_SHA1_Final(digest.baseAddress, &context) == 1
3470
}
3571
}
3672

3773
extension SHA256: BoringSSLBackedHashFunction {
38-
static var digestType: DigestContext.DigestType {
39-
.sha256
74+
static var digestSize: Int {
75+
Int(SHA256_DIGEST_LENGTH)
76+
}
77+
78+
static func initialize() -> SHA256_CTX? {
79+
var context = SHA256_CTX()
80+
guard CCryptoBoringSSL_SHA256_Init(&context) == 1 else {
81+
return nil
82+
}
83+
return context
84+
}
85+
86+
static func update(_ context: inout SHA256_CTX, data: UnsafeRawBufferPointer) -> Bool {
87+
CCryptoBoringSSL_SHA256_Update(&context, data.baseAddress, data.count) == 1
88+
}
89+
90+
static func finalize(_ context: inout SHA256_CTX, digest: UnsafeMutableRawBufferPointer) -> Bool {
91+
CCryptoBoringSSL_SHA256_Final(digest.baseAddress, &context) == 1
4092
}
4193
}
4294

4395
extension SHA384: BoringSSLBackedHashFunction {
44-
static var digestType: DigestContext.DigestType {
45-
.sha384
96+
static var digestSize: Int {
97+
Int(SHA384_DIGEST_LENGTH)
98+
}
99+
100+
static func initialize() -> SHA512_CTX? {
101+
var context = SHA512_CTX()
102+
guard CCryptoBoringSSL_SHA384_Init(&context) == 1 else {
103+
return nil
104+
}
105+
return context
106+
}
107+
108+
static func update(_ context: inout SHA512_CTX, data: UnsafeRawBufferPointer) -> Bool {
109+
CCryptoBoringSSL_SHA384_Update(&context, data.baseAddress, data.count) == 1
110+
}
111+
112+
static func finalize(_ context: inout SHA512_CTX, digest: UnsafeMutableRawBufferPointer) -> Bool {
113+
CCryptoBoringSSL_SHA384_Final(digest.baseAddress, &context) == 1
46114
}
47115
}
48116

49117
extension SHA512: BoringSSLBackedHashFunction {
50-
static var digestType: DigestContext.DigestType {
51-
.sha512
118+
static var digestSize: Int {
119+
Int(SHA512_DIGEST_LENGTH)
120+
}
121+
122+
static func initialize() -> SHA512_CTX? {
123+
var context = SHA512_CTX()
124+
guard CCryptoBoringSSL_SHA512_Init(&context) == 1 else {
125+
return nil
126+
}
127+
return context
128+
}
129+
130+
static func update(_ context: inout SHA512_CTX, data: UnsafeRawBufferPointer) -> Bool {
131+
CCryptoBoringSSL_SHA512_Update(&context, data.baseAddress, data.count) == 1
132+
}
133+
134+
static func finalize(_ context: inout SHA512_CTX, digest: UnsafeMutableRawBufferPointer) -> Bool {
135+
CCryptoBoringSSL_SHA512_Final(digest.baseAddress, &context) == 1
52136
}
53137
}
54138

55139
struct OpenSSLDigestImpl<H: BoringSSLBackedHashFunction> {
56-
private var context: DigestContext
140+
private var context: DigestContext<H>
57141

58142
init() {
59-
self.context = DigestContext(digest: H.digestType)
143+
self.context = DigestContext()
60144
}
61145

62146
internal mutating func update(data: UnsafeRawBufferPointer) {
@@ -67,81 +151,49 @@ struct OpenSSLDigestImpl<H: BoringSSLBackedHashFunction> {
67151
}
68152

69153
internal func finalize() -> H.Digest {
70-
// To have a non-destructive finalize operation we must allocate.
71-
let copyContext = DigestContext(copying: self.context)
72-
let digestBytes = copyContext.finalize()
73-
return digestBytes.withUnsafeBytes {
74-
// We force unwrap here because if the digest size is wrong it's an internal error.
75-
H.Digest(bufferPointer: $0)!
76-
}
154+
self.context.finalize()
77155
}
78156
}
79157

80-
class DigestContext {
81-
private var contextPointer: UnsafeMutablePointer<EVP_MD_CTX>
158+
fileprivate final class DigestContext<H: BoringSSLBackedHashFunction> {
159+
private var context: H.Context
82160

83-
init(digest: DigestType) {
84-
// We force unwrap because we cannot recover from allocation failure.
85-
self.contextPointer = CCryptoBoringSSL_EVP_MD_CTX_new()!
86-
guard CCryptoBoringSSL_EVP_DigestInit(self.contextPointer, digest.dispatchTable) != 0 else {
87-
// We can't do much but crash here.
88-
fatalError("Unable to initialize digest state: \(CCryptoBoringSSL_ERR_get_error())")
161+
init() {
162+
guard let contex = H.initialize() else {
163+
preconditionFailure("Unable to initialize digest state")
89164
}
165+
self.context = contex
90166
}
91167

92168
init(copying original: DigestContext) {
93-
// We force unwrap because we cannot recover from allocation failure.
94-
self.contextPointer = CCryptoBoringSSL_EVP_MD_CTX_new()!
95-
guard CCryptoBoringSSL_EVP_MD_CTX_copy(self.contextPointer, original.contextPointer) != 0 else {
96-
// We can't do much but crash here.
97-
fatalError("Unable to copy digest state: \(CCryptoBoringSSL_ERR_get_error())")
98-
}
169+
self.context = original.context
99170
}
100171

101172
func update(data: UnsafeRawBufferPointer) {
102-
guard let baseAddress = data.baseAddress else {
103-
return
173+
guard H.update(&self.context, data: data) else {
174+
preconditionFailure("Unable to update digest state")
104175
}
105-
106-
CCryptoBoringSSL_EVP_DigestUpdate(self.contextPointer, baseAddress, data.count)
107176
}
108177

109-
// This finalize function is _destructive_: do not call it if you want to reuse the object!
110-
func finalize() -> [UInt8] {
111-
let digestSize = CCryptoBoringSSL_EVP_MD_size(self.contextPointer.pointee.digest)
112-
var digestBytes = Array(repeating: UInt8(0), count: digestSize)
113-
var count = UInt32(digestSize)
114-
115-
digestBytes.withUnsafeMutableBufferPointer { digestPointer in
116-
assert(digestPointer.count == count)
117-
CCryptoBoringSSL_EVP_DigestFinal(self.contextPointer, digestPointer.baseAddress, &count)
178+
func finalize() -> H.Digest {
179+
var copyContext = self.context
180+
defer {
181+
withUnsafeMutablePointer(to: &copyContext) { $0.zeroize() }
182+
}
183+
return withUnsafeTemporaryAllocation(byteCount: H.digestSize, alignment: 1) { digestPointer in
184+
defer {
185+
digestPointer.zeroize()
186+
}
187+
guard H.finalize(&copyContext, digest: digestPointer) else {
188+
preconditionFailure("Unable to finalize digest state")
189+
}
190+
// We force unwrap here because if the digest size is wrong it's an internal error.
191+
return H.Digest(bufferPointer: UnsafeRawBufferPointer(digestPointer))!
118192
}
119-
120-
return digestBytes
121193
}
122194

123195
deinit {
124-
CCryptoBoringSSL_EVP_MD_CTX_free(self.contextPointer)
125-
}
126-
}
127-
128-
extension DigestContext {
129-
struct DigestType {
130-
var dispatchTable: OpaquePointer
131-
132-
private init(_ dispatchTable: OpaquePointer) {
133-
self.dispatchTable = dispatchTable
134-
}
135-
136-
static let md5 = DigestType(CCryptoBoringSSL_EVP_md5())
137-
138-
static let sha1 = DigestType(CCryptoBoringSSL_EVP_sha1())
139-
140-
static let sha256 = DigestType(CCryptoBoringSSL_EVP_sha256())
141-
142-
static let sha384 = DigestType(CCryptoBoringSSL_EVP_sha384())
143-
144-
static let sha512 = DigestType(CCryptoBoringSSL_EVP_sha512())
196+
withUnsafeMutablePointer(to: &self.context) { $0.zeroize() }
145197
}
146198
}
147199
#endif // CRYPTO_IN_SWIFTPM && !CRYPTO_IN_SWIFTPM_FORCE_BUILD_API

Sources/Crypto/PrivacyInfo.xcprivacy

Lines changed: 0 additions & 1 deletion
This file was deleted.

Sources/Crypto/PrivacyInfo.xcprivacy

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3+
<plist version="1.0">
4+
<dict>
5+
<key>NSPrivacyTracking</key>
6+
<false/>
7+
<key>NSPrivacyAccessedAPITypes</key>
8+
<array/>
9+
<key>NSPrivacyCollectedDataTypes</key>
10+
<array/>
11+
<key>NSPrivacyTrackingDomains</key>
12+
<array/>
13+
</dict>
14+
</plist>
15+

0 commit comments

Comments
 (0)