@@ -134,6 +134,7 @@ JS_DEFINE_NATIVE_FUNCTION(CryptoKeyPair::private_key_getter)
134134 return TRY (Bindings::throw_dom_exception_if_needed (vm, [&] { return impl->private_key (); }));
135135}
136136
137+ // https://w3c.github.io/webcrypto/#cryptokey-interface-serializable
137138WebIDL::ExceptionOr<void > CryptoKey::serialization_steps (HTML::SerializationRecord& serialized, bool for_storage, HTML::SerializationMemory& memory)
138139{
139140 auto & vm = this ->vm ();
@@ -144,19 +145,58 @@ WebIDL::ExceptionOr<void> CryptoKey::serialization_steps(HTML::SerializationReco
144145 // 2. Set serialized.[[Extractable]] to the [[extractable]] internal slot of value.
145146 HTML::serialize_primitive_type (serialized, m_extractable);
146147
148+ dbgln (" PRE SERIALIZE ALGORITHM" );
147149 // 3. Set serialized.[[Algorithm]] to the sub-serialization of the [[algorithm]] internal slot of value.
148150 auto serialized_algorithm = TRY (HTML::structured_serialize_internal (vm, m_algorithm, for_storage, memory));
149151 serialized.extend (move (serialized_algorithm));
152+ dbgln (" POST SERIALIZE ALGORITHM" );
150153
151154 // 4. Set serialized.[[Usages]] to the sub-serialization of the [[usages]] internal slot of value.
152155 auto serialized_usages = TRY (HTML::structured_serialize_internal (vm, m_usages, for_storage, memory));
153156 serialized.extend (move (serialized_usages));
154157
155- // FIXME: 5. Set serialized.[[Handle]] to the [[handle]] internal slot of value.
158+ // 5. Set serialized.[[Handle]] to the [[handle]] internal slot of value.
159+ TRY (m_key_data.visit (
160+ [&](ByteBuffer const & data) -> WebIDL::ExceptionOr<void > {
161+ TRY (HTML::serialize_string (vm, serialized, " bytes" _string));
162+ TRY (HTML::serialize_bytes (vm, serialized, data));
163+ return {};
164+ },
165+ [&](Bindings::JsonWebKey const & jwk) -> WebIDL::ExceptionOr<void > {
166+ TRY (HTML::serialize_string (vm, serialized, " jwk" _string));
167+ auto serialized_jwk = TRY (HTML::structured_serialize_internal (vm, TRY (jwk.to_object (realm ())), for_storage, memory));
168+ serialized.extend (move (serialized_jwk));
169+ return {};
170+ },
171+ [&](::Crypto::PK::RSAPublicKey const & public_key) -> WebIDL::ExceptionOr<void > {
172+ TRY (HTML::serialize_string (vm, serialized, " rsa-pub" _string));
173+ auto bytes = TRY_OR_THROW_OOM (vm, public_key.export_as_der ());
174+ TRY (HTML::serialize_bytes (vm, serialized, bytes));
175+ return {};
176+ },
177+ [&](::Crypto::PK::RSAPrivateKey const & private_key) -> WebIDL::ExceptionOr<void > {
178+ TRY (HTML::serialize_string (vm, serialized, " rsa-priv" _string));
179+ auto bytes = TRY_OR_THROW_OOM (vm, private_key.export_as_der ());
180+ TRY (HTML::serialize_bytes (vm, serialized, bytes));
181+ return {};
182+ },
183+ [&](::Crypto::PK::ECPublicKey const & public_key) -> WebIDL::ExceptionOr<void > {
184+ TRY (HTML::serialize_string (vm, serialized, " ec-pub" _string));
185+ auto bytes = TRY_OR_THROW_OOM (vm, public_key.to_uncompressed ());
186+ TRY (HTML::serialize_bytes (vm, serialized, bytes));
187+ return {};
188+ },
189+ [&](::Crypto::PK::ECPrivateKey const & private_key) -> WebIDL::ExceptionOr<void > {
190+ TRY (HTML::serialize_string (vm, serialized, " ec-priv" _string));
191+ auto bytes = TRY_OR_THROW_OOM (vm, private_key.export_as_der ());
192+ TRY (HTML::serialize_bytes (vm, serialized, bytes));
193+ return {};
194+ }));
156195
157196 return {};
158197}
159198
199+ // https://w3c.github.io/webcrypto/#cryptokey-interface-serializable
160200WebIDL::ExceptionOr<void > CryptoKey::deserialization_steps (ReadonlySpan<u32 > const & serialized, size_t & position, HTML::DeserializationMemory& memory)
161201{
162202 auto & vm = this ->vm ();
@@ -169,18 +209,44 @@ WebIDL::ExceptionOr<void> CryptoKey::deserialization_steps(ReadonlySpan<u32> con
169209 m_extractable = HTML::deserialize_primitive_type<bool >(serialized, position);
170210
171211 // 3. Initialize the [[algorithm]] internal slot of value to the sub-deserialization of serialized.[[Algorithm]].
212+ dbgln (" PRE DESERIALIZE ALGORITHM" );
172213 auto deserialized_record = TRY (HTML::structured_deserialize_internal (vm, serialized, realm, memory, position));
173214 if (deserialized_record.value .has_value ())
174215 m_algorithm = deserialized_record.value .release_value ().as_object ();
175216 position = deserialized_record.position ;
217+ dbgln (" POST DESERIALIZE ALGORITHM: {}" , m_algorithm);
176218
177219 // 4. Initialize the [[usages]] internal slot of value to the sub-deserialization of serialized.[[Usages]].
178220 deserialized_record = TRY (HTML::structured_deserialize_internal (vm, serialized, realm, memory, position));
179221 if (deserialized_record.value .has_value ())
180222 m_usages = deserialized_record.value .release_value ().as_object ();
181223 position = deserialized_record.position ;
182224
183- // FIXME: 5. Initialize the [[handle]] internal slot of value to serialized.[[Handle]].
225+ // 5. Initialize the [[handle]] internal slot of value to serialized.[[Handle]].
226+ auto deserialized_key_data_type = TRY (HTML::deserialize_string (vm, serialized, position));
227+ if (deserialized_key_data_type == " bytes" ) {
228+ m_key_data = TRY (HTML::deserialize_bytes (vm, serialized, position));
229+ } else if (deserialized_key_data_type == " jwk" ) {
230+ VERIFY_NOT_REACHED ();
231+ } else if (deserialized_key_data_type == " rsa-pub" ) {
232+ auto bytes = TRY (HTML::deserialize_bytes (vm, serialized, position));
233+ auto key_pair = MUST (::Crypto::PK::RSA::parse_rsa_key (bytes, false , {}));
234+ m_key_data = key_pair.public_key ;
235+ } else if (deserialized_key_data_type == " rsa-priv" ) {
236+ auto bytes = TRY (HTML::deserialize_bytes (vm, serialized, position));
237+ auto key_pair = MUST (::Crypto::PK::RSA::parse_rsa_key (bytes, true , {}));
238+ m_key_data = key_pair.private_key ;
239+ } else if (deserialized_key_data_type == " ec-pub" ) {
240+ auto bytes = TRY (HTML::deserialize_bytes (vm, serialized, position));
241+ auto key_pair = MUST (::Crypto::PK::EC::parse_ec_key (bytes, false , {}));
242+ m_key_data = key_pair.public_key ;
243+ } else if (deserialized_key_data_type == " ec-priv" ) {
244+ auto bytes = TRY (HTML::deserialize_bytes (vm, serialized, position));
245+ auto key_pair = MUST (::Crypto::PK::EC::parse_ec_key (bytes, true , {}));
246+ m_key_data = key_pair.private_key ;
247+ } else {
248+ VERIFY_NOT_REACHED ();
249+ }
184250
185251 return {};
186252}
0 commit comments