Skip to content

Commit 8793510

Browse files
committed
crypto: improvement random syncrone number creating performance
this pr improve random syncron number creator node git:(main) ✗ npx node-benchmark-compare rb.csv confidence improvement accuracy (*) (**) (***) crypto/randomBytes.js n=100000 size=1024 *** 77.15 % ±3.14% ±4.18% ±5.45% crypto/randomBytes.js n=100000 size=16384 -4.11 % ±5.22% ±6.95% ±9.04% crypto/randomBytes.js n=100000 size=64 *** 107.53 % ±5.13% ±6.85% ±8.96% crypto/randomBytes.js n=100000 size=8192 *** 24.62 % ±4.48% ±5.98% ±7.81% Assisted-by:Claude Code Opus 5.5 Signed-off-by: Mert Can Altin <mertgold60@gmail.com>
1 parent 3641c36 commit 8793510

2 files changed

Lines changed: 22 additions & 10 deletions

File tree

‎lib/internal/crypto/random.js‎

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ const {
3434
CheckPrimeJob,
3535
kCryptoJobAsync,
3636
kCryptoJobSync,
37+
randomFillSync: randomFillSyncImpl,
3738
secureBuffer,
3839
} = internalBinding('crypto');
3940

@@ -175,16 +176,7 @@ function randomFillSync(buf, offset = 0, size) {
175176
if (size === 0)
176177
return buf;
177178

178-
const job = new RandomBytesJob(
179-
kCryptoJobSync,
180-
buf,
181-
offset,
182-
size);
183-
184-
const err = job.run()[0];
185-
if (err)
186-
throw err;
187-
179+
randomFillSyncImpl(buf, offset, size);
188180
return buf;
189181
}
190182

‎src/crypto/crypto_random.cc‎

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -214,13 +214,33 @@ MaybeLocal<Value> CheckPrimeTraits::EncodeOutput(Environment* env,
214214
}
215215

216216
namespace Random {
217+
static void RandomFillSync(const FunctionCallbackInfo<Value>& args) {
218+
Environment* env = Environment::GetCurrent(args);
219+
CHECK(IsAnyBufferSource(args[0])); // Buffer to fill
220+
CHECK(args[1]->IsUint32()); // Offset
221+
CHECK(args[2]->IsUint32()); // Size
222+
223+
ArrayBufferOrViewContents<unsigned char> in(args[0]);
224+
225+
const uint32_t byte_offset = args[1].As<Uint32>()->Value();
226+
const uint32_t size = args[2].As<Uint32>()->Value();
227+
CHECK_GE(byte_offset + size, byte_offset); // Overflow check.
228+
CHECK_LE(byte_offset + size, in.size()); // Bounds check.
229+
230+
if (!ncrypto::CSPRNG(in.data() + byte_offset, size)) {
231+
THROW_ERR_CRYPTO_OPERATION_FAILED(env, "Deriving bits failed");
232+
}
233+
}
234+
217235
void Initialize(Environment* env, Local<Object> target) {
236+
SetMethod(env->context(), target, "randomFillSync", RandomFillSync);
218237
RandomBytesJob::Initialize(env, target);
219238
RandomPrimeJob::Initialize(env, target);
220239
CheckPrimeJob::Initialize(env, target);
221240
}
222241

223242
void RegisterExternalReferences(ExternalReferenceRegistry* registry) {
243+
registry->Register(RandomFillSync);
224244
RandomBytesJob::RegisterExternalReferences(registry);
225245
RandomPrimeJob::RegisterExternalReferences(registry);
226246
CheckPrimeJob::RegisterExternalReferences(registry);

0 commit comments

Comments
 (0)