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
|