diff --git a/auth/auth.go b/auth/auth.go new file mode 100644 index 0000000..b864192 --- /dev/null +++ b/auth/auth.go @@ -0,0 +1,57 @@ +package auth + +import ( + "crypto/rand" + "crypto/sha1" + "encoding/hex" + "fmt" + "math/big" + "strconv" + "strings" + "time" +) + +var ( + saltChars = "0123456789ABCDEFGHIJKLMNOPQRTSUVWXYZabcdefghijklmnopqrstuvwxyz" + baseUrl = "https://api.nearlyfreespeech.net" + authHeaderName = "X-NFSN-Authentication" + maxSalt big.Int +) + +func init() { + maxSalt.SetInt64(int64(len(saltChars))) +} + +func Salt() (string, error) { + salt := make([]string, 16) + for i := 0; i < 16; i++ { + rand_index, err := rand.Int(rand.Reader, &maxSalt) + if err != nil { + return "", err + } + + salt[i] = string(saltChars[rand_index.Int64()]) + } + + return strings.Join(salt, ""), nil +} + +func Timestamp() string { + return strconv.FormatInt(time.Now().Unix(), 10) +} + +func ComputeHash(data string) string { + result := sha1.Sum([]byte(data)) + return hex.EncodeToString(result[:]) +} + +func GetAuthHeader(login string, apiKey string, url string, body string) (string, error) { + timestamp := Timestamp() + salt, err := Salt() + if err != nil { + return "", err + } + bodyHash := ComputeHash(body) + hash := ComputeHash(fmt.Sprintf("%s;%s;%s;%s;%s;%s", login, timestamp, salt, apiKey, url, bodyHash)) + return hash, nil +}