Path: blob/dev/pkg/templates/signer/tmpl_signer_test.go
2070 views
package signer12import (3"bytes"4"os"5"path/filepath"6"testing"78"github.com/stretchr/testify/assert"9"github.com/stretchr/testify/require"10)1112const (13testCertFile = "../../../integration_tests/protocols/keys/ci.crt"14testKeyFile = "../../../integration_tests/protocols/keys/ci-private-key.pem"15)1617type mockSignableTemplate struct {18imports []string19hasCode bool20}2122func (m *mockSignableTemplate) GetFileImports() []string {23return m.imports24}2526func (m *mockSignableTemplate) HasCodeProtocol() bool {27return m.hasCode28}2930var signer, _ = NewTemplateSignerFromFiles(testCertFile, testKeyFile)3132func TestTemplateSignerSignAndVerify(t *testing.T) {33tempDir := t.TempDir()3435tests := []struct {36name string37data []byte38tmpl SignableTemplate39wantSignErr bool40wantVerifyErr bool41wantVerified bool42modifyAfterSign func([]byte) []byte43}{44{45name: "Simple template",46data: []byte("id: test-template\ninfo:\n name: Test Template"),47tmpl: &mockSignableTemplate{},48wantVerified: true,49},50{51name: "Template with imports",52data: []byte("id: test-template\ninfo:\n name: Test Template"),53tmpl: &mockSignableTemplate{imports: []string{54filepath.Join(tempDir, "import1.yaml"),55filepath.Join(tempDir, "import2.yaml"),56}},57wantVerified: true,58},59{60name: "Template with code protocol",61data: []byte("id: test-template\ninfo:\n name: Test Template\n\ncode:\n - engine: bash\n source: echo 'Hello, World!'"),62tmpl: &mockSignableTemplate{hasCode: true},63wantSignErr: false,64wantVerified: true,65},66{67name: "Tampered template",68data: []byte("id: test-template\ninfo:\n name: Test Template"),69tmpl: &mockSignableTemplate{},70modifyAfterSign: func(data []byte) []byte {71signatureIndex := bytes.LastIndex(data, []byte(SignaturePattern))72if signatureIndex == -1 {73return data74}75return append(data[:signatureIndex], append([]byte("# Tampered content\n"), data[signatureIndex:]...)...)76},77wantVerified: false,78},79{80name: "Invalid signature",81data: []byte("id: test-template\ninfo:\n name: Test Template"),82tmpl: &mockSignableTemplate{},83modifyAfterSign: func(data []byte) []byte {84return append(bytes.TrimSuffix(data, []byte("\n")), []byte("\n# digest: invalid_signature:fragment")...)85},86wantVerifyErr: true,87wantVerified: false,88},89}9091for _, tt := range tests {92t.Run(tt.name, func(t *testing.T) {93// Create import files if needed94for _, imp := range tt.tmpl.GetFileImports() {95err := os.WriteFile(imp, []byte("imported content"), 0644)96require.NoError(t, err, "Failed to create import file")97}9899// Sign the template100signature, err := signer.Sign(tt.data, tt.tmpl)101if tt.wantSignErr {102assert.Error(t, err, "Expected an error during signing")103return104}105require.NoError(t, err, "Failed to sign template")106107// Append signature to the template data108signedData := append(tt.data, []byte("\n"+signature)...)109110// Apply any modifications after signing if specified111if tt.modifyAfterSign != nil {112signedData = tt.modifyAfterSign(signedData)113}114115// Verify the signature116verified, err := signer.Verify(signedData, tt.tmpl)117if tt.wantVerifyErr {118assert.Error(t, err, "Expected an error during verification")119} else {120assert.NoError(t, err, "Unexpected error during verification")121}122assert.Equal(t, tt.wantVerified, verified, "Unexpected verification result")123})124}125}126127128