Hi, community!
I’m learning Blockcerts V3. I created the following blockchain certificate by cert-issuer==3.0.1 and chose Ethereum Ropsten.
https://gist.githubusercontent.com/koshilife/88601d21fedc81d9f6daec92b6017648/raw/d3fce2569fdfeba9cbb950457bca2ad450c9607d/blockcerts_v3_with_did-ethr.json
But, when I tried to verify, I got the following error.
Unnable to parse JSON out of issuer identification data
According to the cert-issuer README, I guess the error reason that the DID document resolved from did:ethr
is NOT an expected format.
So, to fix the error, I’m going to create a valid DID document and to host on did:web
or to use did:key
. But, I have no idea to convert my Ethreum wallet address into DID’s publicKeyJwk format.
Is there any good tool or method for this?
1 Like
I solved this.
I found a way to convert my private key instead of my wallet address into a public key(JWK).
const keyto = require('@trust/keyto')
let privateKey = '<BLOCKCHAIN-PRIVATE-KEY>'
let keyJwk = keyto.from(privateKey, 'blk').toJwk('public')
refs: JSDoc: Home
(Add)
I could confirm the converted address is the same as my wallet address by the following codes.
const keyto = require('@trust/keyto');
const ec = require('elliptic').ec;
const secp256k1 = require('secp256k1');
const keccak256 = require('js-sha3').keccak256;
const YOUR_PRIVATE_KEY = "TODO";
const keyJwk = keyto.from(YOUR_PRIVATE_KEY, 'blk').toJwk('public');
const uncompressedPublicKey = keyto.from(keyJwk, 'jwk').toString('blk', 'public');
const compressed = secp256k1.publicKeyConvert(Buffer.from(uncompressedPublicKey, 'hex'),true);
const publicKeyHex = Buffer.from(compressed).toString('hex');
// referred to publicKeyUInt8ArrayFromJwk
let publicKeyBuffer = Buffer.from(publicKeyHex, 'hex');
let padding = 32 - publicKeyBuffer.length;
while (padding > 0) {
publicKeyBuffer = Buffer.concat([Buffer.from('00', 'hex'), publicKeyBuffer]);
padding--;
}
// referred to computeEthereumAddressFromPublicKey
const publicKeyString = publicKeyBuffer.toString('hex');
const ellipticCurve = new ec('secp256k1');
const decodedPublicKey = ellipticCurve.keyFromPublic(publicKeyString, 'hex');
const publicKeyUncompressed = decodedPublicKey.getPublic().encode('hex').slice(2);
const address = keccak256(Buffer.from(publicKeyUncompressed, 'hex')).slice(64 - 40);
console.log(`0x${address.toString()}`);
I referred to cert-verifier-js/src/inspectors/did/deriveIssuingAddressFromPublicKey.ts
1 Like