Skip to content

Commit

Permalink
Updated signature prefix and checksum #11
Browse files Browse the repository at this point in the history
  • Loading branch information
James Calfee committed May 4, 2018
1 parent 7c90517 commit 2ba9224
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 17 deletions.
3 changes: 2 additions & 1 deletion src/object.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,8 @@ describe('Object API', () => {
return PrivateKey.randomKey().then(privateKey => {
const signature = Signature.sign('data', privateKey)
const sigstr = signature.toString()
assert(sigstr.indexOf(config.address_prefix) === 0, 'signature string format')
assert.equal(signature.toString(), sigstr, 'cache')
assert.equal(Signature.fromString(sigstr).toString(), sigstr, 'fromString')
assert(sigstr.length > 90, 'signature string is too short')
assert(Signature.from(sigstr), 'signature from string')
})
Expand Down
35 changes: 19 additions & 16 deletions src/signature.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ const assert = require('assert');
const BigInteger = require('bigi');
const PublicKey = require('./key_public');
const PrivateKey = require('./key_private');
const config = require('./config');

module.exports = Signature

Expand Down Expand Up @@ -74,7 +73,7 @@ function Signature(r, s, i) {

/**
Recover the public key used to create this signature using full data.
@arg {String|Buffer} data - full data
@arg {String} [encoding = 'utf8'] - data encoding (if string)
Expand Down Expand Up @@ -125,17 +124,16 @@ function Signature(r, s, i) {
return toBuffer().toString("hex");
};

let signatureCache // cache
let signatureCache

function toString(prefix = config.address_prefix) {
function toString() {
if(signatureCache) {
return prefix + signatureCache
return signatureCache
}
const pub_buf = toBuffer();
const checksum = hash.ripemd160(pub_buf);
const checksum = hash.ripemd160(Buffer.concat([pub_buf, Buffer.from('K1')]));
const signatureString = Buffer.concat([pub_buf, checksum.slice(0, 4)]);
signatureCache = base58.encode(signatureString)
return prefix + signatureCache;
return signatureCache = 'SIG_K1_' + base58.encode(signatureString)
}

return {
Expand Down Expand Up @@ -248,7 +246,7 @@ Signature.fromHex = function(hex) {
@arg {string} address_prefix - like STM
@return Signature or `null` (if the signature string is invalid)
*/
Signature.fromString = function(signature, prefix = config.address_prefix) {
Signature.fromString = function(signature, prefix = 'SIG_K1_') {
try {
return Signature.fromStringOrThrow(signature, prefix)
} catch (e) {
Expand All @@ -262,34 +260,39 @@ Signature.fromString = function(signature, prefix = config.address_prefix) {
@throws {Error} if public key is invalid
@return Signature
*/
Signature.fromStringOrThrow = function(signature, prefix = config.address_prefix) {
Signature.fromStringOrThrow = function(signature) {
const prefix = 'SIG_K1_'
var actualPrefix = signature.slice(0, prefix.length);
assert.equal(
actualPrefix, prefix,
`Expecting key to begin with ${prefix}, instead got ${prefix}`
`Expecting key to begin with ${prefix}`
);
signature = signature.slice(prefix.length);
signature = new Buffer(base58.decode(signature), 'binary');
const checksum = signature.slice(-4).toString('hex');
signature = signature.slice(0, -4);
var new_checksum = hash.ripemd160(signature);
new_checksum = new_checksum.slice(0, 4).toString('hex');

const prefixTrim = prefix.replace(/^SIG_/, '').replace(/_$/, '')
const new_checksum =
hash.ripemd160(Buffer.concat([signature, Buffer.from(prefixTrim)]))
.slice(0, 4).toString('hex');

assert.equal(
checksum, new_checksum,
'Checksum did not match, ' + `${checksum} != ${new_checksum}`
);

return Signature.fromBuffer(signature);
}

/**
@arg {String|Signature} o - hex string
@return {Signature}
*/
Signature.from = o => {
Signature.from = (o) => {
const signature = o ?
(o.r && o.s && o.i) ? o :
typeof o === 'string' && o.length === 130 ? Signature.fromHex(o) :
typeof o === 'string' && o.length !== 130 ? Signature.fromString(o) :
typeof o === 'string' && o.length !== 130 ? Signature.fromStringOrThrow(o) :
Buffer.isBuffer(o) ? Signature.fromBuffer(o) :
null : o/*null or undefined*/

Expand Down

0 comments on commit 2ba9224

Please sign in to comment.