@@ -20,59 +20,61 @@ public protocol SecKeyConvertible: SecKeyRepresentable {
2020
2121// MARK: - CryptoKit
2222
23+ /// NIST P-256 (also known as `secp256r1` / `prime256r1` / `prime256v1`).
24+
2325extension P256 . Signing . PrivateKey : SecKeyConvertible {
24- public var descriptor : SecKeyDescriptor { . ecsecPrimeRandom ( . private ) }
26+ public var secKeyDescriptor : SecKeyDescriptor { . ecPrivateKey }
2527}
26-
2728extension P256 . Signing . PublicKey : SecKeyConvertible {
28- public var descriptor : SecKeyDescriptor { . ecsecPrimeRandom ( . public ) }
29+ public var secKeyDescriptor : SecKeyDescriptor { . ecPublicKey }
2930}
3031
3132extension P256 . KeyAgreement . PrivateKey : SecKeyConvertible {
32- public var descriptor : SecKeyDescriptor { . ecsecPrimeRandom ( . private ) }
33+ public var secKeyDescriptor : SecKeyDescriptor { . ecPrivateKey }
3334}
34-
3535extension P256 . KeyAgreement . PublicKey : SecKeyConvertible {
36- public var descriptor : SecKeyDescriptor { . ecsecPrimeRandom ( . public ) }
36+ public var secKeyDescriptor : SecKeyDescriptor { . ecPublicKey }
3737}
3838
39+ /// NIST P-384 (also known as `secp384r1` ).
40+
3941extension P384 . Signing . PrivateKey : SecKeyConvertible {
40- public var descriptor : SecKeyDescriptor { . ecsecPrimeRandom ( . private ) }
42+ public var secKeyDescriptor : SecKeyDescriptor { . ecPrivateKey }
4143}
4244
4345extension P384 . Signing . PublicKey : SecKeyConvertible {
44- public var descriptor : SecKeyDescriptor { . ecsecPrimeRandom ( . public ) }
46+ public var secKeyDescriptor : SecKeyDescriptor { . ecPublicKey }
4547}
4648
4749extension P384 . KeyAgreement . PrivateKey : SecKeyConvertible {
48- public var descriptor : SecKeyDescriptor { . ecsecPrimeRandom ( . private ) }
50+ public var secKeyDescriptor : SecKeyDescriptor { . ecPrivateKey }
4951}
5052
5153extension P384 . KeyAgreement . PublicKey : SecKeyConvertible {
52- public var descriptor : SecKeyDescriptor { . ecsecPrimeRandom ( . public ) }
54+ public var secKeyDescriptor : SecKeyDescriptor { . ecPublicKey }
5355}
5456
57+ /// NIST P-521 (also known as `secp521r1` ).
58+
5559extension P521 . Signing . PrivateKey : SecKeyConvertible {
56- public var descriptor : SecKeyDescriptor { . ecsecPrimeRandom ( . private ) }
60+ public var secKeyDescriptor : SecKeyDescriptor { . ecPrivateKey }
5761}
58-
5962extension P521 . Signing . PublicKey : SecKeyConvertible {
60- public var descriptor : SecKeyDescriptor { . ecsecPrimeRandom ( . public ) }
63+ public var secKeyDescriptor : SecKeyDescriptor { . ecPublicKey }
6164}
6265
6366extension P521 . KeyAgreement . PrivateKey : SecKeyConvertible {
64- public var descriptor : SecKeyDescriptor { . ecsecPrimeRandom ( . private ) }
67+ public var secKeyDescriptor : SecKeyDescriptor { . ecPrivateKey }
6568}
66-
6769extension P521 . KeyAgreement . PublicKey : SecKeyConvertible {
68- public var descriptor : SecKeyDescriptor { . ecsecPrimeRandom ( . public ) }
70+ public var secKeyDescriptor : SecKeyDescriptor { . ecPublicKey }
6971}
7072
7173// MARK: - SecKey
7274
7375public protocol SecKeyRepresentable {
7476 /// A key descriptor for storage.
75- var descriptor : SecKeyDescriptor { get }
77+ var secKeyDescriptor : SecKeyDescriptor { get }
7678
7779 /// A key reference.
7880 var secKey : SecKey { get throws }
@@ -81,11 +83,19 @@ public protocol SecKeyRepresentable {
8183extension SecKeyConvertible {
8284 public var secKey : SecKey {
8385 get throws {
84- precondition ( descriptor. keyType == . ecsecPrimeRandom, " RSA is currently unsupported " )
86+ let keyData : Data
87+ switch secKeyDescriptor. keyType {
88+ case . ecsecPrimeRandom:
89+ keyData = x963Representation
90+ case . rsa:
91+ // override and use data in PKCS #1 format
92+ throw SwiftSecurityError . unimplemented
93+ }
94+
8595 var error : Unmanaged < CFError > ?
86- guard let secKey: SecKey = SecKeyCreateWithData ( x963Representation as CFData , [
87- kSecAttrKeyType: descriptor . keyType. rawValue,
88- kSecAttrKeyClass: descriptor . keyClass. rawValue
96+ guard let secKey: SecKey = SecKeyCreateWithData ( keyData as CFData , [
97+ kSecAttrKeyType: secKeyDescriptor . keyType. rawValue,
98+ kSecAttrKeyClass: secKeyDescriptor . keyClass. rawValue
8999 ] as CFDictionary , & error) else {
90100 if let error = error? . takeRetainedValue ( ) {
91101 throw SwiftSecurityError ( error: error)
@@ -101,21 +111,19 @@ public struct SecKeyDescriptor {
101111 public var keyType : KeyType
102112 public var keyClass : KeyClass
103113
104- public static func rsa( _ keyClass: KeyClass ) -> SecKeyDescriptor {
105- switch keyClass {
106- case . public:
107- SecKeyDescriptor ( keyType: . rsa, keyClass: . public)
108- case . private:
109- SecKeyDescriptor ( keyType: . rsa, keyClass: . private)
110- }
111- }
114+ /// A private key for elliptic curve cryptography. Suitable for `P256`/`P384`/`P521` keys from `CryptoKit`.
115+ public static let ecPrivateKey = SecKeyDescriptor ( keyType: . ecsecPrimeRandom, keyClass: . private)
116+ /// A public key for elliptic curve cryptography. Suitable for `P256`/`P384`/`P521` keys from `CryptoKit`.
117+ public static let ecPublicKey = SecKeyDescriptor ( keyType: . ecsecPrimeRandom, keyClass: . public)
112118
113- public static func ecsecPrimeRandom( _ keyClass: KeyClass ) -> SecKeyDescriptor {
114- switch keyClass {
115- case . public:
116- SecKeyDescriptor ( keyType: . ecsecPrimeRandom, keyClass: . public)
117- case . private:
118- SecKeyDescriptor ( keyType: . ecsecPrimeRandom, keyClass: . private)
119- }
119+ /// A private key for `RSA` cryptography.
120+ public static let rsaPrivateKey = SecKeyDescriptor ( keyType: . rsa, keyClass: . private)
121+ /// A public key for `RSA` cryptography.
122+ public static let rsaPublicKey = SecKeyDescriptor ( keyType: . rsa, keyClass: . public)
123+
124+ /// A descriptor that defines the properties of the key.
125+ public init ( keyType: KeyType , keyClass: KeyClass ) {
126+ self . keyType = keyType
127+ self . keyClass = keyClass
120128 }
121129}
0 commit comments