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 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107
|
//===----------------------------------------------------------------------===//
//
// This source file is part of the SwiftCrypto open source project
//
// Copyright (c) YEARS Apple Inc. and the SwiftCrypto project authors
// Licensed under Apache License v2.0
//
// See LICENSE.txt for license information
// See CONTRIBUTORS.md for the list of SwiftCrypto project authors
//
// SPDX-License-Identifier: Apache-2.0
//
//===----------------------------------------------------------------------===//
import Foundation
import XCTest
import Crypto
import _CryptoExtras
final class TestRSAEncryption: XCTestCase {
func test_wycheproofOAEPVectors() throws {
try wycheproofTest(
jsonName: "rsa_oaep_2048_sha1_mgf1sha1_test",
testFunction: self.testOAEPGroup)
try wycheproofTest(
jsonName: "rsa_oaep_misc_test",
testFunction: self.testOAEPGroup)
}
private func testOAEPGroup(_ group: RSAEncryptionOAEPTestGroup) throws {
let derPrivKey = try _RSA.Encryption.PrivateKey(derRepresentation: group.privateKeyDerBytes)
let pemPrivKey = try _RSA.Encryption.PrivateKey(pemRepresentation: group.privateKeyPem)
XCTAssertEqual(derPrivKey.derRepresentation, pemPrivKey.derRepresentation)
XCTAssertEqual(derPrivKey.pemRepresentation, pemPrivKey.pemRepresentation)
let derPubKey = derPrivKey.publicKey
guard group.sha == "SHA-1", group.mgfSha == "SHA-1" else {
// We currently only support SHA-1 OAEP, which is very legacy but oh well.
return
}
for test in group.tests {
guard test.label?.isEmpty ?? true else {
// We currently have no support for OAEP labels.
continue
}
let valid: Bool
do {
let decryptResult = try derPrivKey.decrypt(test.ciphertextBytes, padding: .PKCS1_OAEP)
let encryptResult = try derPubKey.encrypt(test.messageBytes, padding: .PKCS1_OAEP)
let decryptResult2 = try derPrivKey.decrypt(encryptResult, padding: .PKCS1_OAEP)
valid = (test.messageBytes == decryptResult && decryptResult2 == decryptResult)
} catch {
valid = false
}
XCTAssertEqual(valid, test.expectedValidity, "test number \(test.tcId) failed, expected \(test.result) but got \(valid)")
}
}
}
struct RSAEncryptionOAEPTestGroup: Codable {
var privateKeyPem: String
var privateKeyPkcs8: String
var sha: String
var tests: [RSAEncryptionTest]
var mgfSha: String
var privateKeyDerBytes: Data {
return try! Data(hexString: self.privateKeyPkcs8)
}
}
struct RSAEncryptionTest: Codable {
var tcId: Int
var comment: String
var msg: String
var ct: String
var result: String
var flags: [String]
var label: String?
var messageBytes: Data {
return try! Data(hexString: self.msg)
}
var ciphertextBytes: Data {
return try! Data(hexString: self.ct)
}
var expectedValidity: Bool {
switch self.result {
case "valid":
return true
case "invalid":
return false
case "acceptable":
return true
default:
fatalError("Unexpected validity")
}
}
}
|