Skip to content

Commit 1830586

Browse files
committed
Improves retrieval of keys
1 parent da38d34 commit 1830586

File tree

2 files changed

+33
-24
lines changed

2 files changed

+33
-24
lines changed

Sources/SwiftSecurity/CryptoKit/SecKeyConvertible.swift

Lines changed: 26 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -29,58 +29,58 @@ public protocol SecKeyConvertible: SecKeyRepresentable {
2929
/// NIST P-256 (also known as `secp256r1` / `prime256r1` / `prime256v1`).
3030

3131
extension P256.Signing.PrivateKey: SecKeyConvertible {
32-
public var secKeyDescriptor: SecKeyDescriptor { .ecPrivateKey }
32+
public static var keyDescriptor: SecKeyDescriptor { .ecPrivateKey }
3333
}
3434
extension P256.Signing.PublicKey: SecKeyConvertible {
35-
public var secKeyDescriptor: SecKeyDescriptor { .ecPublicKey }
35+
public static var keyDescriptor: SecKeyDescriptor { .ecPublicKey }
3636
}
3737

3838
extension P256.KeyAgreement.PrivateKey: SecKeyConvertible {
39-
public var secKeyDescriptor: SecKeyDescriptor { .ecPrivateKey }
39+
public static var keyDescriptor: SecKeyDescriptor { .ecPrivateKey }
4040
}
4141
extension P256.KeyAgreement.PublicKey: SecKeyConvertible {
42-
public var secKeyDescriptor: SecKeyDescriptor { .ecPublicKey }
42+
public static var keyDescriptor: SecKeyDescriptor { .ecPublicKey }
4343
}
4444

4545
/// NIST P-384 (also known as `secp384r1` ).
4646

4747
extension P384.Signing.PrivateKey: SecKeyConvertible {
48-
public var secKeyDescriptor: SecKeyDescriptor { .ecPrivateKey }
48+
public static var keyDescriptor: SecKeyDescriptor { .ecPrivateKey }
4949
}
5050

5151
extension P384.Signing.PublicKey: SecKeyConvertible {
52-
public var secKeyDescriptor: SecKeyDescriptor { .ecPublicKey }
52+
public static var keyDescriptor: SecKeyDescriptor { .ecPublicKey }
5353
}
5454

5555
extension P384.KeyAgreement.PrivateKey: SecKeyConvertible {
56-
public var secKeyDescriptor: SecKeyDescriptor { .ecPrivateKey }
56+
public static var keyDescriptor: SecKeyDescriptor { .ecPrivateKey }
5757
}
5858

5959
extension P384.KeyAgreement.PublicKey: SecKeyConvertible {
60-
public var secKeyDescriptor: SecKeyDescriptor { .ecPublicKey }
60+
public static var keyDescriptor: SecKeyDescriptor { .ecPublicKey }
6161
}
6262

6363
/// NIST P-521 (also known as `secp521r1` ).
6464

6565
extension P521.Signing.PrivateKey: SecKeyConvertible {
66-
public var secKeyDescriptor: SecKeyDescriptor { .ecPrivateKey }
66+
public static var keyDescriptor: SecKeyDescriptor { .ecPrivateKey }
6767
}
6868
extension P521.Signing.PublicKey: SecKeyConvertible {
69-
public var secKeyDescriptor: SecKeyDescriptor { .ecPublicKey }
69+
public static var keyDescriptor: SecKeyDescriptor { .ecPublicKey }
7070
}
7171

7272
extension P521.KeyAgreement.PrivateKey: SecKeyConvertible {
73-
public var secKeyDescriptor: SecKeyDescriptor { .ecPrivateKey }
73+
public static var keyDescriptor: SecKeyDescriptor { .ecPrivateKey }
7474
}
7575
extension P521.KeyAgreement.PublicKey: SecKeyConvertible {
76-
public var secKeyDescriptor: SecKeyDescriptor { .ecPublicKey }
76+
public static var keyDescriptor: SecKeyDescriptor { .ecPublicKey }
7777
}
7878

7979
// MARK: - SecKey
8080

8181
public protocol SecKeyRepresentable {
8282
/// A key descriptor for storage.
83-
var secKeyDescriptor: SecKeyDescriptor { get }
83+
static var keyDescriptor: SecKeyDescriptor { get }
8484

8585
/// A key reference.
8686
var secKey: SecKey { get throws }
@@ -90,7 +90,7 @@ extension SecKeyConvertible {
9090
public var secKey: SecKey {
9191
get throws {
9292
let keyData: Data
93-
switch secKeyDescriptor.keyType {
93+
switch keyType {
9494
case .ecsecPrimeRandom:
9595
// X9.63
9696
keyData = x963Representation
@@ -101,8 +101,8 @@ extension SecKeyConvertible {
101101

102102
var error: Unmanaged<CFError>?
103103
guard let secKey: SecKey = SecKeyCreateWithData(keyData as CFData, [
104-
kSecAttrKeyType: secKeyDescriptor.keyType.rawValue,
105-
kSecAttrKeyClass: secKeyDescriptor.keyClass.rawValue
104+
kSecAttrKeyType: keyType.rawValue,
105+
kSecAttrKeyClass: keyClass.rawValue
106106
] as CFDictionary, &error) else {
107107
if let error = error?.takeRetainedValue() {
108108
throw SwiftSecurityError(error: error)
@@ -112,6 +112,16 @@ extension SecKeyConvertible {
112112
return secKey
113113
}
114114
}
115+
116+
/// The type of the key.
117+
public var keyType: KeyType {
118+
Self.keyDescriptor.keyType
119+
}
120+
121+
/// The role of the key.
122+
public var keyClass: KeyClass {
123+
Self.keyDescriptor.keyClass
124+
}
115125
}
116126

117127
public struct SecKeyDescriptor: Sendable {

Sources/SwiftSecurity/Keychain/Keychain.swift

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -324,9 +324,9 @@ extension Keychain: SecKeyStore {
324324
) throws -> SecValue<SecKey>? {
325325
guard
326326
/// If key type specified in query, it should match with type from key's descriptor. Refer to `.key(for:descriptor:)`
327-
query.keyType == nil || query.keyType == key.secKeyDescriptor.keyType,
327+
query.keyType == nil || query.keyType == key.keyType,
328328
/// If key class specified in query, it should match with class from key's descriptor.
329-
query.keyClass == nil || query.keyClass == key.secKeyDescriptor.keyClass
329+
query.keyClass == nil || query.keyClass == key.keyClass
330330
else {
331331
/// You most likely tried to store a public key as a private key. While it might be accepted by the keychain, it could lead to confusion.
332332
throw SwiftSecurityError.invalidParameter
@@ -350,12 +350,11 @@ extension Keychain: SecKeyStore {
350350
throw SwiftSecurityError.invalidParameter
351351
}
352352

353-
if let ecKey = try? T(x963Representation: data) {
354-
return ecKey
355-
} else if let rsaKey = try? T(derRepresentation: data) {
356-
return rsaKey
357-
} else {
358-
throw SwiftSecurityError.invalidParameter
353+
switch T.keyDescriptor.keyType {
354+
case .ecsecPrimeRandom:
355+
return try T(x963Representation: data)
356+
case .rsa:
357+
return try T(derRepresentation: data)
359358
}
360359
}
361360
}

0 commit comments

Comments
 (0)