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 10:47:04 +03:00 committed by GitHub
parent 33331a0138
commit aa9b7c959c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 40 additions and 7 deletions

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);
});
});
});

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);
}