Skip to content

Commit 0f254a4

Browse files
committed
IOS-8949 Ability to enable encryption for specific commands
1 parent 23cdd76 commit 0f254a4

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))
@@ -360,8 +361,10 @@ public class CardSession {
360361
private func prepareSession<T: CardSessionRunnable>(for runnable: T, completion: @escaping CompletionResult<Void>) {
361362
Log.session("Prepare card session")
362363
preflightReadMode = runnable.preflightReadMode
364+
environment.encryptionMode = runnable.encryptionMode
363365

364-
Log.session("Current policy is \(environment.config.accessCodeRequestPolicy)")
366+
Log.session("Access code policy is \(environment.config.accessCodeRequestPolicy)")
367+
Log.session("Encryption mode is \(environment.encryptionMode)")
365368

366369
guard runnable.shouldAskForAccessCode else {
367370
Log.session("Skip an access codes request")
@@ -476,6 +479,8 @@ public class CardSession {
476479
let secret = try encryptionHelper.generateSecret(keyB: response.sessionKeyB)
477480
let sessionKey = (secret + protocolKey).getSha256()
478481
self.environment.encryptionKey = sessionKey
482+
483+
Log.session("The encryption established")
479484
return ()
480485
}
481486
.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)