Skip to content

Commit 63ca5f0

Browse files
committed
Specify RSA signing padding to ensure backwards compatibility
1 parent 3390d72 commit 63ca5f0

File tree

3 files changed

+7
-5
lines changed

3 files changed

+7
-5
lines changed

Sources/PackageCollectionsSigning/PackageCollectionSigning.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -228,7 +228,7 @@ public struct PackageCollectionSigning: PackageCollectionSigner, PackageCollecti
228228

229229
signatureAlgorithm = .RS256
230230
signatureProvider = {
231-
try privateKey.signature(for: SHA256.hash(data: $0)).rawRepresentation
231+
try privateKey.signature(for: SHA256.hash(data: $0), padding: Signature.rsaSigningPadding).rawRepresentation
232232
}
233233
} catch let error as PackageCollectionSigningError {
234234
throw error

Sources/PackageCollectionsSigning/Signature.swift

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,8 @@ extension Signature {
6060

6161
// Reference: https://github.com/vapor/jwt-kit/blob/master/Sources/JWTKit/JWTSerializer.swift
6262
extension Signature {
63+
static let rsaSigningPadding = _RSA.Signing.Padding.insecurePKCS1v1_5
64+
6365
static func generate(
6466
payload: some Encodable,
6567
certChainData: [Data],
@@ -149,7 +151,7 @@ extension Signature {
149151
// Extract public key from the certificate
150152
let certificate = certChain.first! // !-safe because certChain is not empty at this point
151153
// Verify the key was used to generate the signature
152-
let message: Data = .init(encodedHeader) + .period + Data(encodedPayload)
154+
let message: Data = Data(encodedHeader) + .period + Data(encodedPayload)
153155
let digest = SHA256.hash(data: message)
154156

155157
switch header.algorithm {
@@ -165,7 +167,7 @@ extension Signature {
165167
guard let publicKey = _RSA.Signing.PublicKey(certificate.publicKey) else {
166168
throw SignatureError.invalidPublicKey
167169
}
168-
guard publicKey.isValidSignature(.init(rawRepresentation: signatureBytes), for: digest) else {
170+
guard publicKey.isValidSignature(.init(rawRepresentation: signatureBytes), for: digest, padding: .insecurePKCS1v1_5) else {
169171
throw SignatureError.invalidSignature
170172
}
171173
}

Tests/PackageCollectionsSigningTests/SignatureTests.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ class SignatureTests: XCTestCase {
4040
jsonEncoder: jsonEncoder,
4141
signatureAlgorithm: .RS256
4242
) {
43-
try privateKey.signature(for: SHA256.hash(data: $0)).rawRepresentation
43+
try privateKey.signature(for: SHA256.hash(data: $0), padding: Signature.rsaSigningPadding).rawRepresentation
4444
}
4545

4646
let parsedSignature = try tsc_await { callback in
@@ -76,7 +76,7 @@ class SignatureTests: XCTestCase {
7676
jsonEncoder: jsonEncoder,
7777
signatureAlgorithm: .RS256
7878
) {
79-
try privateKey.signature(for: SHA256.hash(data: $0)).rawRepresentation
79+
try privateKey.signature(for: SHA256.hash(data: $0), padding: Signature.rsaSigningPadding).rawRepresentation
8080
}
8181

8282
XCTAssertThrowsError(try tsc_await { callback in

0 commit comments

Comments
 (0)