Skip to content

Commit f429d3b

Browse files
authored
IOS-8949 Ability to enable encryption for specific commands (#398)
1 parent eb59b46 commit f429d3b

File tree

5 files changed

+29
-7
lines changed

5 files changed

+29
-7
lines changed

Example/TangemSdkExample/AppModel.swift

+9-4
Original file line numberDiff line numberDiff line change
@@ -58,13 +58,18 @@ class AppModel: ObservableObject {
5858
config.handleErrors = self.handleErrors
5959
config.filter.allowedCardTypes = FirmwareVersion.FirmwareType.allCases
6060
config.accessCodeRequestPolicy = accessCodeRequestPolicy
61+
62+
var loggers: [TangemSdkLogger] = [ConsoleLogger()]
63+
6164
if displayLogs {
62-
config.logConfig = .custom(logLevel: Log.Level.allCases,
63-
loggers: [ConsoleLogger(), logger])
64-
} else {
65-
config.logConfig = .verbose
65+
loggers.append(logger)
6666
}
6767

68+
config.logConfig = .custom(
69+
logLevel: Log.Level.allCases,
70+
loggers: [ConsoleLogger(), logger]
71+
)
72+
6873
config.defaultDerivationPaths = [
6974
.secp256k1: [try! DerivationPath(rawPath: "m/0'/1")],
7075
.secp256r1: [try! DerivationPath(rawPath: "m/0'/1")],

TangemSdk/TangemSdk/Common/APDU/CommandApdu.swift

+3
Original file line numberDiff line numberDiff line change
@@ -66,9 +66,12 @@ public struct CommandApdu: Equatable {
6666
guard let encryptionKey = encryptionKey, p1 == EncryptionMode.none.byteValue else { //skip if already encrypted or empty encryptionKey
6767
return self
6868
}
69+
6970
let crc = data.crc16()
7071
let tlvDataToEncrypt = data.count.bytes2 + crc + data
7172
let encryptedPayload = try tlvDataToEncrypt.encrypt(with: encryptionKey)
73+
Log.apdu("C-APDU encrypted")
74+
7275
return CommandApdu(cla: self.cla, ins: self.ins, p1: encryptionMode.byteValue, p2: self.p2, le: self.le, tlv: Data(encryptedPayload))
7376
}
7477

TangemSdk/TangemSdk/Common/Core/CardSession.swift

+6-1
Original file line numberDiff line numberDiff line change
@@ -281,6 +281,7 @@ public class CardSession {
281281
/// - completion: Completion handler. Invoked by nfc-reader
282282
public final func send(apdu: CommandApdu, completion: @escaping CompletionResult<ResponseApdu>) {
283283
Log.session("Send")
284+
284285
guard sendSubscription.isEmpty else {
285286
Log.error(TangemSdkError.busy)
286287
completion(.failure(.busy))
@@ -361,8 +362,10 @@ public class CardSession {
361362
private func prepareSession<T: CardSessionRunnable>(for runnable: T, completion: @escaping CompletionResult<Void>) {
362363
Log.session("Prepare card session")
363364
preflightReadMode = runnable.preflightReadMode
365+
environment.encryptionMode = runnable.encryptionMode
364366

365-
Log.session("Current policy is \(environment.config.accessCodeRequestPolicy)")
367+
Log.session("Access code policy is \(environment.config.accessCodeRequestPolicy)")
368+
Log.session("Encryption mode is \(environment.encryptionMode)")
366369

367370
guard runnable.shouldAskForAccessCode else {
368371
Log.session("Skip an access codes request")
@@ -477,6 +480,8 @@ public class CardSession {
477480
let secret = try encryptionHelper.generateSecret(keyB: response.sessionKeyB)
478481
let sessionKey = (secret + protocolKey).getSha256()
479482
self.environment.encryptionKey = sessionKey
483+
484+
Log.session("The encryption established")
480485
return ()
481486
}
482487
.mapError{$0.toTangemSdkError()}

TangemSdk/TangemSdk/Common/Core/CardSessionRunnable.swift

+7-2
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,10 @@ public protocol CardSessionRunnable {
1515

1616
/// Allow SDK to fetch access code from the local encrypted repository when running the command
1717
var shouldAskForAccessCode: Bool { get }
18-
18+
19+
/// An enforced encryption mode. Managed by a card if none. None by default.
20+
var encryptionMode: EncryptionMode { get }
21+
1922
/// Simple interface for responses received after sending commands to Tangem cards.
2023
associatedtype Response
2124

@@ -36,7 +39,9 @@ extension CardSessionRunnable {
3639
public var preflightReadMode: PreflightReadMode { .fullCardRead }
3740

3841
public var shouldAskForAccessCode: Bool { true }
39-
42+
43+
public var encryptionMode: EncryptionMode { .none }
44+
4045
public func prepare(_ session: CardSession, completion: @escaping CompletionResult<Void>) {
4146
completion(.success(()))
4247
}

TangemSdk/TangemSdk/Operations/Wallet/CreateWalletTask.swift

+4
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,10 @@ import Foundation
1818
* RemainingSignature is set to MaxSignatures.
1919
*/
2020
public class CreateWalletTask: CardSessionRunnable {
21+
public var encryptionMode: EncryptionMode {
22+
privateKey == nil ? .none : .strong
23+
}
24+
2125
private let curve: EllipticCurve
2226
private let privateKey: ExtendedPrivateKey?
2327
private var derivationTask: DeriveWalletPublicKeysTask? = nil

0 commit comments

Comments
 (0)