mirror of
https://github.com/fleetdm/fleet
synced 2026-05-21 07:58:31 +00:00
128 lines
3.6 KiB
Go
128 lines
3.6 KiB
Go
|
|
package httpsig
|
||
|
|
|
||
|
|
import (
|
||
|
|
"encoding/base64"
|
||
|
|
"errors"
|
||
|
|
"io"
|
||
|
|
"testing"
|
||
|
|
|
||
|
|
"github.com/remitly-oss/httpsig-go/sigtest"
|
||
|
|
)
|
||
|
|
|
||
|
|
func TestDigestCreate(t *testing.T) {
|
||
|
|
testcases := []struct {
|
||
|
|
Name string
|
||
|
|
Algo Digest
|
||
|
|
Body io.ReadCloser
|
||
|
|
ExpectedDigest string // base64 encoded digest
|
||
|
|
ExpectedHeader string
|
||
|
|
ExpectedErrCode ErrCode
|
||
|
|
}{
|
||
|
|
{
|
||
|
|
Name: "sha-256",
|
||
|
|
Algo: DigestSHA256,
|
||
|
|
Body: sigtest.MakeBody("hello world"),
|
||
|
|
ExpectedDigest: "uU0nuZNNPgilLlLX2n2r+sSE7+N6U4DukIj3rOLvzek=",
|
||
|
|
ExpectedHeader: "sha-256=:uU0nuZNNPgilLlLX2n2r+sSE7+N6U4DukIj3rOLvzek=:",
|
||
|
|
},
|
||
|
|
{
|
||
|
|
Name: "sha-512",
|
||
|
|
Algo: DigestSHA512,
|
||
|
|
Body: sigtest.MakeBody("hello world"),
|
||
|
|
ExpectedDigest: "MJ7MSJwS1utMxA9QyQLytNDtd+5RGnx6m808qG1M2G+YndNbxf9JlnDaNCVbRbDP2DDoH2Bdz33FVC6TrpzXbw==",
|
||
|
|
ExpectedHeader: "sha-512=:MJ7MSJwS1utMxA9QyQLytNDtd+5RGnx6m808qG1M2G+YndNbxf9JlnDaNCVbRbDP2DDoH2Bdz33FVC6TrpzXbw==:",
|
||
|
|
},
|
||
|
|
{
|
||
|
|
Name: "UnsupportedAlgorithm",
|
||
|
|
Algo: Digest("nope"),
|
||
|
|
Body: sigtest.MakeBody("hello world"),
|
||
|
|
ExpectedErrCode: ErrNoSigUnsupportedDigest,
|
||
|
|
},
|
||
|
|
}
|
||
|
|
|
||
|
|
for _, tc := range testcases {
|
||
|
|
t.Run(tc.Name, func(t *testing.T) {
|
||
|
|
actual, err := digestBody(tc.Algo, tc.Body)
|
||
|
|
if err != nil {
|
||
|
|
if tc.ExpectedErrCode != "" {
|
||
|
|
diffErrorCode(t, err, tc.ExpectedErrCode)
|
||
|
|
return
|
||
|
|
}
|
||
|
|
t.Fatal(err)
|
||
|
|
}
|
||
|
|
actualEncoded := base64.StdEncoding.EncodeToString(actual.Digest)
|
||
|
|
sigtest.Diff(t, tc.ExpectedDigest, actualEncoded, "Wrong digest")
|
||
|
|
|
||
|
|
actualHeader, err := createDigestHeader(tc.Algo, actual.Digest)
|
||
|
|
if err != nil {
|
||
|
|
t.Fatal(err)
|
||
|
|
}
|
||
|
|
sigtest.Diff(t, tc.ExpectedHeader, actualHeader, "Wrong digest header")
|
||
|
|
})
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
func TestDigestParse(t *testing.T) {
|
||
|
|
testcases := []struct {
|
||
|
|
Name string
|
||
|
|
Header []string
|
||
|
|
ExcepctedAlgo Digest
|
||
|
|
ExpectedDigest string // base64 encoded digest
|
||
|
|
ExpectedErrCode ErrCode
|
||
|
|
}{
|
||
|
|
{
|
||
|
|
Name: "sha-256",
|
||
|
|
Header: []string{"sha-256=:uU0nuZNNPgilLlLX2n2r+sSE7+N6U4DukIj3rOLvzek=:"},
|
||
|
|
ExcepctedAlgo: DigestSHA256,
|
||
|
|
ExpectedDigest: "uU0nuZNNPgilLlLX2n2r+sSE7+N6U4DukIj3rOLvzek=",
|
||
|
|
},
|
||
|
|
{
|
||
|
|
Name: "sha-512",
|
||
|
|
Header: []string{"sha-512=:MJ7MSJwS1utMxA9QyQLytNDtd+5RGnx6m808qG1M2G+YndNbxf9JlnDaNCVbRbDP2DDoH2Bdz33FVC6TrpzXbw==:"},
|
||
|
|
ExcepctedAlgo: DigestSHA512,
|
||
|
|
ExpectedDigest: "MJ7MSJwS1utMxA9QyQLytNDtd+5RGnx6m808qG1M2G+YndNbxf9JlnDaNCVbRbDP2DDoH2Bdz33FVC6TrpzXbw==",
|
||
|
|
},
|
||
|
|
{
|
||
|
|
Name: "Empty",
|
||
|
|
Header: []string{},
|
||
|
|
ExpectedDigest: "",
|
||
|
|
},
|
||
|
|
{
|
||
|
|
Name: "BadHeader",
|
||
|
|
Header: []string{"bl===ah"},
|
||
|
|
ExpectedErrCode: ErrNoSigInvalidHeader,
|
||
|
|
},
|
||
|
|
{
|
||
|
|
Name: "Unsupported",
|
||
|
|
Header: []string{"md5=:blah:"},
|
||
|
|
ExpectedDigest: "",
|
||
|
|
},
|
||
|
|
}
|
||
|
|
|
||
|
|
for _, tc := range testcases {
|
||
|
|
t.Run(tc.Name, func(t *testing.T) {
|
||
|
|
actualAlgo, actualDigest, err := getSupportedDigestFromHeader(tc.Header)
|
||
|
|
if err != nil {
|
||
|
|
if tc.ExpectedErrCode != "" {
|
||
|
|
diffErrorCode(t, err, tc.ExpectedErrCode)
|
||
|
|
return
|
||
|
|
}
|
||
|
|
t.Fatal(err)
|
||
|
|
} else if tc.ExpectedErrCode != "" {
|
||
|
|
t.Fatal("Expected an err")
|
||
|
|
}
|
||
|
|
digestEncoded := base64.StdEncoding.EncodeToString(actualDigest)
|
||
|
|
sigtest.Diff(t, tc.ExcepctedAlgo, actualAlgo, "Wrong digest algo")
|
||
|
|
sigtest.Diff(t, tc.ExpectedDigest, digestEncoded, "Wrong digest")
|
||
|
|
})
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
func diffErrorCode(t *testing.T, err error, code ErrCode) bool {
|
||
|
|
var sigerr *SignatureError
|
||
|
|
if errors.As(err, &sigerr) {
|
||
|
|
return sigtest.Diff(t, code, sigerr.Code, "Wrong error code")
|
||
|
|
}
|
||
|
|
return false
|
||
|
|
}
|