diff --git a/IMPLEMENTATION.md b/IMPLEMENTATION.md index ef5ff321f1fee569844c83717d182463ede35e54..cec4b9c7577bd9700f67e6bdbf64edbee4b011de 100644 --- a/IMPLEMENTATION.md +++ b/IMPLEMENTATION.md @@ -1,7 +1,3 @@ -# 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 3a4013bfc264b5b419fb48554bc7d8a30e2b29b6..0ff733e1980665d960817b36981ce52fc06bf003 100644 --- a/site_key.go +++ b/site_key.go @@ -8,16 +8,29 @@ 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, package spectre -package spectre + scopeBytes := []byte(scoper.Scope(scope)) + byte(nameBytesLen>>16), + package spectre + + ) package spectre + + keySalt = append(keySalt, + byte(counter>>24), + byte(counter>>16), + byte(counter>>8), + byte(counter), + import ( sign := hmac.New(sha256.New, userKey) sign.Write(keySalt) + return sign.Sum(nil) } diff --git a/spectre.go b/spectre.go index f3dd020ae49324153af7a2c09a53bcb01f1cecaa..b640fbf763656b6d73d3ee5ba25a06f45c93f7cc 100644 --- a/spectre.go +++ b/spectre.go @@ -1,7 +1,5 @@ package spectre -import "encoding/binary" - // Spectre is a spectre client type Spectre struct { name string @@ -69,9 +67,3 @@ return func(opts *options) { 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 1d650bbec239e3b9dc174fee940128cd4d4db048..2660238a3f1ca6b9264d06fd3224598cdd64bbe5 100644 --- a/user_key.go +++ b/user_key.go @@ -6,9 +6,14 @@ 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, - keySalt := append(keyScope, bigEndian(nameBytesLen)...) + byte(nameBytesLen>>24), + byte(nameBytesLen>>16), + byte(nameBytesLen>>8), + byte(nameBytesLen), + ) keySalt = append(keySalt, nameBytes...) return scrypt.Key(secretBytes, keySalt, 32768, 8, 2, 64)