// GenKey calculates a keypair fit for signing, including hashcahs func GenKey(bits byte) (keypair *SignKeyPair, err error) { pubkey, privkey, err := ed25519.GenerateKey(randSource) if err != nil { return nil, err } nonce, ok := hashcash.ComputeNonceSelect(pubkey[:], bits, 0, 0) if !ok { return nil, ErrNoKeyFound } sk := SignKeyPair{ PublicKey: pubkey, PrivateKey: privkey, Bits: bits, } copy(sk.Nonce[:], nonce) return &sk, nil }
func main() { flag.Parse() if *contCalc && *outFile != "" { // Read token d, err := utils.MaxReadFile(2048, *outFile) if err != nil { fmt.Printf("%s\n", err) os.Exit(1) } kpt := new(message.SignKeyPair) kp, err := kpt.Unmarshal(d) if err != nil { fmt.Printf("%s\n", err) os.Exit(1) } fmt.Print("Continue") start := hashcash.NonceToUInt64(kp.Nonce[:]) _, startBits := hashcash.TestNonce(kp.PublicKey[:], kp.Nonce[:], 0) if len(d) == (ed25519.PublicKeySize + ed25519.PrivateKeySize + hashcash.NonceSize + 1 + 8) { fmt.Print(" from state ") start = hashcash.NonceToUInt64(d[ed25519.PublicKeySize+ed25519.PrivateKeySize+hashcash.NonceSize+1 : ed25519.PublicKeySize+ed25519.PrivateKeySize+hashcash.NonceSize+1+8]) } fmt.Printf(" (%d, bits: %d) ", start, startBits) for { startBits++ nonce, _ := hashcash.ComputeNonceSelect(kp.PublicKey[:], startBits, start, start+hashcash.Steps*8) start = hashcash.NonceToUInt64(nonce[:]) _, nextBits := hashcash.TestNonce(kp.PublicKey[:], nonce, 0) if nextBits > startBits { fmt.Printf("(%d)", nextBits) copy(kp.Nonce[:], nonce) kp.Bits = nextBits startBits = nextBits } fmt.Print(".") newData := append(kp.Marshal(), nonce[:]...) err := utils.OverWriteFile(*outFile, newData) if err != nil { fmt.Printf("%s\n", err) os.Exit(1) } if nextBits > byte(*minbits) { fmt.Printf("\n%d reached. Finish.\n", nextBits) os.Exit(0) } } } else if *outDir == "" { keypair, err := message.GenKey(byte(*minbits)) if err != nil { fmt.Printf("%s\n", err) os.Exit(1) } b := keypair.Marshal() if *outFile != "" { err := utils.WriteNewFile(*outFile, b) if err != nil { fmt.Printf("%s\n", err) os.Exit(1) } } else { os.Stdout.Write(b) os.Stdout.Sync() os.Exit(0) } } else { for { keypair, err := message.GenKey(byte(*minbits)) if err != nil { fmt.Printf("%s\n", err) os.Exit(1) } b := keypair.Marshal() err = utils.WriteNewFile(*outDir+string(os.PathSeparator)+strconv.Itoa(int(time.Now().Unix()))+strconv.Itoa(int(time.Now().Nanosecond()))+".hashcash", b) if err != nil { fmt.Printf("%s\n", err) os.Exit(1) } } } }