|
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