Skip to content

Commit 8ba7052

Browse files
authored
Revert "Update node crypto kdf apis to use BufferSource" (#3118)
1 parent 8e9bcd5 commit 8ba7052

File tree

6 files changed

+28
-47
lines changed

6 files changed

+28
-47
lines changed

src/workerd/api/crypto/hkdf.c++

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -54,11 +54,8 @@ private:
5454

5555
auto derivedLengthBytes = length / 8;
5656

57-
auto bs = JSG_REQUIRE_NONNULL(hkdf(js, derivedLengthBytes, hashType, keyData, salt, info),
57+
return JSG_REQUIRE_NONNULL(hkdf(derivedLengthBytes, hashType, keyData, salt, info),
5858
DOMOperationError, "HKDF deriveBits failed.");
59-
60-
// TODO(cleanup): deriveBits should return a BufferSource and will do so soon.
61-
return bs.asArrayPtr().attach(kj::mv(bs));
6259
}
6360

6461
kj::StringPtr getAlgorithmName() const override {
@@ -83,18 +80,17 @@ private:
8380

8481
} // namespace
8582

86-
kj::Maybe<jsg::BufferSource> hkdf(jsg::Lock& js,
87-
size_t length,
83+
kj::Maybe<kj::Array<kj::byte>> hkdf(size_t length,
8884
const EVP_MD* digest,
8985
kj::ArrayPtr<const kj::byte> key,
9086
kj::ArrayPtr<const kj::byte> salt,
9187
kj::ArrayPtr<const kj::byte> info) {
92-
auto buf = jsg::BackingStore::alloc<v8::ArrayBuffer>(js, length);
93-
if (HKDF(buf.asArrayPtr().begin(), length, digest, key.begin(), key.size(), salt.begin(),
94-
salt.size(), info.begin(), info.size()) != 1) {
88+
auto buf = kj::heapArray<kj::byte>(length);
89+
if (HKDF(buf.begin(), length, digest, key.begin(), key.size(), salt.begin(), salt.size(),
90+
info.begin(), info.size()) != 1) {
9591
return kj::none;
9692
}
97-
return jsg::BufferSource(js, kj::mv(buf));
93+
return kj::mv(buf);
9894
}
9995

10096
kj::Own<CryptoKey::Impl> CryptoKey::Impl::importHkdf(jsg::Lock& js,

src/workerd/api/crypto/kdf.h

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -9,32 +9,24 @@
99

1010
typedef struct env_md_st EVP_MD;
1111

12-
namespace workerd::jsg {
13-
class Lock;
14-
class BufferSource;
15-
} // namespace workerd::jsg
16-
1712
namespace workerd::api {
1813

1914
// Perform HKDF key derivation.
20-
kj::Maybe<jsg::BufferSource> hkdf(jsg::Lock& js,
21-
size_t length,
15+
kj::Maybe<kj::Array<kj::byte>> hkdf(size_t length,
2216
const EVP_MD* digest,
2317
kj::ArrayPtr<const kj::byte> key,
2418
kj::ArrayPtr<const kj::byte> salt,
2519
kj::ArrayPtr<const kj::byte> info);
2620

2721
// Perform PBKDF2 key derivation.
28-
kj::Maybe<jsg::BufferSource> pbkdf2(jsg::Lock& js,
29-
size_t length,
22+
kj::Maybe<kj::Array<kj::byte>> pbkdf2(size_t length,
3023
size_t iterations,
3124
const EVP_MD* digest,
3225
kj::ArrayPtr<const kj::byte> password,
3326
kj::ArrayPtr<const kj::byte> salt);
3427

3528
// Perform Scrypt key derivation.
36-
kj::Maybe<jsg::BufferSource> scrypt(jsg::Lock& js,
37-
size_t length,
29+
kj::Maybe<kj::Array<kj::byte>> scrypt(size_t length,
3830
uint32_t N,
3931
uint32_t r,
4032
uint32_t p,

src/workerd/api/crypto/pbkdf2.c++

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -63,11 +63,8 @@ private:
6363
// wisest.
6464
checkPbkdfLimits(js, iterations);
6565

66-
auto buf = JSG_REQUIRE_NONNULL(pbkdf2(js, length / 8, iterations, hashType, keyData, salt),
67-
Error, "PBKDF2 deriveBits failed.");
68-
// TODO(cleanup): This is a bit of a hack. deriveBits should return a BufferSource and
69-
// will do so soon.
70-
return buf.asArrayPtr().attach(kj::mv(buf));
66+
return JSG_REQUIRE_NONNULL(pbkdf2(length / 8, iterations, hashType, keyData, salt), Error,
67+
"PBKDF2 deriveBits failed.");
7168
}
7269

7370
// TODO(bug): Possibly by mistake, PBKDF2 was historically not on the allow list of
@@ -104,18 +101,17 @@ private:
104101

105102
} // namespace
106103

107-
kj::Maybe<jsg::BufferSource> pbkdf2(jsg::Lock& js,
108-
size_t length,
104+
kj::Maybe<kj::Array<kj::byte>> pbkdf2(size_t length,
109105
size_t iterations,
110106
const EVP_MD* digest,
111107
kj::ArrayPtr<const kj::byte> password,
112108
kj::ArrayPtr<const kj::byte> salt) {
113-
auto buf = jsg::BackingStore::alloc<v8::ArrayBuffer>(js, length);
109+
auto buf = kj::heapArray<kj::byte>(length);
114110
if (PKCS5_PBKDF2_HMAC(password.asChars().begin(), password.size(), salt.begin(), salt.size(),
115-
iterations, digest, length, buf.asArrayPtr().begin()) != 1) {
111+
iterations, digest, length, buf.begin()) != 1) {
116112
return kj::none;
117113
}
118-
return jsg::BufferSource(js, kj::mv(buf));
114+
return kj::mv(buf);
119115
}
120116

121117
kj::Own<CryptoKey::Impl> CryptoKey::Impl::importPbkdf2(jsg::Lock& js,

src/workerd/api/crypto/scrypt.c++

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,18 +10,17 @@
1010

1111
namespace workerd::api {
1212

13-
kj::Maybe<jsg::BufferSource> scrypt(jsg::Lock& js,
14-
size_t length,
13+
kj::Maybe<kj::Array<kj::byte>> scrypt(size_t length,
1514
uint32_t N,
1615
uint32_t r,
1716
uint32_t p,
1817
uint32_t maxmem,
1918
kj::ArrayPtr<const kj::byte> pass,
2019
kj::ArrayPtr<const kj::byte> salt) {
2120
ClearErrorOnReturn clearErrorOnReturn;
22-
auto buf = jsg::BackingStore::alloc<v8::ArrayBuffer>(js, length);
21+
auto buf = kj::heapArray<kj::byte>(length);
2322
if (!EVP_PBE_scrypt(pass.asChars().begin(), pass.size(), salt.begin(), salt.size(), N, r, p,
24-
maxmem, buf.asArrayPtr().begin(), length)) {
23+
maxmem, buf.begin(), length)) {
2524
// This does not currently handle the errors in exactly the same way as
2625
// the Node.js implementation but that's probably ok? We can update the
2726
// error thrown to match Node.js more closely later if necessary. There
@@ -31,7 +30,7 @@ kj::Maybe<jsg::BufferSource> scrypt(jsg::Lock& js,
3130
}
3231
return kj::none;
3332
}
34-
return jsg::BufferSource(js, kj::mv(buf));
33+
return kj::mv(buf);
3534
}
3635

3736
} // namespace workerd::api

src/workerd/api/node/crypto.c++

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,7 @@
1212

1313
namespace workerd::api::node {
1414

15-
jsg::BufferSource CryptoImpl::getHkdf(jsg::Lock& js,
16-
kj::String hash,
15+
kj::Array<kj::byte> CryptoImpl::getHkdf(kj::String hash,
1716
kj::Array<const kj::byte> key,
1817
kj::Array<const kj::byte> salt,
1918
kj::Array<const kj::byte> info,
@@ -44,10 +43,10 @@ jsg::BufferSource CryptoImpl::getHkdf(jsg::Lock& js,
4443
JSG_REQUIRE(
4544
length <= EVP_MD_size(digest) * kMaxDigestMultiplier, RangeError, "Invalid Hkdf key length");
4645

47-
return JSG_REQUIRE_NONNULL(hkdf(js, length, digest, key, salt, info), Error, "Hkdf failed");
46+
return JSG_REQUIRE_NONNULL(hkdf(length, digest, key, salt, info), Error, "Hkdf failed");
4847
}
4948

50-
jsg::BufferSource CryptoImpl::getPbkdf(jsg::Lock& js,
49+
kj::Array<kj::byte> CryptoImpl::getPbkdf(jsg::Lock& js,
5150
kj::Array<const kj::byte> password,
5251
kj::Array<const kj::byte> salt,
5352
uint32_t num_iterations,
@@ -71,10 +70,10 @@ jsg::BufferSource CryptoImpl::getPbkdf(jsg::Lock& js,
7170

7271
// Both pass and salt may be zero length here.
7372
return JSG_REQUIRE_NONNULL(
74-
pbkdf2(js, keylen, num_iterations, digest, password, salt), Error, "Pbkdf2 failed");
73+
pbkdf2(keylen, num_iterations, digest, password, salt), Error, "Pbkdf2 failed");
7574
}
7675

77-
jsg::BufferSource CryptoImpl::getScrypt(jsg::Lock& js,
76+
kj::Array<kj::byte> CryptoImpl::getScrypt(jsg::Lock& js,
7877
kj::Array<const kj::byte> password,
7978
kj::Array<const kj::byte> salt,
8079
uint32_t N,
@@ -87,7 +86,7 @@ jsg::BufferSource CryptoImpl::getScrypt(jsg::Lock& js,
8786
JSG_REQUIRE(salt.size() <= INT32_MAX, RangeError, "Scrypt failed: salt is too large");
8887

8988
return JSG_REQUIRE_NONNULL(
90-
scrypt(js, keylen, N, r, p, maxmem, password, salt), Error, "Scrypt failed");
89+
scrypt(keylen, N, r, p, maxmem, password, salt), Error, "Scrypt failed");
9190
}
9291

9392
bool CryptoImpl::verifySpkac(kj::Array<const kj::byte> input) {

src/workerd/api/node/crypto.h

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -115,23 +115,22 @@ class CryptoImpl final: public jsg::Object {
115115
};
116116

117117
// Hkdf
118-
jsg::BufferSource getHkdf(jsg::Lock& js,
119-
kj::String hash,
118+
kj::Array<kj::byte> getHkdf(kj::String hash,
120119
kj::Array<const kj::byte> key,
121120
kj::Array<const kj::byte> salt,
122121
kj::Array<const kj::byte> info,
123122
uint32_t length);
124123

125124
// Pbkdf2
126-
jsg::BufferSource getPbkdf(jsg::Lock& js,
125+
kj::Array<kj::byte> getPbkdf(jsg::Lock& js,
127126
kj::Array<const kj::byte> password,
128127
kj::Array<const kj::byte> salt,
129128
uint32_t num_iterations,
130129
uint32_t keylen,
131130
kj::String name);
132131

133132
// Scrypt
134-
jsg::BufferSource getScrypt(jsg::Lock& js,
133+
kj::Array<kj::byte> getScrypt(jsg::Lock& js,
135134
kj::Array<const kj::byte> password,
136135
kj::Array<const kj::byte> salt,
137136
uint32_t N,

0 commit comments

Comments
 (0)