Don't wrap/unwrap Ethereum-style (#748)

* Don't wrap/unwrap Ethereum-style

* Update packages/extension-dapp/src/wrapBytes.spec.ts
This commit is contained in:
Jaco
2021-06-14 09:47:04 +02:00
committed by GitHub
parent 33331a0138
commit aa9b7c959c
2 changed files with 40 additions and 7 deletions
+22 -1
View File
@@ -3,9 +3,10 @@
import { u8aConcat, u8aEq, u8aToString } from '@polkadot/util';
import { POSTFIX, PREFIX, unwrapBytes, wrapBytes } from './wrapBytes';
import { ETHEREUM, POSTFIX, PREFIX, unwrapBytes, wrapBytes } from './wrapBytes';
const TEST_DATA = 'this is just some random message that we expect to be wrapped along the way';
const TEST_ETH = u8aConcat(ETHEREUM, TEST_DATA);
const TEST_WRAP_EMPTY = `${u8aToString(PREFIX)}${u8aToString(POSTFIX)}`;
const TEST_WRAP_FULL = `${u8aToString(PREFIX)}${TEST_DATA}${u8aToString(POSTFIX)}`;
const TEST_WARP_HALF_PRE = `${u8aToString(PREFIX)}${TEST_DATA}`;
@@ -111,4 +112,24 @@ describe('unwrapBytes', (): void => {
)
).toEqual('');
});
describe('Ethereum-style', (): void => {
it('does not wrap an Ethereum wrap', (): void => {
expect(
u8aEq(
wrapBytes(TEST_ETH),
TEST_ETH
)
).toBe(true);
});
it('does not unwrap an Ethereum wrap', (): void => {
expect(
u8aEq(
unwrapBytes(TEST_ETH),
TEST_ETH
)
).toBe(true);
});
});
});
+18 -6
View File
@@ -3,21 +3,32 @@
import { u8aConcat, u8aEq, u8aToU8a } from '@polkadot/util';
export const ETHEREUM = u8aToU8a('\x19Ethereum Signed Message:\n');
export const PREFIX = u8aToU8a('<Bytes>');
export const POSTFIX = u8aToU8a('</Bytes>');
const WRAP_LEN = PREFIX.length + POSTFIX.length;
function isWrapped (u8a: Uint8Array): boolean {
return u8a.length >= WRAP_LEN &&
u8aEq(u8a.subarray(0, PREFIX.length), PREFIX) &&
u8aEq(u8a.slice(-POSTFIX.length), POSTFIX);
function isWrapped (u8a: Uint8Array, withEthereum: boolean): boolean {
return (
(
u8a.length >= WRAP_LEN &&
u8aEq(u8a.subarray(0, PREFIX.length), PREFIX) &&
u8aEq(u8a.slice(-POSTFIX.length), POSTFIX)
) ||
(
withEthereum &&
u8a.length >= ETHEREUM.length &&
u8aEq(u8a.subarray(0, ETHEREUM.length), ETHEREUM)
)
);
}
export function unwrapBytes (bytes: string | Uint8Array): Uint8Array {
const u8a = u8aToU8a(bytes);
return isWrapped(u8a)
// we don't want to unwrap Ethereum-style wraps
return isWrapped(u8a, false)
? u8a.subarray(PREFIX.length, u8a.length - POSTFIX.length)
: u8a;
}
@@ -25,7 +36,8 @@ export function unwrapBytes (bytes: string | Uint8Array): Uint8Array {
export function wrapBytes (bytes: string | Uint8Array): Uint8Array {
const u8a = u8aToU8a(bytes);
return isWrapped(u8a)
// if Ethereum-wrapping, we don't add our wrapping bytes
return isWrapped(u8a, true)
? u8a
: u8aConcat(PREFIX, u8a, POSTFIX);
}