-
Notifications
You must be signed in to change notification settings - Fork 1
/
KeyTracker.ts
104 lines (93 loc) · 3.33 KB
/
KeyTracker.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
import { ethers } from 'ethers'
import { RandPair, PubPair, LamportKeyPair } from "./types"
import { hash_b, mk_key_pair } from "./functions"
// easy key management and generation
export default class KeyTracker {
privateKeys: RandPair[][] = []
publicKeys: PubPair[][] = []
name: string
/**
* constructor
* @author William Doyle
* @param _name the name used to differentiate this sequence of keys
*/
constructor (_name : string = 'default') {
this.name = _name
}
static pkhFromPublicKey(pub: PubPair[]): string {
return hash_b(ethers.utils.solidityPack(['bytes32[2][256]'], [pub]))
}
get pkh () {
return KeyTracker.pkhFromPublicKey(this.currentKeyPair().pub)
}
// /**
// * save
// * @description saves the key tracker to disk
// * @author William Doyle
// * @param trim wether or not to delete the oldest key pairs (keeps last 3)
// */
// save(trim : boolean = false) {
// const {_privateKeys, _publicKeys} = (() => {
// if (trim === false)
// return { _privateKeys: this.privateKeys, _publicKeys: this.publicKeys }
// else {
// const _privateKeys = this.privateKeys.slice(-3)
// const _publicKeys = this.publicKeys.slice(-3)
// return { _privateKeys, _publicKeys }
// }
// })()
// const s = JSON.stringify({
// privateKeys: _privateKeys,
// publicKeys: _publicKeys,
// name: this.name
// }, null, 2)
// const fs = require('fs');
// fs.writeFileSync(`keys/${this.name}.json`, s)
// }
// /**
// * load
// * @author William Doyle
// * @description loads a key tracker from disk, and returns it
// * @param name the name of the key tracker to load
// */
// static load(name: string): KeyTracker {
// const fs = require('fs');
// const s = fs.readFileSync(`keys/${name}.json`, 'utf8')
// const rval = new KeyTracker()
// return Object.assign(rval, JSON.parse(s))
// }
/**
* getNextKeyPair
* @author William Doyle
* @description generates a new key pair, saves it to internal state, and returns it
*/
getNextKeyPair(): LamportKeyPair {
const { pri, pub } = mk_key_pair()
this.privateKeys.push(pri)
this.publicKeys.push(pub)
return { pri, pub }
}
/**
* currentKeyPair
* @author William Doyle
* @description returns the current key pair, or creates a new one if there this is the first time this function has been called
*/
currentKeyPair(): LamportKeyPair {
if (this.privateKeys.length == 0)
return this.getNextKeyPair()
return {
pri: this.privateKeys[this.privateKeys.length - 1],
pub: this.publicKeys[this.publicKeys.length - 1]
}
}
/**
* previousKeyPair
* @author William Doyle
* @description returns the previous key pair, or throws an error if there is no previous key pair
*/
previousKeyPair(): LamportKeyPair {
if (this.privateKeys.length < 2)
throw new Error('no previous key pair')
return { pri: this.privateKeys[this.privateKeys.length - 2], pub: this.publicKeys[this.publicKeys.length - 2] }
}
}