@@ -137,6 +137,7 @@ JS_DEFINE_NATIVE_FUNCTION(CryptoKeyPair::private_key_getter)
137137 return TRY (Bindings::throw_dom_exception_if_needed (vm, [&] { return impl->private_key (); }));
138138}
139139
140+ // https://w3c.github.io/webcrypto/#cryptokey-interface-serializable
140141WebIDL::ExceptionOr<void > CryptoKey::serialization_steps (HTML::TransferDataEncoder& serialized, bool for_storage, HTML::SerializationMemory& memory)
141142{
142143 auto & vm = this ->vm ();
@@ -155,11 +156,48 @@ WebIDL::ExceptionOr<void> CryptoKey::serialization_steps(HTML::TransferDataEncod
155156 auto serialized_usages = TRY (HTML::structured_serialize_internal (vm, m_usages, for_storage, memory));
156157 serialized.append (move (serialized_usages));
157158
158- // FIXME: 5. Set serialized.[[Handle]] to the [[handle]] internal slot of value.
159+ // 5. Set serialized.[[Handle]] to the [[handle]] internal slot of value.
160+ TRY (m_key_data.visit (
161+ [&](ByteBuffer const & data) -> WebIDL::ExceptionOr<void > {
162+ TRY (HTML::serialize_string (vm, serialized, " bytes" _string));
163+ TRY (HTML::serialize_bytes (vm, serialized, data));
164+ return {};
165+ },
166+ [&](Bindings::JsonWebKey const & jwk) -> WebIDL::ExceptionOr<void > {
167+ TRY (HTML::serialize_string (vm, serialized, " jwk" _string));
168+ auto serialized_jwk = TRY (HTML::structured_serialize_internal (vm, TRY (jwk.to_object (realm ())), for_storage, memory));
169+ serialized.extend (move (serialized_jwk));
170+ return {};
171+ },
172+ [&](::Crypto::PK::RSAPublicKey const & public_key) -> WebIDL::ExceptionOr<void > {
173+ TRY (HTML::serialize_string (vm, serialized, " rsa-pub" _string));
174+ auto bytes = TRY_OR_THROW_OOM (vm, public_key.export_as_der ());
175+ TRY (HTML::serialize_bytes (vm, serialized, bytes));
176+ return {};
177+ },
178+ [&](::Crypto::PK::RSAPrivateKey const & private_key) -> WebIDL::ExceptionOr<void > {
179+ TRY (HTML::serialize_string (vm, serialized, " rsa-priv" _string));
180+ auto bytes = TRY_OR_THROW_OOM (vm, private_key.export_as_der ());
181+ TRY (HTML::serialize_bytes (vm, serialized, bytes));
182+ return {};
183+ },
184+ [&](::Crypto::PK::ECPublicKey const & public_key) -> WebIDL::ExceptionOr<void > {
185+ TRY (HTML::serialize_string (vm, serialized, " ec-pub" _string));
186+ auto bytes = TRY_OR_THROW_OOM (vm, public_key.to_uncompressed ());
187+ TRY (HTML::serialize_bytes (vm, serialized, bytes));
188+ return {};
189+ },
190+ [&](::Crypto::PK::ECPrivateKey const & private_key) -> WebIDL::ExceptionOr<void > {
191+ TRY (HTML::serialize_string (vm, serialized, " ec-priv" _string));
192+ auto bytes = TRY_OR_THROW_OOM (vm, private_key.export_as_der ());
193+ TRY (HTML::serialize_bytes (vm, serialized, bytes));
194+ return {};
195+ }));
159196
160197 return {};
161198}
162199
200+ // https://w3c.github.io/webcrypto/#cryptokey-interface-serializable
163201WebIDL::ExceptionOr<void > CryptoKey::deserialization_steps (HTML::TransferDataDecoder& serialized, HTML::DeserializationMemory& memory)
164202{
165203 auto & vm = this ->vm ();
@@ -179,7 +217,31 @@ WebIDL::ExceptionOr<void> CryptoKey::deserialization_steps(HTML::TransferDataDec
179217 deserialized = TRY (HTML::structured_deserialize_internal (vm, serialized, realm, memory));
180218 m_usages = deserialized.as_object ();
181219
182- // FIXME: 5. Initialize the [[handle]] internal slot of value to serialized.[[Handle]].
220+ // 5. Initialize the [[handle]] internal slot of value to serialized.[[Handle]].
221+ auto deserialized_key_data_type = TRY (HTML::deserialize_string (vm, serialized, position));
222+ if (deserialized_key_data_type == " bytes" ) {
223+ m_key_data = TRY (HTML::deserialize_bytes (vm, serialized, position));
224+ } else if (deserialized_key_data_type == " jwk" ) {
225+ VERIFY_NOT_REACHED ();
226+ } else if (deserialized_key_data_type == " rsa-pub" ) {
227+ auto bytes = TRY (HTML::deserialize_bytes (vm, serialized, position));
228+ auto key_pair = MUST (::Crypto::PK::RSA::parse_rsa_key (bytes, false , {}));
229+ m_key_data = key_pair.public_key ;
230+ } else if (deserialized_key_data_type == " rsa-priv" ) {
231+ auto bytes = TRY (HTML::deserialize_bytes (vm, serialized, position));
232+ auto key_pair = MUST (::Crypto::PK::RSA::parse_rsa_key (bytes, true , {}));
233+ m_key_data = key_pair.private_key ;
234+ } else if (deserialized_key_data_type == " ec-pub" ) {
235+ auto bytes = TRY (HTML::deserialize_bytes (vm, serialized, position));
236+ auto key_pair = MUST (::Crypto::PK::EC::parse_ec_key (bytes, false , {}));
237+ m_key_data = key_pair.public_key ;
238+ } else if (deserialized_key_data_type == " ec-priv" ) {
239+ auto bytes = TRY (HTML::deserialize_bytes (vm, serialized, position));
240+ auto key_pair = MUST (::Crypto::PK::EC::parse_ec_key (bytes, true , {}));
241+ m_key_data = key_pair.private_key ;
242+ } else {
243+ VERIFY_NOT_REACHED ();
244+ }
183245
184246 return {};
185247}
0 commit comments