72 lines
2.7 KiB
Swift
72 lines
2.7 KiB
Swift
import XCTest
|
|
|
|
@testable import age_plugin_se
|
|
|
|
#if !os(Linux) && !os(Windows)
|
|
import CryptoKit
|
|
#else
|
|
import Crypto
|
|
#endif
|
|
|
|
final class CryptoKitCryptoTests: XCTestCase {
|
|
var crypto = CryptoKitCrypto()
|
|
|
|
func testNewEphemeralPrivateKey() throws {
|
|
let k1 = crypto.newEphemeralPrivateKey()
|
|
let k2 = crypto.newEphemeralPrivateKey()
|
|
|
|
XCTAssertNotEqual(k1.rawRepresentation, k2.rawRepresentation)
|
|
XCTAssertNotEqual(k1.publicKey.rawRepresentation, k2.publicKey.rawRepresentation)
|
|
}
|
|
|
|
func testNewEphemeralPrivateKey_DifferentCrypto() throws {
|
|
let k1 = CryptoKitCrypto().newEphemeralPrivateKey()
|
|
let k2 = CryptoKitCrypto().newEphemeralPrivateKey()
|
|
|
|
XCTAssertNotEqual(k1.rawRepresentation, k2.rawRepresentation)
|
|
XCTAssertNotEqual(k1.publicKey.rawRepresentation, k2.publicKey.rawRepresentation)
|
|
}
|
|
|
|
// A test to validate that CryptoKit / Swift Crypto cannot do any operations with points at infinity
|
|
func testPointAtInfinity() throws {
|
|
let sk = P256.KeyAgreement.PrivateKey()
|
|
|
|
// base64.b64encode(ECC.generate(curve="p256").export_key(format="DER"))
|
|
let pk = try P256.KeyAgreement.PublicKey(derRepresentation: Data(base64Encoded: "MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE0Zl262mVCr+1pi9396tEdXC0HIQnENUkWal3nOzLWvX+TYja1xVE++6WzRvunrkBT91380BIJZvB7ZiiEN+Y1A==")!)
|
|
|
|
// Test that operations work from a regular DER constructed key
|
|
let _ = try sk.sharedSecretFromKeyAgreement(with: pk)
|
|
|
|
func run() throws {
|
|
// base64.b64encode(ECC.EccKey(curve = "p256", point = ECC.generate(curve="p256").pointQ.point_at_infinity()).export_key(format="DER"))
|
|
// Swift Crypto throws at construction time
|
|
let identityPK = try P256.KeyAgreement.PublicKey(derRepresentation: Data(base64Encoded: "MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==")!)
|
|
|
|
// CryptoKit throws at operation time
|
|
let _ = try sk.sharedSecretFromKeyAgreement(with: identityPK)
|
|
}
|
|
|
|
XCTAssertThrowsError(try run())
|
|
}
|
|
}
|
|
|
|
final class DummyCryptoTests: XCTestCase {
|
|
var crypto = DummyCrypto()
|
|
|
|
func testNewEphemeralPrivateKey() throws {
|
|
let k1 = crypto.newEphemeralPrivateKey()
|
|
let k2 = crypto.newEphemeralPrivateKey()
|
|
|
|
XCTAssertNotEqual(k1.rawRepresentation, k2.rawRepresentation)
|
|
XCTAssertNotEqual(k1.publicKey.rawRepresentation, k2.publicKey.rawRepresentation)
|
|
}
|
|
|
|
func testNewEphemeralPrivateKey_DifferentCrypto() throws {
|
|
let k1 = DummyCrypto().newEphemeralPrivateKey()
|
|
let k2 = DummyCrypto().newEphemeralPrivateKey()
|
|
|
|
XCTAssertEqual(k1.rawRepresentation, k2.rawRepresentation)
|
|
XCTAssertEqual(k1.publicKey.rawRepresentation, k2.publicKey.rawRepresentation)
|
|
}
|
|
}
|