Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save bshambaugh/60d90a32fd5b3bacd8113c631ba98491 to your computer and use it in GitHub Desktop.
Save bshambaugh/60d90a32fd5b3bacd8113c631ba98491 to your computer and use it in GitHub Desktop.
import * as name from '../key-did-provider-secp256r1/dist/index.js'
import u8a from 'uint8arrays'
import multicodec from 'multicodec'
import multibase from 'multibase'
//import toString from 'uint8arrays/to-string'
//import fromString from 'uint8arrays/from-string'
import base64url from 'base64url' // this converts a text string to base64url, it does not take a uint8 array??
import base64url_universal from 'base64url-universal'
import bs58 from 'bs58'
const publicKey = 'zrurwcJZss4ruepVNu1H3xmSirvNbzgBk9qrCktB6kaewXnJAhYWwtP3bxACqBpzjZdN7TyHNzzGGSSH5qvZsSDir9z'
//const publicKey = 'zrusAFgBbf84b8mBz8Cmy8UoFWKV52EaeRnK86vnLo4Z5QoRypE6hXVPN2urevZMAMtcTaCDFLWBaE1Q3jmdb1FHgve'
//const publicKey = 'zXwpDcwhs3ryJCCM3vYz9nJ7jB7Mbp8ioihWmRkNjy1XPjTqMEn5MvjaH3i1qsegxku36mBUc5fQ5NEW5JfHRr6i3TVf'
//const publicKey = 'zJss7xQxaumG3JviQ6XF4MefAeJrYmD2dGk6BaZSueRx2zFeWNg6aCc5biu1mY72rgj7aNbaGkvtYX1sxx2XFn6PFpar3QKpgNKkikEwp6MhP4GaffSadvVxiCzb7XrT6VpK5osS6YmgzksSd7ugNvf8TeUEN2EK2v7rjzVYhg9tEMBHGhq8ByCE2'
const buf = multibase.decode(publicKey)
console.log(buf);
const bb = u8a.toString(buf,'base16')
console.log(bb);
const bbb = bb.slice(4)
console.log('hex key: '+bbb)
console.log(bbb.length)
// this is the regular length public key
console.log(encodeDIDfromHexString(bbb));
// compresedKeyInHex(publicKeyHex: string)
const compressedKey = compresedKeyInHex(bbb)
console.log(encodeDIDfromHexString(compressedKey))
export function compresedKeyInHex(publicKeyHex) {
const xHex = publicKeyHex.slice(0,publicKeyHex.length/2);
const yHex = publicKeyHex.slice(publicKeyHex.length/2,publicKeyHex.length);
const xOctet = u8a.fromString(xHex,'base16')
const yOctet = u8a.fromString(yHex,'base16');
const compressedPoint = ECPointCompress( xOctet , yOctet );
const compressedPointHex = u8a.toString(compressedPoint,'base16');
return compressedPointHex;
}
// compress a public key with points x,y expressed as UintArrays
// source: https://stackoverflow.com/questions/17171542/algorithm-for-elliptic-curve-point-compression
export function ECPointCompress( x, y )
{
const out = new Uint8Array( x.length + 1 );
out[0] = 2 + ( y[ y.length-1 ] & 1 );
out.set( x, 1 );
return out;
}
export function encodeDIDfromHexString(publicKeyHex) {
const publicKey = u8a.fromString(publicKeyHex,'base16');
const didKey = encodeDID(publicKey)
return didKey;
}
export function encodeDID(publicKey) {
const publicKeywPrefix = multicodec.addPrefix('p256-pub',publicKey)
const buf = multibase.encode('base58btc',publicKeywPrefix)
const bufAsString = u8a.toString(buf)
return `did:key:${bufAsString}`
}
@bshambaugh
Copy link
Author

