@@ -19,7 +19,7 @@ import Foundation
19
19
/// `Encodable` byte arrays are base64url encoded.
20
20
///
21
21
/// - SeeAlso: https://www.w3.org/TR/webauthn-2/#dictionary-makecredentialoptions
22
- public struct PublicKeyCredentialCreationOptions : Codable , Sendable {
22
+ public struct PublicKeyCredentialCreationOptions : Sendable {
23
23
/// A byte array randomly generated by the Relying Party. Should be at least 16 bytes long to ensure sufficient
24
24
/// entropy.
25
25
///
@@ -47,30 +47,6 @@ public struct PublicKeyCredentialCreationOptions: Codable, Sendable {
47
47
/// supported.
48
48
public var attestation : AttestationConveyancePreference
49
49
50
- public func encode( to encoder: any Encoder ) throws {
51
- var container = encoder. container ( keyedBy: CodingKeys . self)
52
-
53
- try container. encode ( challenge. base64URLEncodedString ( ) , forKey: . challenge)
54
- try container. encode ( user, forKey: . user)
55
- try container. encode ( relyingParty, forKey: . relyingParty)
56
- try container. encode ( publicKeyCredentialParameters, forKey: . publicKeyCredentialParameters)
57
- try container. encodeIfPresent ( timeout? . milliseconds, forKey: . timeout)
58
- try container. encode ( attestation, forKey: . attestation)
59
- }
60
-
61
- public init ( from decoder: any Decoder ) throws {
62
- let values = try decoder. container ( keyedBy: CodingKeys . self)
63
-
64
- self . challenge = try values. decodeBytesFromURLEncodedBase64 ( forKey: . challenge)
65
- self . user = try values. decode ( PublicKeyCredentialUserEntity . self, forKey: . user)
66
- self . relyingParty = try values. decode ( PublicKeyCredentialRelyingPartyEntity . self, forKey: . relyingParty)
67
- self . publicKeyCredentialParameters = try values. decode ( [ PublicKeyCredentialParameters ] . self, forKey: . publicKeyCredentialParameters)
68
- if let timeout = try values. decodeIfPresent ( UInt32 . self, forKey: . timeout) {
69
- self . timeout = . milliseconds( timeout)
70
- }
71
- self . attestation = try values. decode ( AttestationConveyancePreference . self, forKey: . attestation)
72
- }
73
-
74
50
public init (
75
51
challenge: [ UInt8 ] ,
76
52
user: PublicKeyCredentialUserEntity ,
@@ -86,6 +62,32 @@ public struct PublicKeyCredentialCreationOptions: Codable, Sendable {
86
62
self . timeout = timeout
87
63
self . attestation = attestation
88
64
}
65
+ }
66
+
67
+ extension PublicKeyCredentialCreationOptions : Codable {
68
+ public init ( from decoder: any Decoder ) throws {
69
+ let values = try decoder. container ( keyedBy: CodingKeys . self)
70
+
71
+ self . challenge = try values. decodeBytesFromURLEncodedBase64 ( forKey: . challenge)
72
+ self . user = try values. decode ( PublicKeyCredentialUserEntity . self, forKey: . user)
73
+ self . relyingParty = try values. decode ( PublicKeyCredentialRelyingPartyEntity . self, forKey: . relyingParty)
74
+ self . publicKeyCredentialParameters = try values. decode ( [ PublicKeyCredentialParameters ] . self, forKey: . publicKeyCredentialParameters)
75
+ if let timeout = try values. decodeIfPresent ( UInt32 . self, forKey: . timeout) {
76
+ self . timeout = . milliseconds( timeout)
77
+ }
78
+ self . attestation = try values. decode ( AttestationConveyancePreference . self, forKey: . attestation)
79
+ }
80
+
81
+ public func encode( to encoder: any Encoder ) throws {
82
+ var container = encoder. container ( keyedBy: CodingKeys . self)
83
+
84
+ try container. encode ( challenge. base64URLEncodedString ( ) , forKey: . challenge)
85
+ try container. encode ( user, forKey: . user)
86
+ try container. encode ( relyingParty, forKey: . relyingParty)
87
+ try container. encode ( publicKeyCredentialParameters, forKey: . publicKeyCredentialParameters)
88
+ try container. encodeIfPresent ( timeout? . milliseconds, forKey: . timeout)
89
+ try container. encode ( attestation, forKey: . attestation)
90
+ }
89
91
90
92
private enum CodingKeys : String , CodingKey {
91
93
case challenge
@@ -116,13 +118,6 @@ public struct PublicKeyCredentialParameters: Equatable, Codable, Sendable {
116
118
self . type = type
117
119
self . alg = alg
118
120
}
119
-
120
- public init ( from decoder: any Decoder ) throws {
121
- let container = try decoder. container ( keyedBy: CodingKeys . self)
122
-
123
- self . type = try container. decode ( CredentialType . self, forKey: . type)
124
- self . alg = try container. decode ( COSEAlgorithmIdentifier . self, forKey: . alg)
125
- }
126
121
}
127
122
128
123
extension Array where Element == PublicKeyCredentialParameters {
@@ -158,7 +153,7 @@ public struct PublicKeyCredentialRelyingPartyEntity: Codable, Sendable {
158
153
/// creating a new credential.
159
154
///
160
155
/// When encoding using `Encodable`, `id` is base64url encoded.
161
- public struct PublicKeyCredentialUserEntity : Codable , Sendable {
156
+ public struct PublicKeyCredentialUserEntity : Sendable {
162
157
/// Generated by the Relying Party, unique to the user account, and must not contain personally identifying
163
158
/// information about the user.
164
159
///
@@ -181,15 +176,9 @@ public struct PublicKeyCredentialUserEntity: Codable, Sendable {
181
176
self . name = name
182
177
self . displayName = displayName
183
178
}
179
+ }
184
180
185
- public func encode( to encoder: any Encoder ) throws {
186
- var container = encoder. container ( keyedBy: CodingKeys . self)
187
-
188
- try container. encode ( id. base64URLEncodedString ( ) , forKey: . id)
189
- try container. encode ( name, forKey: . name)
190
- try container. encode ( displayName, forKey: . displayName)
191
- }
192
-
181
+ extension PublicKeyCredentialUserEntity : Codable {
193
182
public init ( from decoder: any Decoder ) throws {
194
183
let container = try decoder. container ( keyedBy: CodingKeys . self)
195
184
@@ -198,6 +187,13 @@ public struct PublicKeyCredentialUserEntity: Codable, Sendable {
198
187
self . displayName = try container. decode ( String . self, forKey: . displayName)
199
188
}
200
189
190
+ public func encode( to encoder: any Encoder ) throws {
191
+ var container = encoder. container ( keyedBy: CodingKeys . self)
192
+
193
+ try container. encode ( id. base64URLEncodedString ( ) , forKey: . id)
194
+ try container. encode ( name, forKey: . name)
195
+ try container. encode ( displayName, forKey: . displayName)
196
+ }
201
197
202
198
private enum CodingKeys : String , CodingKey {
203
199
case id
0 commit comments