91 lines
2.9 KiB
Swift
91 lines
2.9 KiB
Swift
//
|
||
// MTConformanceTests.swift
|
||
// MontanaTests
|
||
//
|
||
// XCTest harness для cross-implementation conformance verification.
|
||
// Caller responsibility: implement encodeEnvelope / Bootstrap PoW target
|
||
// derivation в Swift и assert byte-exact equality с Rust reference.
|
||
//
|
||
|
||
import XCTest
|
||
@testable import Montana
|
||
|
||
final class MTConformanceTests: XCTestCase {
|
||
|
||
// MARK: - Envelope vectors
|
||
|
||
func testEnvelopeA1Ping() {
|
||
let v = MTConformanceVectors.envelopeA1Ping
|
||
let actual = MontanaEnvelope.encode(
|
||
msgType: v.msgType,
|
||
requestId: v.requestId,
|
||
payload: v.payload
|
||
)
|
||
XCTAssertEqual(actual, v.expectedBytes, v.name)
|
||
}
|
||
|
||
func testEnvelopeA2Transfer1024() {
|
||
let v = MTConformanceVectors.envelopeA2Transfer1024
|
||
let actual = MontanaEnvelope.encode(
|
||
msgType: v.msgType,
|
||
requestId: v.requestId,
|
||
payload: v.payload
|
||
)
|
||
XCTAssertEqual(actual, v.expectedBytes, v.name)
|
||
}
|
||
|
||
func testEnvelopeA3FastSyncMaxRequestId() {
|
||
let v = MTConformanceVectors.envelopeA3FastSyncMaxRequestId
|
||
let actual = MontanaEnvelope.encode(
|
||
msgType: v.msgType,
|
||
requestId: v.requestId,
|
||
payload: v.payload
|
||
)
|
||
XCTAssertEqual(actual, v.expectedBytes, v.name)
|
||
}
|
||
|
||
// MARK: - PoW vectors
|
||
|
||
func testPowF1Target() {
|
||
let v = MTConformanceVectors.powF1Difficulty65536
|
||
let actual = BootstrapPow.target(difficulty: v.difficulty)
|
||
XCTAssertEqual(actual, v.target, v.name)
|
||
}
|
||
|
||
func testPowF2Target() {
|
||
let v = MTConformanceVectors.powF2Difficulty1024
|
||
let actual = BootstrapPow.target(difficulty: v.difficulty)
|
||
XCTAssertEqual(actual, v.target, v.name)
|
||
}
|
||
|
||
// MARK: - IBT proof vectors
|
||
|
||
func testIbtB1SeedDerivation() {
|
||
let v = MTConformanceVectors.ibtB1OnlineProof
|
||
let derived = MontanaSeed.detSeed(label: v.seedLabel)
|
||
XCTAssertEqual(derived, v.seed, "B1 deterministic seed must match Rust reference")
|
||
}
|
||
|
||
func testIbtB1KeypairDerivation() throws {
|
||
let v = MTConformanceVectors.ibtB1OnlineProof
|
||
let kp = try MLDSA65.deriveKeypair(seed: v.seed)
|
||
let pkHash = SHA256.hash(data: kp.publicKey)
|
||
XCTAssertEqual(Data(pkHash), v.pkSha256, "B1 pk SHA-256 must match Rust reference")
|
||
}
|
||
|
||
func testIbtB1ProofSignature() throws {
|
||
let v = MTConformanceVectors.ibtB1OnlineProof
|
||
let kp = try MLDSA65.deriveKeypair(seed: v.seed)
|
||
let serverNodeId = Data(repeating: 0x42, count: 32)
|
||
let proof = try IBTProof.online(
|
||
secretKey: kp.privateKey,
|
||
serverNodeId: serverNodeId,
|
||
windowIndex: 1000
|
||
)
|
||
let proofHash = SHA256.hash(data: proof)
|
||
XCTAssertEqual(Data(proofHash), v.proofSha256, "B1 proof SHA-256 must match Rust reference")
|
||
}
|
||
}
|
||
|
||
import CryptoKit
|