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 { 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_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_EMPTY = `${u8aToString(PREFIX)}${u8aToString(POSTFIX)}`;
const TEST_WRAP_FULL = `${u8aToString(PREFIX)}${TEST_DATA}${u8aToString(POSTFIX)}`; const TEST_WRAP_FULL = `${u8aToString(PREFIX)}${TEST_DATA}${u8aToString(POSTFIX)}`;
const TEST_WARP_HALF_PRE = `${u8aToString(PREFIX)}${TEST_DATA}`; const TEST_WARP_HALF_PRE = `${u8aToString(PREFIX)}${TEST_DATA}`;
@ -111,4 +112,24 @@ describe('unwrapBytes', (): void => {
) )
).toEqual(''); ).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'; import { u8aConcat, u8aEq, u8aToU8a } from '@polkadot/util';
export const ETHEREUM = u8aToU8a('\x19Ethereum Signed Message:\n');
export const PREFIX = u8aToU8a('<Bytes>'); export const PREFIX = u8aToU8a('<Bytes>');
export const POSTFIX = u8aToU8a('</Bytes>'); export const POSTFIX = u8aToU8a('</Bytes>');
const WRAP_LEN = PREFIX.length + POSTFIX.length; const WRAP_LEN = PREFIX.length + POSTFIX.length;
function isWrapped (u8a: Uint8Array): boolean { function isWrapped (u8a: Uint8Array, withEthereum: boolean): boolean {
return u8a.length >= WRAP_LEN && return (
u8aEq(u8a.subarray(0, PREFIX.length), PREFIX) && (
u8aEq(u8a.slice(-POSTFIX.length), POSTFIX); 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 { export function unwrapBytes (bytes: string | Uint8Array): Uint8Array {
const u8a = u8aToU8a(bytes); 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.subarray(PREFIX.length, u8a.length - POSTFIX.length)
: u8a; : u8a;
} }
@ -25,7 +36,8 @@ export function unwrapBytes (bytes: string | Uint8Array): Uint8Array {
export function wrapBytes (bytes: string | Uint8Array): Uint8Array { export function wrapBytes (bytes: string | Uint8Array): Uint8Array {
const u8a = u8aToU8a(bytes); const u8a = u8aToU8a(bytes);
return isWrapped(u8a) // if Ethereum-wrapping, we don't add our wrapping bytes
return isWrapped(u8a, true)
? u8a ? u8a
: u8aConcat(PREFIX, u8a, POSTFIX); : u8aConcat(PREFIX, u8a, POSTFIX);
} }