diff --git a/IMPLEMENTATION.md b/IMPLEMENTATION.md index cec4b9c..ef5ff32 100644 --- a/IMPLEMENTATION.md +++ b/IMPLEMENTATION.md @@ -1,3 +1,7 @@ +# Implementation + +Adapted from [source](https://spectre.app/blog/2018-01-06-algorithm/). + ## User Key Derivation ([code](user_key.go)) diff --git a/site_key.go b/site_key.go index 0ff733e..3a4013b 100644 --- a/site_key.go +++ b/site_key.go @@ -8,24 +8,13 @@ import ( func siteKey(userKey []byte, scoper Scoper, siteName string, counter int, scope Scope) []byte { nameBytes := []byte(siteName) scopeBytes := []byte(scoper.Scope(scope)) - nameBytesLen := len(nameBytes) - keySalt := append(scopeBytes, - byte(nameBytesLen>>24), - byte(nameBytesLen>>16), - byte(nameBytesLen>>8), - byte(nameBytesLen), - ) + + keySalt := append(scopeBytes, bigEndian(nameBytesLen)...) keySalt = append(keySalt, nameBytes...) - keySalt = append(keySalt, - byte(counter>>24), - byte(counter>>16), - byte(counter>>8), - byte(counter), - ) + keySalt = append(keySalt, bigEndian(counter)...) sign := hmac.New(sha256.New, userKey) sign.Write(keySalt) - return sign.Sum(nil) } diff --git a/spectre.go b/spectre.go index b640fbf..f3dd020 100644 --- a/spectre.go +++ b/spectre.go @@ -1,5 +1,7 @@ package spectre +import "encoding/binary" + // Spectre is a spectre client type Spectre struct { name string @@ -67,3 +69,9 @@ func WithScope(s Scope) SiteOption { opts.scope = s } } + +func bigEndian(num int) []byte { + buf := make([]byte, 4) + binary.BigEndian.PutUint32(buf, uint32(num)) + return buf +} diff --git a/user_key.go b/user_key.go index 2660238..1d650bb 100644 --- a/user_key.go +++ b/user_key.go @@ -6,14 +6,9 @@ func userKey(name, secret string, scoper Scoper) ([]byte, error) { nameBytes := []byte(name) secretBytes := []byte(secret) keyScope := []byte(scoper.Scope(Authentication)) - nameBytesLen := len(nameBytes) - keySalt := append(keyScope, - byte(nameBytesLen>>24), - byte(nameBytesLen>>16), - byte(nameBytesLen>>8), - byte(nameBytesLen), - ) + + keySalt := append(keyScope, bigEndian(nameBytesLen)...) keySalt = append(keySalt, nameBytes...) return scrypt.Key(secretBytes, keySalt, 32768, 8, 2, 64)