- Remove no longer needed exclude rules - Add new exclude rules for printf govet errors - Remove deprecated linters `execinquery` and `exportloopref` - Rename linter `goerr113` to `err113` - Rename linter `gomnd` to `mnd`
67 lines
1.4 KiB
Go
67 lines
1.4 KiB
Go
package cli
|
|
|
|
import (
|
|
"crypto/rand"
|
|
"flag"
|
|
"fmt"
|
|
)
|
|
|
|
func (c *CLI) GenKey(args []string) (err error) {
|
|
flagSet := flag.NewFlagSet("genkey", flag.ExitOnError)
|
|
err = flagSet.Parse(args)
|
|
if err != nil {
|
|
return fmt.Errorf("parsing flags: %w", err)
|
|
}
|
|
|
|
const keyLength = 128 / 8
|
|
keyBytes := make([]byte, keyLength)
|
|
|
|
_, _ = rand.Read(keyBytes)
|
|
|
|
key := base58Encode(keyBytes)
|
|
fmt.Println(key)
|
|
|
|
return nil
|
|
}
|
|
|
|
func base58Encode(data []byte) string {
|
|
const alphabet = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"
|
|
const radix = 58
|
|
|
|
zcount := 0
|
|
for zcount < len(data) && data[zcount] == 0 {
|
|
zcount++
|
|
}
|
|
|
|
// integer simplification of ceil(log(256)/log(58))
|
|
ceilLog256Div58 := (len(data)-zcount)*555/406 + 1 //nolint:mnd
|
|
size := zcount + ceilLog256Div58
|
|
|
|
output := make([]byte, size)
|
|
|
|
high := size - 1
|
|
for _, b := range data {
|
|
i := size - 1
|
|
for carry := uint32(b); i > high || carry != 0; i-- {
|
|
carry += 256 * uint32(output[i]) //nolint:mnd
|
|
output[i] = byte(carry % radix)
|
|
carry /= radix
|
|
}
|
|
high = i
|
|
}
|
|
|
|
// Determine the additional "zero-gap" in the output buffer
|
|
additionalZeroGapEnd := zcount
|
|
for additionalZeroGapEnd < size && output[additionalZeroGapEnd] == 0 {
|
|
additionalZeroGapEnd++
|
|
}
|
|
|
|
val := output[additionalZeroGapEnd-zcount:]
|
|
size = len(val)
|
|
for i := range val {
|
|
output[i] = alphabet[val[i]]
|
|
}
|
|
|
|
return string(output[:size])
|
|
}
|