import * as name from '../key-did-provider-secp256r1/dist/index.js'
import u8a from 'uint8arrays'
import multicodec from 'multicodec'
import multibase from 'multibase'
//import toString from 'uint8arrays/to-string'
//import fromString from 'uint8arrays/from-string'
import base64url from 'base64url' // this converts a text string to base64url, it does not take a uint8 array??
import base64url_universal from 'base64url-universal'
import bs58 from 'bs58'

const publicKey = 'zWGhiwzmESrRykvUMCSNCadMyhzgAMVXST3KLSxY5unckUdYaGBZs59WMkMggeenMFAr938YxbEesbQ7myxmqDYo3m7xgFu8ppYDx2waz2Lw6eD9aADLn6Cw6Q6gTrH6sry211Z16nvVW25dsY6bZKhGKt4DeB1gGfvBk8bxwKuxTUtZrgwrMm1S';
//const publicKey = 'zWGhj2NTyCiehTPioanYSuSrfB7RJKwZj6bBUDNojfGEA21nr5NcBsHme7hcVSbptpWKarJpTcw814J3X8gVU9gZmeKM27JpGA5wNMzt8JZwjDyf8EzCJg5ve5GR2Xfm7d9Djp73V7s35KPeKe7VHMzmL8aPw4XBniNej5sXapPFoBs5R8m195HK'
//const publicKey = 'zruuPojWkzGPb8sVc42f2YxcTXKUTpAUbdrzVovaTBmGGNyK6cGFaA4Kp7SSLKecrxYz8Sc9d77Rss7rayYt1oFCaNJ'
//const publicKey = 'zXwpDcwhs3ryJCCM3vYz9nJ7jB7Mbp8ioihWmRkNjy1XPjTqMEn5MvjaH3i1qsegxku36mBUc5fQ5NEW5JfHRr6i3TVf'
//const publicKey = 'zJss7xQxaumG3JviQ6XF4MefAeJrYmD2dGk6BaZSueRx2zFeWNg6aCc5biu1mY72rgj7aNbaGkvtYX1sxx2XFn6PFpar3QKpgNKkikEwp6MhP4GaffSadvVxiCzb7XrT6VpK5osS6YmgzksSd7ugNvf8TeUEN2EK2v7rjzVYhg9tEMBHGhq8ByCE2'

const buf = multibase.decode(publicKey)

console.log(buf);

const bb = u8a.toString(buf,'base16')

console.log(bb);

const bbb = bb.slice(4)

console.log('hex key: '+bbb)

console.log(bbb.length)

// this is the regular length public key
console.log(encodeDIDfromHexString(bbb));

// compresedKeyInHex(publicKeyHex: string)

const compressedKey = compresedKeyInHex(bbb)

console.log(encodeDIDfromHexString(compressedKey))

export function compresedKeyInHex(publicKeyHex) {
const xHex = publicKeyHex.slice(0,publicKeyHex.length/2);
const yHex = publicKeyHex.slice(publicKeyHex.length/2,publicKeyHex.length);

const xOctet = u8a.fromString(xHex,'base16')
const yOctet = u8a.fromString(yHex,'base16');

const compressedPoint = ECPointCompress( xOctet , yOctet );
const compressedPointHex = u8a.toString(compressedPoint,'base16');
return compressedPointHex;
}

// compress a public key with points x,y expressed as UintArrays
// source: https://stackoverflow.com/questions/17171542/algorithm-for-elliptic-curve-point-compression
export function ECPointCompress( x, y )
{
const out = new Uint8Array( x.length + 1 );

out[0] = 2 + ( y[ y.length-1 ] & 1 );
out.set( x, 1 );

return out;

}

export function encodeDIDfromHexString(publicKeyHex) {
const publicKey = u8a.fromString(publicKeyHex,'base16');
const didKey = encodeDID(publicKey)
return didKey;
}

export function encodeDID(publicKey) {
const publicKeywPrefix = multicodec.addPrefix('p521-pub',publicKey)
const buf = multibase.encode('base58btc',publicKeywPrefix)
const bufAsString = u8a.toString(buf)
return did:key:${bufAsString}
}

@bshambaugh
Copy link
Author

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment