Browse Source

refactor: use our own SimpleSigner since library version is deprecated

kb/add-usage-guide
Trent Larson 2 years ago
parent
commit
2a7c858662
  1. 7
      package-lock.json
  2. 1
      package.json
  3. 81
      src/libs/crypto/index.ts

7
package-lock.json

@ -26,6 +26,7 @@
"class-transformer": "^0.5.1", "class-transformer": "^0.5.1",
"core-js": "^3.26.1", "core-js": "^3.26.1",
"dexie": "^3.2.2", "dexie": "^3.2.2",
"did-jwt": "^6.9.0",
"ethereum-cryptography": "^1.1.2", "ethereum-cryptography": "^1.1.2",
"ethereumjs-util": "^7.1.5", "ethereumjs-util": "^7.1.5",
"ethr-did-resolver": "^8.0.0", "ethr-did-resolver": "^8.0.0",
@ -12186,9 +12187,9 @@
} }
}, },
"node_modules/did-jwt": { "node_modules/did-jwt": {
"version": "6.10.1", "version": "6.9.0",
"resolved": "https://registry.npmjs.org/did-jwt/-/did-jwt-6.10.1.tgz", "resolved": "https://registry.npmjs.org/did-jwt/-/did-jwt-6.9.0.tgz",
"integrity": "sha512-YJOvkuPKKX364ooAFNxZPcz/KBLRwLhRABQVQlVEqOjygsCkplNFB3UL97UqZ7Y3cAG6Jh5jKoAC4xFSm+h0qw==", "integrity": "sha512-kZ8pakovM2VkG0pia6x0SA9/1rl9dOUti4i2FL3xg7arJDWW7dACJxX+6gQK7iR/DvXrfFo8F784ejHVbw9ryA==",
"dependencies": { "dependencies": {
"@stablelib/ed25519": "^1.0.2", "@stablelib/ed25519": "^1.0.2",
"@stablelib/random": "^1.0.1", "@stablelib/random": "^1.0.1",

1
package.json

@ -26,6 +26,7 @@
"class-transformer": "^0.5.1", "class-transformer": "^0.5.1",
"core-js": "^3.26.1", "core-js": "^3.26.1",
"dexie": "^3.2.2", "dexie": "^3.2.2",
"did-jwt": "^6.9.0",
"ethereum-cryptography": "^1.1.2", "ethereum-cryptography": "^1.1.2",
"ethereumjs-util": "^7.1.5", "ethereumjs-util": "^7.1.5",
"ethr-did-resolver": "^8.0.0", "ethr-did-resolver": "^8.0.0",

81
src/libs/crypto/index.ts

@ -5,44 +5,8 @@ import { entropyToMnemonic } from "ethereum-cryptography/bip39";
import { wordlist } from "ethereum-cryptography/bip39/wordlists/english"; import { wordlist } from "ethereum-cryptography/bip39/wordlists/english";
import { HDNode } from "@ethersproject/hdnode"; import { HDNode } from "@ethersproject/hdnode";
import * as didJwt from "did-jwt"; import * as didJwt from "did-jwt";
import { Signer } from "did-jwt";
import * as u8a from "uint8arrays"; import * as u8a from "uint8arrays";
export function hexToBytes(s: string): Uint8Array {
const input = s.startsWith("0x") ? s.substring(2) : s;
return u8a.fromString(input.toLowerCase(), "base16");
}
export function fromJose(signature: string): {
r: string;
s: string;
recoveryParam?: number;
} {
const signatureBytes: Uint8Array = base64ToBytes(signature);
if (signatureBytes.length < 64 || signatureBytes.length > 65) {
throw new TypeError(
`Wrong size for signature. Expected 64 or 65 bytes, but got ${signatureBytes.length}`
);
}
const r = bytesToHex(signatureBytes.slice(0, 32));
const s = bytesToHex(signatureBytes.slice(32, 64));
const recoveryParam =
signatureBytes.length === 65 ? signatureBytes[64] : undefined;
return { r, s, recoveryParam };
}
export function bytesToHex(b: Uint8Array): string {
return u8a.toString(b, "base16");
}
export function base64ToBytes(s: string): Uint8Array {
const inputBase64Url = s
.replace(/\+/g, "-")
.replace(/\//g, "_")
.replace(/=/g, "");
return u8a.fromString(inputBase64Url, "base64url");
}
/** /**
* *
* *
@ -117,12 +81,8 @@ export const createIdentifier = (): string => {
export const accessToken = async (identifier: IIdentifier) => { export const accessToken = async (identifier: IIdentifier) => {
const did: string = identifier.did; const did: string = identifier.did;
const privateKeyHex: string = identifier.keys[0].privateKeyHex as string; const privateKeyHex: string = identifier.keys[0].privateKeyHex as string;
//const input = privateKeyHex.startsWith("0x")
// ? privateKeyHex.substring(2)
// : privateKeyHex;
//const privateKeyBytes = u8a.fromString(input.toLowerCase(), "base16");
const signer = didJwt.SimpleSigner(privateKeyHex); const signer = SimpleSigner(privateKeyHex);
const nowEpoch = Math.floor(Date.now() / 1000); const nowEpoch = Math.floor(Date.now() / 1000);
const endEpoch = nowEpoch + 60; // add one minute const endEpoch = nowEpoch + 60; // add one minute
@ -138,17 +98,14 @@ export const accessToken = async (identifier: IIdentifier) => {
}; };
export const sign = async (privateKeyHex: string) => { export const sign = async (privateKeyHex: string) => {
//const input = privateKeyHex.startsWith("0x") const signer = SimpleSigner(privateKeyHex);
// ? privateKeyHex.substring(2)
// : privateKeyHex;
// const privateKeyBytes = u8a.fromString(input.toLowerCase(), "base16");
const signer = didJwt.SimpleSigner(privateKeyHex);
return signer; return signer;
}; };
/** /**
* Copied out of did-jwt since it's deprecated in that library.
*
* The SimpleSigner returns a configured function for signing data. * The SimpleSigner returns a configured function for signing data.
* *
* @example * @example
@ -160,10 +117,34 @@ export const sign = async (privateKeyHex: string) => {
* @param {String} hexPrivateKey a hex encoded private key * @param {String} hexPrivateKey a hex encoded private key
* @return {Function} a configured signer function * @return {Function} a configured signer function
*/ */
export const SimpleSigner = async (hexPrivateKey: string): Promise<Signer> => { export function SimpleSigner(hexPrivateKey: string): didJwt.Signer {
const signer = didJwt.ES256KSigner(hexToBytes(hexPrivateKey), true); const signer = didJwt.ES256KSigner(didJwt.hexToBytes(hexPrivateKey), true);
return async (data) => { return async (data) => {
const signature = (await signer(data)) as string; const signature = (await signer(data)) as string;
return fromJose(signature); return fromJose(signature);
}; };
}; }
// from did-jwt/util; see SimpleSigner above
export function fromJose(signature: string): {
r: string;
s: string;
recoveryParam?: number;
} {
const signatureBytes: Uint8Array = didJwt.base64ToBytes(signature);
if (signatureBytes.length < 64 || signatureBytes.length > 65) {
throw new TypeError(
`Wrong size for signature. Expected 64 or 65 bytes, but got ${signatureBytes.length}`
);
}
const r = bytesToHex(signatureBytes.slice(0, 32));
const s = bytesToHex(signatureBytes.slice(32, 64));
const recoveryParam =
signatureBytes.length === 65 ? signatureBytes[64] : undefined;
return { r, s, recoveryParam };
}
// from did-jwt/util; see SimpleSigner above
export function bytesToHex(b: Uint8Array): string {
return u8a.toString(b, "base16");
}

Loading…
Cancel
Save