|
20 | 20 | namespace node { |
21 | 21 |
|
22 | 22 | using v8::Array; |
| 23 | +using v8::ArrayBuffer; |
| 24 | +using v8::BackingStore; |
23 | 25 | using v8::FunctionCallbackInfo; |
24 | 26 | using v8::FunctionTemplate; |
25 | 27 | using v8::Int32; |
@@ -220,17 +222,23 @@ void ECDH::ComputeSecret(const FunctionCallbackInfo<Value>& args) { |
220 | 222 | return; |
221 | 223 | } |
222 | 224 |
|
223 | | - // NOTE: field_size is in bits |
224 | | - int field_size = EC_GROUP_get_degree(ecdh->group_); |
225 | | - size_t out_len = (field_size + 7) / 8; |
226 | | - AllocatedBuffer out = AllocatedBuffer::AllocateManaged(env, out_len); |
| 225 | + std::unique_ptr<BackingStore> bs; |
| 226 | + { |
| 227 | + NoArrayBufferZeroFillScope no_zero_fill_scope(env->isolate_data()); |
| 228 | + // NOTE: field_size is in bits |
| 229 | + int field_size = EC_GROUP_get_degree(ecdh->group_); |
| 230 | + size_t out_len = (field_size + 7) / 8; |
| 231 | + bs = ArrayBuffer::NewBackingStore(env->isolate(), out_len); |
| 232 | + } |
227 | 233 |
|
228 | | - int r = ECDH_compute_key( |
229 | | - out.data(), out_len, pub.get(), ecdh->key_.get(), nullptr); |
230 | | - if (!r) |
| 234 | + if (!ECDH_compute_key( |
| 235 | + bs->Data(), bs->ByteLength(), pub.get(), ecdh->key_.get(), nullptr)) |
231 | 236 | return THROW_ERR_CRYPTO_OPERATION_FAILED(env, "Failed to compute ECDH key"); |
232 | 237 |
|
233 | | - args.GetReturnValue().Set(out.ToBuffer().FromMaybe(Local<Value>())); |
| 238 | + Local<ArrayBuffer> ab = ArrayBuffer::New(env->isolate(), std::move(bs)); |
| 239 | + Local<Value> buffer; |
| 240 | + if (!Buffer::New(env, ab, 0, ab->ByteLength()).ToLocal(&buffer)) return; |
| 241 | + args.GetReturnValue().Set(buffer); |
234 | 242 | } |
235 | 243 |
|
236 | 244 | void ECDH::GetPublicKey(const FunctionCallbackInfo<Value>& args) { |
@@ -270,13 +278,19 @@ void ECDH::GetPrivateKey(const FunctionCallbackInfo<Value>& args) { |
270 | 278 | return THROW_ERR_CRYPTO_OPERATION_FAILED(env, |
271 | 279 | "Failed to get ECDH private key"); |
272 | 280 |
|
273 | | - const int size = BN_num_bytes(b); |
274 | | - AllocatedBuffer out = AllocatedBuffer::AllocateManaged(env, size); |
275 | | - CHECK_EQ(size, BN_bn2binpad(b, |
276 | | - reinterpret_cast<unsigned char*>(out.data()), |
277 | | - size)); |
| 281 | + std::unique_ptr<BackingStore> bs; |
| 282 | + { |
| 283 | + NoArrayBufferZeroFillScope no_zero_fill_scope(env->isolate_data()); |
| 284 | + bs = ArrayBuffer::NewBackingStore(env->isolate(), BN_num_bytes(b)); |
| 285 | + } |
| 286 | + CHECK_EQ(static_cast<int>(bs->ByteLength()), |
| 287 | + BN_bn2binpad( |
| 288 | + b, static_cast<unsigned char*>(bs->Data()), bs->ByteLength())); |
278 | 289 |
|
279 | | - args.GetReturnValue().Set(out.ToBuffer().FromMaybe(Local<Value>())); |
| 290 | + Local<ArrayBuffer> ab = ArrayBuffer::New(env->isolate(), std::move(bs)); |
| 291 | + Local<Value> buffer; |
| 292 | + if (!Buffer::New(env, ab, 0, ab->ByteLength()).ToLocal(&buffer)) return; |
| 293 | + args.GetReturnValue().Set(buffer); |
280 | 294 | } |
281 | 295 |
|
282 | 296 | void ECDH::SetPrivateKey(const FunctionCallbackInfo<Value>& args) { |
|
0 commit comments