|
|
|
@ -7,7 +7,6 @@ import ( |
|
|
|
|
"encoding/base64" |
|
|
|
|
"encoding/hex" |
|
|
|
|
"errors" |
|
|
|
|
"fmt" |
|
|
|
|
"github.com/ugorji/go/codec" |
|
|
|
|
"hash/crc64" |
|
|
|
|
"strings" |
|
|
|
@ -51,21 +50,13 @@ func (tc TokenCoder) SeedHex() string { |
|
|
|
|
return hex.EncodeToString(tc.Seed()) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func NewTokenCoder(seed []byte, pubKeys ...[]byte) (tc TokenCoder, err error) { |
|
|
|
|
tc.pubKeys = make([]ed25519.PublicKey, len(pubKeys)+1, len(pubKeys)+1) |
|
|
|
|
if len(seed) == 0 { |
|
|
|
|
seed = make([]byte, ed25519.SeedSize, ed25519.SeedSize) |
|
|
|
|
_, err = rand.Read(seed) |
|
|
|
|
if err != nil { |
|
|
|
|
return |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func NewTokenCoderWithSeed(seed []byte, pubKeys ...[]byte) (tc TokenCoder, err error) { |
|
|
|
|
if len(seed) != ed25519.SeedSize { |
|
|
|
|
err = errors.New("Incorrect seed size") |
|
|
|
|
return |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
tc.pubKeys = make([]ed25519.PublicKey, len(pubKeys)+1, len(pubKeys)+1) |
|
|
|
|
tc.privKey = ed25519.NewKeyFromSeed(seed) |
|
|
|
|
tc.pubKeys[len(pubKeys)] = tc.privKey.Public().(ed25519.PublicKey) |
|
|
|
|
|
|
|
|
@ -80,7 +71,16 @@ func NewTokenCoder(seed []byte, pubKeys ...[]byte) (tc TokenCoder, err error) { |
|
|
|
|
return |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func NewTokenCoderHex(seed string, pubKeys ...string) (tc TokenCoder, err error) { |
|
|
|
|
func NewTokenCoder(pubKeys ...[]byte) (tc TokenCoder, err error) { |
|
|
|
|
seed := make([]byte, ed25519.SeedSize, ed25519.SeedSize) |
|
|
|
|
_, err = rand.Read(seed) |
|
|
|
|
if err != nil { |
|
|
|
|
return |
|
|
|
|
} |
|
|
|
|
return NewTokenCoderWithSeed(seed, pubKeys...) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func NewTokenCoderHexWithSeed(seed string, pubKeys ...string) (tc TokenCoder, err error) { |
|
|
|
|
var rawSeed []byte |
|
|
|
|
rawPubKeys := make([][]byte, len(pubKeys), len(pubKeys)) |
|
|
|
|
rawSeed, err = hex.DecodeString(seed) |
|
|
|
@ -93,7 +93,18 @@ func NewTokenCoderHex(seed string, pubKeys ...string) (tc TokenCoder, err error) |
|
|
|
|
return |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
return NewTokenCoder(rawSeed, rawPubKeys...) |
|
|
|
|
return NewTokenCoderWithSeed(rawSeed, rawPubKeys...) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func NewTokenCoderHex(pubKeys ...string) (tc TokenCoder, err error) { |
|
|
|
|
rawPubKeys := make([][]byte, len(pubKeys), len(pubKeys)) |
|
|
|
|
for pos, pubKey := range pubKeys { |
|
|
|
|
rawPubKeys[pos], err = hex.DecodeString(pubKey) |
|
|
|
|
if err != nil { |
|
|
|
|
return |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
return NewTokenCoder(rawPubKeys...) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func trim(r rune) bool { |
|
|
|
|