add pairing tests

This commit is contained in:
Michele Balistreri 2019-08-07 16:50:24 +03:00
parent 62c3a921fe
commit 05bf145328
4 changed files with 45 additions and 0 deletions

View File

@ -18,6 +18,12 @@ struct APDUResponse {
self.sw2 = rawData[rawData.count - 1]
self.data = rawData.count > 2 ? Array(rawData[0..<(rawData.count - 3)]) : []
}
init(sw1: UInt8, sw2: UInt8, data: [UInt8]) {
self.sw1 = sw1
self.sw2 = sw2
self.data = data
}
func checkOK() throws -> APDUResponse {
try checkSW(StatusWord.ok)

View File

@ -6,4 +6,5 @@ enum CardError: Error {
case pinBlocked
case invalidAuthData
case invalidMac
case communicationError
}

View File

@ -108,6 +108,30 @@ final class KeycardTests: XCTestCase {
let secureChannel = SecureChannel()
secureChannel.generateSecret(pubKey: pub)
XCTAssertEqual(secureChannel.secret!, Crypto.shared.secp256k1ECDH(privKey: priv, pubKey: secureChannel.publicKey!))
var clientChallenge: [UInt8]? = nil
var pairing: [UInt8] = []
let sharedSecret = Crypto.shared.random(count: 32)
let testChannel = TestCardChannel()
testChannel.callback = { (cmd) in
if clientChallenge == nil {
XCTAssertEqual(cmd.ins, SecureChannelINS.pair.rawValue)
XCTAssertEqual(cmd.p1, PairP1.firstStep.rawValue)
let cryptogram = Crypto.shared.sha256(sharedSecret + cmd.data)
clientChallenge = Crypto.shared.random(count: 32)
return APDUResponse(sw1: 0x90, sw2: 0x00, data: cryptogram + clientChallenge!)
} else {
XCTAssertEqual(Crypto.shared.sha256(sharedSecret + clientChallenge!), cmd.data)
let salt = Crypto.shared.random(count: 32)
pairing = Crypto.shared.sha256(sharedSecret + salt)
return APDUResponse(sw1: 0x90, sw2: 0x00, data: [0x03] + salt)
}
}
XCTAssertNoThrow(try secureChannel.autoPair(channel: testChannel, sharedSecret: sharedSecret))
XCTAssertEqual(secureChannel.pairing!.pairingIndex, 3)
XCTAssertEqual(secureChannel.pairing!.pairingKey, pairing)
}
static var allTests = [

View File

@ -0,0 +1,14 @@
@testable import Keycard
class TestCardChannel: CardChannel {
var callback: ((APDUCommand) throws -> APDUResponse)?
var connected: Bool { get { true } }
func send(_ cmd: APDUCommand) throws -> APDUResponse {
if callback != nil {
return try callback!(cmd)
} else {
throw CardError.communicationError
}
}
}