@@ -276,7 +276,6 @@ public final actor PIVSession: Session {
276
276
Logger . piv. debug ( " \( String ( describing: self ) . lastComponent) , \( #function) " )
277
277
let rsaKeyType = PIV . RSAKey. rsa ( key. size)
278
278
let keyType = PIV . KeyType. rsa ( key. size)
279
- try await checkKeyFeatures ( keyType: keyType, pinPolicy: pinPolicy, touchPolicy: touchPolicy, generateKey: false )
280
279
281
280
var data = Data ( )
282
281
let primeOne = key. p
@@ -291,21 +290,13 @@ public final actor PIVSession: Session {
291
290
data. append ( TKBERTLVRecord ( tag: 0x04 , value: exponentTwo. padOrTrim ( to: length) ) . data)
292
291
data. append ( TKBERTLVRecord ( tag: 0x05 , value: coefficient. padOrTrim ( to: length) ) . data)
293
292
294
- if pinPolicy != . `defaultPolicy` {
295
- data. append ( TKBERTLVRecord ( tag: tagPinPolicy, value: pinPolicy. rawValue. data) . data)
296
- }
297
- if touchPolicy != . `defaultPolicy` {
298
- data. append ( TKBERTLVRecord ( tag: tagTouchPolicy, value: touchPolicy. rawValue. data) . data)
299
- }
300
- let apdu = APDU (
301
- cla: 0 ,
302
- ins: insImportKey,
303
- p1: keyType. rawValue,
304
- p2: slot. rawValue,
305
- command: data,
306
- type: . extended
293
+ try await importKey (
294
+ keyType: keyType,
295
+ keyData: data,
296
+ slot: slot,
297
+ pinPolicy: pinPolicy,
298
+ touchPolicy: touchPolicy
307
299
)
308
- try await send ( apdu: apdu)
309
300
return rsaKeyType
310
301
}
311
302
@@ -333,27 +324,14 @@ public final actor PIVSession: Session {
333
324
Logger . piv. debug ( " \( String ( describing: self ) . lastComponent) , \( #function) " )
334
325
let eccKeyType = PIV . ECCKey. ecc ( key. curve)
335
326
let keyType = PIV . KeyType. ecc ( key. curve)
336
- try await checkKeyFeatures ( keyType: keyType, pinPolicy: pinPolicy, touchPolicy: touchPolicy, generateKey: false )
337
327
338
- var data = Data ( )
339
- let privateKeyData = key. k
340
- data. append ( TKBERTLVRecord ( tag: 0x06 , value: privateKeyData) . data)
341
-
342
- if pinPolicy != . `defaultPolicy` {
343
- data. append ( TKBERTLVRecord ( tag: tagPinPolicy, value: pinPolicy. rawValue. data) . data)
344
- }
345
- if touchPolicy != . `defaultPolicy` {
346
- data. append ( TKBERTLVRecord ( tag: tagTouchPolicy, value: touchPolicy. rawValue. data) . data)
347
- }
348
- let apdu = APDU (
349
- cla: 0 ,
350
- ins: insImportKey,
351
- p1: keyType. rawValue,
352
- p2: slot. rawValue,
353
- command: data,
354
- type: . extended
328
+ try await importKey (
329
+ keyType: keyType,
330
+ keyData: TKBERTLVRecord ( tag: 0x06 , value: key. k) . data,
331
+ slot: slot,
332
+ pinPolicy: pinPolicy,
333
+ touchPolicy: touchPolicy
355
334
)
356
- try await send ( apdu: apdu)
357
335
return eccKeyType
358
336
}
359
337
@@ -381,27 +359,14 @@ public final actor PIVSession: Session {
381
359
Logger . piv. debug ( " \( String ( describing: self ) . lastComponent) , \( #function) " )
382
360
let ed25519KeyType = PIV . Ed25519Key. ed25519
383
361
let keyType = PIV . KeyType. ed25519
384
- try await checkKeyFeatures ( keyType: keyType, pinPolicy: pinPolicy, touchPolicy: touchPolicy, generateKey: false )
385
362
386
- var data = Data ( )
387
- let privateKeyData = key. seed
388
- data. append ( TKBERTLVRecord ( tag: 0x07 , value: privateKeyData) . data)
389
-
390
- if pinPolicy != . `defaultPolicy` {
391
- data. append ( TKBERTLVRecord ( tag: tagPinPolicy, value: pinPolicy. rawValue. data) . data)
392
- }
393
- if touchPolicy != . `defaultPolicy` {
394
- data. append ( TKBERTLVRecord ( tag: tagTouchPolicy, value: touchPolicy. rawValue. data) . data)
395
- }
396
- let apdu = APDU (
397
- cla: 0 ,
398
- ins: insImportKey,
399
- p1: keyType. rawValue,
400
- p2: slot. rawValue,
401
- command: data,
402
- type: . extended
363
+ try await importKey (
364
+ keyType: keyType,
365
+ keyData: TKBERTLVRecord ( tag: 0x07 , value: key. seed) . data,
366
+ slot: slot,
367
+ pinPolicy: pinPolicy,
368
+ touchPolicy: touchPolicy
403
369
)
404
- try await send ( apdu: apdu)
405
370
return ed25519KeyType
406
371
}
407
372
@@ -429,27 +394,14 @@ public final actor PIVSession: Session {
429
394
Logger . piv. debug ( " \( String ( describing: self ) . lastComponent) , \( #function) " )
430
395
let x25519KeyType = PIV . X25519Key. x25519
431
396
let keyType = PIV . KeyType. x25519
432
- try await checkKeyFeatures ( keyType: keyType, pinPolicy: pinPolicy, touchPolicy: touchPolicy, generateKey: false )
433
397
434
- var data = Data ( )
435
- let privateKeyData = key. scalar
436
- data. append ( TKBERTLVRecord ( tag: 0x08 , value: privateKeyData) . data)
437
-
438
- if pinPolicy != . `defaultPolicy` {
439
- data. append ( TKBERTLVRecord ( tag: tagPinPolicy, value: pinPolicy. rawValue. data) . data)
440
- }
441
- if touchPolicy != . `defaultPolicy` {
442
- data. append ( TKBERTLVRecord ( tag: tagTouchPolicy, value: touchPolicy. rawValue. data) . data)
443
- }
444
- let apdu = APDU (
445
- cla: 0 ,
446
- ins: insImportKey,
447
- p1: keyType. rawValue,
448
- p2: slot. rawValue,
449
- command: data,
450
- type: . extended
398
+ try await importKey (
399
+ keyType: keyType,
400
+ keyData: TKBERTLVRecord ( tag: 0x08 , value: key. scalar) . data,
401
+ slot: slot,
402
+ pinPolicy: pinPolicy,
403
+ touchPolicy: touchPolicy
451
404
)
452
- try await send ( apdu: apdu)
453
405
return x25519KeyType
454
406
}
455
407
@@ -950,6 +902,34 @@ public final actor PIVSession: Session {
950
902
951
903
extension PIVSession {
952
904
905
+ private func importKey(
906
+ keyType: PIV . KeyType ,
907
+ keyData: Data ,
908
+ slot: PIV . Slot ,
909
+ pinPolicy: PIV . PinPolicy ,
910
+ touchPolicy: PIV . TouchPolicy
911
+ ) async throws {
912
+ try await checkKeyFeatures ( keyType: keyType, pinPolicy: pinPolicy, touchPolicy: touchPolicy, generateKey: false )
913
+
914
+ var data = keyData
915
+ if pinPolicy != . `defaultPolicy` {
916
+ data. append ( TKBERTLVRecord ( tag: tagPinPolicy, value: pinPolicy. rawValue. data) . data)
917
+ }
918
+ if touchPolicy != . `defaultPolicy` {
919
+ data. append ( TKBERTLVRecord ( tag: tagTouchPolicy, value: touchPolicy. rawValue. data) . data)
920
+ }
921
+
922
+ let apdu = APDU (
923
+ cla: 0 ,
924
+ ins: insImportKey,
925
+ p1: keyType. rawValue,
926
+ p2: slot. rawValue,
927
+ command: data,
928
+ type: . extended
929
+ )
930
+ try await send ( apdu: apdu)
931
+ }
932
+
953
933
private func usePrivateKeyInSlot(
954
934
slot: PIV . Slot ,
955
935
keyType: PIV . KeyType ,
0 commit comments