Skip to content

Commit fc8d749

Browse files
committed
fix: handle Buffer view slices correctly in ECDH/DH bridge
1 parent 9f8d7a2 commit fc8d749

2 files changed

Lines changed: 23 additions & 9 deletions

File tree

packages/react-native-quick-crypto/src/diffie-hellman.ts

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,13 @@ import type { DiffieHellman as DiffieHellmanInterface } from './specs/diffie-hel
33
import { Buffer } from '@craftzdog/react-native-buffer';
44
import { DH_GROUPS } from './dh-groups';
55

6+
function toArrayBufferExact(buf: Buffer): ArrayBuffer {
7+
return buf.buffer.slice(
8+
buf.byteOffset,
9+
buf.byteOffset + buf.byteLength,
10+
) as ArrayBuffer;
11+
}
12+
613
export class DiffieHellman {
714
private _hybrid: DiffieHellmanInterface;
815

@@ -37,8 +44,8 @@ export class DiffieHellman {
3744
}
3845

3946
this._hybrid.init(
40-
primeBuf.buffer as ArrayBuffer,
41-
genBuf.buffer as ArrayBuffer,
47+
toArrayBufferExact(primeBuf),
48+
toArrayBufferExact(genBuf),
4249
);
4350
}
4451
}
@@ -62,7 +69,7 @@ export class DiffieHellman {
6269
}
6370

6471
const secret = Buffer.from(
65-
this._hybrid.computeSecret(keyBuf.buffer as ArrayBuffer),
72+
this._hybrid.computeSecret(toArrayBufferExact(keyBuf)),
6673
);
6774
if (outputEncoding) return secret.toString(outputEncoding);
6875
return secret;
@@ -99,7 +106,7 @@ export class DiffieHellman {
99106
} else {
100107
keyBuf = Buffer.from(publicKey, encoding);
101108
}
102-
this._hybrid.setPublicKey(keyBuf.buffer as ArrayBuffer);
109+
this._hybrid.setPublicKey(toArrayBufferExact(keyBuf));
103110
}
104111

105112
setPrivateKey(privateKey: Buffer | string, encoding?: BufferEncoding): void {
@@ -109,7 +116,7 @@ export class DiffieHellman {
109116
} else {
110117
keyBuf = Buffer.from(privateKey, encoding);
111118
}
112-
this._hybrid.setPrivateKey(keyBuf.buffer as ArrayBuffer);
119+
this._hybrid.setPrivateKey(toArrayBufferExact(keyBuf));
113120
}
114121

115122
get verifyError(): number {

packages/react-native-quick-crypto/src/ecdh.ts

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,13 @@ const POINT_CONVERSION_COMPRESSED = 2;
66
const POINT_CONVERSION_UNCOMPRESSED = 4;
77
const POINT_CONVERSION_HYBRID = 6;
88

9+
function toArrayBufferExact(buf: Buffer): ArrayBuffer {
10+
return buf.buffer.slice(
11+
buf.byteOffset,
12+
buf.byteOffset + buf.byteLength,
13+
) as ArrayBuffer;
14+
}
15+
916
export class ECDH {
1017
private static _convertKeyHybrid: ECDHInterface | undefined;
1118
private static get convertKeyHybrid(): ECDHInterface {
@@ -43,7 +50,7 @@ export class ECDH {
4350
}
4451

4552
// ECDH.computeSecret in Node.js returns Buffer
46-
const secret = this._hybrid.computeSecret(keyBuf.buffer as ArrayBuffer);
53+
const secret = this._hybrid.computeSecret(toArrayBufferExact(keyBuf));
4754
return Buffer.from(secret);
4855
}
4956

@@ -58,7 +65,7 @@ export class ECDH {
5865
} else {
5966
keyBuf = Buffer.from(privateKey, encoding);
6067
}
61-
this._hybrid.setPrivateKey(keyBuf.buffer as ArrayBuffer);
68+
this._hybrid.setPrivateKey(toArrayBufferExact(keyBuf));
6269
}
6370

6471
getPublicKey(encoding?: BufferEncoding): Buffer | string {
@@ -80,7 +87,7 @@ export class ECDH {
8087
} else {
8188
keyBuf = Buffer.from(publicKey, encoding);
8289
}
83-
this._hybrid.setPublicKey(keyBuf.buffer as ArrayBuffer);
90+
this._hybrid.setPublicKey(toArrayBufferExact(keyBuf));
8491
}
8592

8693
static convertKey(
@@ -117,7 +124,7 @@ export class ECDH {
117124

118125
const result = Buffer.from(
119126
ECDH.convertKeyHybrid.convertKey(
120-
keyBuf.buffer as ArrayBuffer,
127+
toArrayBufferExact(keyBuf),
121128
curve,
122129
formatNum,
123130
),

0 commit comments

Comments
 (0)