Compare commits
3 Commits
Author | SHA1 | Date | |
---|---|---|---|
e5e9cfd9f5
|
|||
43f4a42499
|
|||
8902f35028
|
4
go.mod
4
go.mod
@ -1,5 +1,5 @@
|
|||||||
module git.purser.it/roypur/stoken
|
module git.purser.it/roypur/stoken
|
||||||
|
|
||||||
go 1.17
|
go 1.18
|
||||||
|
|
||||||
require github.com/ugorji/go/codec v1.2.6
|
require github.com/ugorji/go/codec v1.2.7 // indirect
|
||||||
|
8
go.sum
8
go.sum
@ -1,4 +1,4 @@
|
|||||||
github.com/ugorji/go v1.2.6 h1:tGiWC9HENWE2tqYycIqFTNorMmFRVhNwCpDOpWqnk8E=
|
github.com/ugorji/go v1.2.7 h1:qYhyWUUd6WbiM+C6JZAUkIJt/1WrjzNHY9+KCIjVqTo=
|
||||||
github.com/ugorji/go v1.2.6/go.mod h1:anCg0y61KIhDlPZmnH+so+RQbysYVyDko0IMgJv0Nn0=
|
github.com/ugorji/go v1.2.7/go.mod h1:nF9osbDWLy6bDVv/Rtoh6QgnvNDpmCalQV5urGCCS6M=
|
||||||
github.com/ugorji/go/codec v1.2.6 h1:7kbGefxLoDBuYXOms4yD7223OpNMMPNPZxXk5TvFcyQ=
|
github.com/ugorji/go/codec v1.2.7 h1:YPXUKf7fYbp/y8xloBqZOw2qaVggbfwMlI8WM3wZUJ0=
|
||||||
github.com/ugorji/go/codec v1.2.6/go.mod h1:V6TCNZ4PHqoHGFZuSG1W8nrCzzdgA2DozYxWFFpvxTw=
|
github.com/ugorji/go/codec v1.2.7/go.mod h1:WGN1fab3R1fzQlVQTkfxVtIBhWDRqOviHU95kRgeqEY=
|
||||||
|
58
sign.go
58
sign.go
@ -16,7 +16,7 @@ const alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789
|
|||||||
|
|
||||||
var b64 = base64.NewEncoding(alphabet).WithPadding(base64.NoPadding)
|
var b64 = base64.NewEncoding(alphabet).WithPadding(base64.NoPadding)
|
||||||
|
|
||||||
type linkData struct {
|
type tokenData struct {
|
||||||
Signature []byte `codec:"s"`
|
Signature []byte `codec:"s"`
|
||||||
Payload []byte `codec:"p"`
|
Payload []byte `codec:"p"`
|
||||||
}
|
}
|
||||||
@ -50,6 +50,44 @@ func (tc TokenCoder) SeedHex() string {
|
|||||||
return hex.EncodeToString(tc.Seed())
|
return hex.EncodeToString(tc.Seed())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func Format(token string) (txt string, err error) {
|
||||||
|
var payload interface{}
|
||||||
|
var data []byte
|
||||||
|
data, err = b64.DecodeString(strings.TrimFunc(token, trim))
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
buf := bytes.NewBuffer(nil)
|
||||||
|
var cHandle codec.CborHandle
|
||||||
|
var jHandle codec.JsonHandle
|
||||||
|
jHandle.HTMLCharsAsIs = true
|
||||||
|
jHandle.MapKeyAsString = true
|
||||||
|
jHandle.Indent = 4
|
||||||
|
|
||||||
|
buf.Write(data)
|
||||||
|
dec := codec.NewDecoder(buf, &cHandle)
|
||||||
|
|
||||||
|
var td tokenData
|
||||||
|
err = dec.Decode(&td)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
buf.Reset()
|
||||||
|
buf.Write(td.Payload)
|
||||||
|
|
||||||
|
err = dec.Decode(&payload)
|
||||||
|
|
||||||
|
buf.Reset()
|
||||||
|
buf.Write([]byte("SIGNATURE=" + hex.EncodeToString(td.Signature) + "\n"))
|
||||||
|
|
||||||
|
enc := codec.NewEncoder(buf, &jHandle)
|
||||||
|
err = enc.Encode(payload)
|
||||||
|
txt = buf.String()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
func NewTokenCoderWithSeed(seed []byte, pubKeys ...[]byte) (tc TokenCoder, err error) {
|
func NewTokenCoderWithSeed(seed []byte, pubKeys ...[]byte) (tc TokenCoder, err error) {
|
||||||
if len(seed) != ed25519.SeedSize {
|
if len(seed) != ed25519.SeedSize {
|
||||||
err = errors.New("Incorrect seed size")
|
err = errors.New("Incorrect seed size")
|
||||||
@ -123,11 +161,11 @@ func (tc TokenCoder) Encode(payload interface{}) (token string, err error) {
|
|||||||
enc := codec.NewEncoder(buf, &handle)
|
enc := codec.NewEncoder(buf, &handle)
|
||||||
enc.Encode(payload)
|
enc.Encode(payload)
|
||||||
|
|
||||||
var ld linkData
|
var td tokenData
|
||||||
ld.Signature = ed25519.Sign(tc.privKey, buf.Bytes())
|
td.Signature = ed25519.Sign(tc.privKey, buf.Bytes())
|
||||||
ld.Payload = buf.Bytes()
|
td.Payload = buf.Bytes()
|
||||||
buf.Reset()
|
buf.Reset()
|
||||||
enc.Encode(ld)
|
enc.Encode(td)
|
||||||
token = b64.EncodeToString(buf.Bytes())
|
token = b64.EncodeToString(buf.Bytes())
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -150,15 +188,15 @@ func (tc TokenCoder) Decode(token string, payload interface{}) (sum string, err
|
|||||||
buf.Write(data)
|
buf.Write(data)
|
||||||
dec := codec.NewDecoder(buf, &handle)
|
dec := codec.NewDecoder(buf, &handle)
|
||||||
|
|
||||||
var ld linkData
|
var td tokenData
|
||||||
err = dec.Decode(&ld)
|
err = dec.Decode(&td)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
ok := false
|
ok := false
|
||||||
for _, key := range tc.pubKeys {
|
for _, key := range tc.pubKeys {
|
||||||
if ed25519.Verify(key, ld.Payload, ld.Signature) {
|
if ed25519.Verify(key, td.Payload, td.Signature) {
|
||||||
ok = true
|
ok = true
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
@ -170,10 +208,10 @@ func (tc TokenCoder) Decode(token string, payload interface{}) (sum string, err
|
|||||||
}
|
}
|
||||||
|
|
||||||
buf.Reset()
|
buf.Reset()
|
||||||
buf.Write(ld.Payload)
|
buf.Write(td.Payload)
|
||||||
|
|
||||||
hash := crc64.New(crc64.MakeTable(crc64.ISO))
|
hash := crc64.New(crc64.MakeTable(crc64.ISO))
|
||||||
hash.Write(ld.Payload)
|
hash.Write(td.Payload)
|
||||||
|
|
||||||
sum = hex.EncodeToString(hash.Sum(nil))
|
sum = hex.EncodeToString(hash.Sum(nil))
|
||||||
err = dec.Decode(&payload)
|
err = dec.Decode(&payload)
|
||||||
|
Reference in New Issue
Block a user