mirror of
https://github.com/RGBCube/serenity
synced 2025-05-31 14:28:12 +00:00
LibWeb: Export UnsignedBigInts into Uint8Arrays without losing bytes
The behavior of Crypto::UnsignedBigInt::export_data unexpectedly does not actually remove leading zero bytes when the corresponding parameter is passed. The caller must manually adjust for the location of the zero bytes.
This commit is contained in:
parent
0a3d27c41d
commit
2599142214
2 changed files with 6 additions and 5 deletions
|
@ -1,11 +1,11 @@
|
||||||
generateKey with RSA-OAEP algorithm
|
generateKey with RSA-OAEP algorithm
|
||||||
publicKey: [object CryptoKey]
|
publicKey: [object CryptoKey]
|
||||||
publicKey algorithm: {"name":"RSA-OAEP","modulusLength":512,"publicExponent":{"0":0,"1":1,"2":0},"hash":"SHA-256"}
|
publicKey algorithm: {"name":"RSA-OAEP","modulusLength":512,"publicExponent":{"0":1,"1":0,"2":1},"hash":"SHA-256"}
|
||||||
publicKey type: public
|
publicKey type: public
|
||||||
publicKey extractable: true
|
publicKey extractable: true
|
||||||
publicKey usages: encrypt,wrapKey
|
publicKey usages: encrypt,wrapKey
|
||||||
privateKey: [object CryptoKey]
|
privateKey: [object CryptoKey]
|
||||||
privateKey algorithm: {"name":"RSA-OAEP","modulusLength":512,"publicExponent":{"0":0,"1":1,"2":0},"hash":"SHA-256"}
|
privateKey algorithm: {"name":"RSA-OAEP","modulusLength":512,"publicExponent":{"0":1,"1":0,"2":1},"hash":"SHA-256"}
|
||||||
privateKey type: private
|
privateKey type: private
|
||||||
privateKey extractable: true
|
privateKey extractable: true
|
||||||
privateKey usages: decrypt,unwrapKey
|
privateKey usages: decrypt,unwrapKey
|
||||||
|
|
|
@ -90,15 +90,16 @@ WebIDL::ExceptionOr<void> RsaKeyAlgorithm::set_public_exponent(::Crypto::Unsigne
|
||||||
|
|
||||||
auto bytes = TRY_OR_THROW_OOM(vm, ByteBuffer::create_uninitialized(exponent.trimmed_byte_length()));
|
auto bytes = TRY_OR_THROW_OOM(vm, ByteBuffer::create_uninitialized(exponent.trimmed_byte_length()));
|
||||||
|
|
||||||
bool const strip_leading_zeroes = true;
|
bool const remove_leading_zeroes = true;
|
||||||
auto data_size = exponent.export_data(bytes.span(), strip_leading_zeroes);
|
auto data_size = exponent.export_data(bytes.span(), remove_leading_zeroes);
|
||||||
|
auto data_slice = bytes.bytes().slice(bytes.size() - data_size, data_size);
|
||||||
|
|
||||||
// The BigInteger typedef from the WebCrypto spec requires the bytes in the Uint8Array be ordered in Big Endian
|
// The BigInteger typedef from the WebCrypto spec requires the bytes in the Uint8Array be ordered in Big Endian
|
||||||
|
|
||||||
Vector<u8, 32> byte_swapped_data;
|
Vector<u8, 32> byte_swapped_data;
|
||||||
byte_swapped_data.ensure_capacity(data_size);
|
byte_swapped_data.ensure_capacity(data_size);
|
||||||
for (size_t i = 0; i < data_size; ++i)
|
for (size_t i = 0; i < data_size; ++i)
|
||||||
byte_swapped_data.append(bytes[data_size - i - 1]);
|
byte_swapped_data.append(data_slice[data_size - i - 1]);
|
||||||
|
|
||||||
m_public_exponent = TRY(JS::Uint8Array::create(realm, byte_swapped_data.size()));
|
m_public_exponent = TRY(JS::Uint8Array::create(realm, byte_swapped_data.size()));
|
||||||
m_public_exponent->viewed_array_buffer()->buffer().overwrite(0, byte_swapped_data.data(), byte_swapped_data.size());
|
m_public_exponent->viewed_array_buffer()->buffer().overwrite(0, byte_swapped_data.data(), byte_swapped_data.size());
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue