kyber-sdk-ios/Tests/KyberSDKTests/KyberSDKTests.swift

131 行
5.7 KiB
Swift

2026-05-06 22:28:00 +08:00
import XCTest
@testable import KyberSDK
/**
* KyberSDK
*
*
* - 512 / 768 / 1024
* - KEM
* - IND-CCA2
* - / /
* - Kyber768 线
*/
final class KyberSDKTests: XCTestCase {
// MARK: - Kyber512
/// Kyber512
func testKyber512KeySizes() throws {
let kp = try KyberKEM.generateKeyPair(variant: .kyber512)
XCTAssertEqual(kp.publicKey.count, 800, "Kyber512 公钥应为 800 字节")
XCTAssertEqual(kp.secretKey.count, 1632, "Kyber512 私钥应为 1632 字节")
}
/// Kyber512 KEM
func testKyber512RoundTrip() throws {
let kp = try KyberKEM.generateKeyPair(variant: .kyber512)
let enc = try KyberKEM.encapsulate(variant: .kyber512, publicKey: kp.publicKey)
let dec = try KyberKEM.decapsulate(variant: .kyber512, ciphertext: enc.ciphertext, secretKey: kp.secretKey)
XCTAssertEqual(enc.ciphertext.count, 768, "Kyber512 密文应为 768 字节")
XCTAssertEqual(enc.sharedSecret.count, 32, "共享密钥应为 32 字节")
XCTAssertEqual(dec.count, 32, "解封装共享密钥应为 32 字节")
XCTAssertEqual(enc.sharedSecret, dec, "封装和解封装的共享密钥必须完全一致")
}
/// Kyber512 使IND-CCA2
func testKyber512WrongKey() throws {
let alice = try KyberKEM.generateKeyPair(variant: .kyber512)
let bob = try KyberKEM.generateKeyPair(variant: .kyber512)
// 使 Alice
let enc = try KyberKEM.encapsulate(variant: .kyber512, publicKey: alice.publicKey)
// Bob
let dec = try KyberKEM.decapsulate(variant: .kyber512, ciphertext: enc.ciphertext, secretKey: bob.secretKey)
XCTAssertNotEqual(enc.sharedSecret, dec, "使用错误私钥不应恢复正确的共享密钥IND-CCA2")
}
// MARK: - Kyber768
/// Kyber768
func testKyber768KeySizes() throws {
let kp = try KyberKEM.generateKeyPair(variant: .kyber768)
XCTAssertEqual(kp.publicKey.count, 1184, "Kyber768 公钥应为 1184 字节")
XCTAssertEqual(kp.secretKey.count, 2400, "Kyber768 私钥应为 2400 字节")
}
/// Kyber768 KEM
func testKyber768RoundTrip() throws {
let kp = try KyberKEM.generateKeyPair(variant: .kyber768)
let enc = try KyberKEM.encapsulate(variant: .kyber768, publicKey: kp.publicKey)
let dec = try KyberKEM.decapsulate(variant: .kyber768, ciphertext: enc.ciphertext, secretKey: kp.secretKey)
XCTAssertEqual(enc.ciphertext.count, 1088, "Kyber768 密文应为 1088 字节")
XCTAssertEqual(enc.sharedSecret, dec, "封装和解封装的共享密钥必须完全一致")
}
// MARK: - Kyber1024
/// Kyber1024
func testKyber1024KeySizes() throws {
let kp = try KyberKEM.generateKeyPair(variant: .kyber1024)
XCTAssertEqual(kp.publicKey.count, 1568, "Kyber1024 公钥应为 1568 字节")
XCTAssertEqual(kp.secretKey.count, 3168, "Kyber1024 私钥应为 3168 字节")
}
/// Kyber1024 KEM
func testKyber1024RoundTrip() throws {
let kp = try KyberKEM.generateKeyPair(variant: .kyber1024)
let enc = try KyberKEM.encapsulate(variant: .kyber1024, publicKey: kp.publicKey)
let dec = try KyberKEM.decapsulate(variant: .kyber1024, ciphertext: enc.ciphertext, secretKey: kp.secretKey)
XCTAssertEqual(enc.ciphertext.count, 1568, "Kyber1024 密文应为 1568 字节")
XCTAssertEqual(enc.sharedSecret, dec, "封装和解封装的共享密钥必须完全一致")
}
// MARK: -
/// KyberError.invalidPublicKeySize
func testInvalidPublicKeySize() {
XCTAssertThrowsError(
try KyberKEM.encapsulate(variant: .kyber768, publicKey: Data(repeating: 0, count: 100)),
"公钥长度不匹配时应抛出错误"
)
}
/// KyberError.invalidSecretKeySize
func testInvalidSecretKeySize() throws {
let kp = try KyberKEM.generateKeyPair(variant: .kyber768)
let enc = try KyberKEM.encapsulate(variant: .kyber768, publicKey: kp.publicKey)
XCTAssertThrowsError(
try KyberKEM.decapsulate(
variant: .kyber768,
ciphertext: enc.ciphertext,
secretKey: Data(repeating: 0, count: 10)
),
"私钥长度不匹配时应抛出错误"
)
}
/// KyberError.invalidCiphertextSize
func testInvalidCiphertextSize() throws {
let kp = try KyberKEM.generateKeyPair(variant: .kyber768)
XCTAssertThrowsError(
try KyberKEM.decapsulate(
variant: .kyber768,
ciphertext: Data(repeating: 0, count: 10),
secretKey: kp.secretKey
),
"密文长度不匹配时应抛出错误"
)
}
// MARK: -
/// Kyber768 线10
func testKyber768Performance() throws {
measure {
_ = try? KyberKEM.generateKeyPair(variant: .kyber768)
}
}
}