mirror of
https://github.com/ultravioletrs/cocos.git
synced 2026-06-23 04:10:25 +00:00
27db9b29eb
CI / lint (push) Has been cancelled
CI / test (agent) (push) Has been cancelled
CI / test (cli) (push) Has been cancelled
CI / test (cmd) (push) Has been cancelled
CI / test (internal) (push) Has been cancelled
CI / test (manager, true) (push) Has been cancelled
CI / test (pkg) (push) Has been cancelled
CI / upload-coverage (push) Has been cancelled
* Added GPU evidence collection * Added GPU evidence verification * Added make command for nvattest helper * Added command for installing all services * changed attestion-service.service so it knows where the helper is * Possible IGVM script bug * Possible bug * Bug * bug * Revert "bug" This reverts commitd81d67e73d. * Revert "Bug" This reverts commit5e566d53c1. * Revert "Possible bug" This reverts commit47d13fe583. * Revert "Possible IGVM script bug" This reverts commit3fb1b79537. * Revert "changed attestion-service.service so it knows where the helper is" This reverts commitf9f11ed183. * Revert "Added command for installing all services" This reverts commit5dcf7a5c0a. * NOISSUE - Enforce binding label check (#589) * NOISSUE - Implement extensible resource downloader framework with support for S3, GCS, and OCI sources (#590) * feat: implement extensible resource downloader framework with support for S3, GCS, and OCI sources Signed-off-by: SammyOina <sammyoina@gmail.com> * refactor: improve resource URL parsing and add support for bare OCI image references Signed-off-by: Sammy Oina <sammyoina@gmail.com> * fix: add empty string check and slash requirement for OCI image inference, and update python unit tests with event mock expectations Signed-off-by: Sammy Oina <sammyoina@gmail.com> * refactor: introduce OCIClient interface, add test coverage for decryption, and improve resource download error handling Signed-off-by: Sammy Oina <sammyoina@gmail.com> * chore: remove trailing whitespace in OCI downloader and HTTP tests Signed-off-by: Sammy Oina <sammyoina@gmail.com> --------- Signed-off-by: SammyOina <sammyoina@gmail.com> Signed-off-by: Sammy Oina <sammyoina@gmail.com> * Refactored baed on comments * Added GPU evidence collection * Added GPU evidence verification * Added make command for nvattest helper * Added command for installing all services * changed attestion-service.service so it knows where the helper is * Possible IGVM script bug * Possible bug * Bug * bug * Revert "bug" This reverts commitd81d67e73d. * Revert "Bug" This reverts commit5e566d53c1. * Revert "Possible bug" This reverts commit47d13fe583. * Revert "Possible IGVM script bug" This reverts commit3fb1b79537. * Revert "changed attestion-service.service so it knows where the helper is" This reverts commitf9f11ed183. * Revert "Added command for installing all services" This reverts commit5dcf7a5c0a. * Refactored baed on comments * fixed lint error * fixed tests * Fixed according to comments * COCOS-584 - Support multiple kbs (#587) * feat: Implement per-resource KBS configuration, allowing algorithms and datasets to specify individual KBS URLs. Signed-off-by: Sammy Oina <sammyoina@gmail.com> * refactor: Encapsulate CLI error handling and CVM certificate paths within the CLI struct, and add algorithm type to agent's algorithm structure. Signed-off-by: Sammy Oina <sammyoina@gmail.com> * style: Remove blank lines and fix indentation in CLI commands. Signed-off-by: Sammy Oina <sammyoina@gmail.com> * refactor: Update downloadAndDecryptGenericResource to accept KBS URL as a parameter and adjust related tests Signed-off-by: Sammy Oina <sammyoina@gmail.com> * refactor: group CLI configuration into structured types and simplify skopeo decryption key handling Signed-off-by: Sammy Oina <sammyoina@gmail.com> --------- Signed-off-by: Sammy Oina <sammyoina@gmail.com> * Added GPU evidence collection * Added GPU evidence verification * Added make command for nvattest helper * Added command for installing all services * changed attestion-service.service so it knows where the helper is * Possible IGVM script bug * Possible bug * Bug * bug * Revert "bug" This reverts commitd81d67e73d. * Revert "Bug" This reverts commit5e566d53c1. * Revert "Possible bug" This reverts commit47d13fe583. * Revert "Possible IGVM script bug" This reverts commit3fb1b79537. * Revert "changed attestion-service.service so it knows where the helper is" This reverts commitf9f11ed183. * Revert "Added command for installing all services" This reverts commit5dcf7a5c0a. * Refactored baed on comments * Added GPU evidence collection * Added GPU evidence verification * Added make command for nvattest helper * Added command for installing all services * changed attestion-service.service so it knows where the helper is * Possible IGVM script bug * Possible bug * Bug * bug * Revert "bug" This reverts commitd81d67e73d. * Revert "Bug" This reverts commit5e566d53c1. * Revert "Possible bug" This reverts commit47d13fe583. * Revert "Possible IGVM script bug" This reverts commit3fb1b79537. * Revert "changed attestion-service.service so it knows where the helper is" This reverts commitf9f11ed183. * Revert "Added command for installing all services" This reverts commit5dcf7a5c0a. * Refactored baed on comments * fixed lint error * fixed tests * Fixed according to comments --------- Signed-off-by: SammyOina <sammyoina@gmail.com> Signed-off-by: Sammy Oina <sammyoina@gmail.com> Co-authored-by: Danko Miladinovic <72250944+danko-miladinovic@users.noreply.github.com> Co-authored-by: Sammy Kerata Oina <44265300+SammyOina@users.noreply.github.com>
166 lines
4.7 KiB
Go
166 lines
4.7 KiB
Go
// Copyright (c) Ultraviolet
|
|
// SPDX-License-Identifier: Apache-2.0
|
|
|
|
package atls
|
|
|
|
import (
|
|
"crypto/sha256"
|
|
"encoding/hex"
|
|
"errors"
|
|
"fmt"
|
|
"testing"
|
|
|
|
"github.com/fxamacker/cbor/v2"
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
cocosattestation "github.com/ultravioletrs/cocos/pkg/attestation"
|
|
"github.com/ultravioletrs/cocos/pkg/attestation/eat"
|
|
"github.com/veraison/corim/corim"
|
|
)
|
|
|
|
type stubVerifier struct {
|
|
reports [][]byte
|
|
err error
|
|
}
|
|
|
|
func (s *stubVerifier) VerifyWithCoRIM(report []byte, _ *corim.UnsignedCorim) error {
|
|
s.reports = append(s.reports, append([]byte(nil), report...))
|
|
return s.err
|
|
}
|
|
|
|
func TestPolicyEvidenceVerifierVerifyEvidence_RootOnly(t *testing.T) {
|
|
root := &stubVerifier{}
|
|
gpu := &stubVerifier{}
|
|
|
|
v := &policyEvidenceVerifier{
|
|
policyPath: "/tmp/policy",
|
|
loadManifest: func(string) (*corim.UnsignedCorim, error) {
|
|
return &corim.UnsignedCorim{}, nil
|
|
},
|
|
rootVerifier: func(cocosattestation.PlatformType) (cocosattestation.Verifier, error) {
|
|
return root, nil
|
|
},
|
|
newGPUVerifier: func() (cocosattestation.Verifier, error) {
|
|
return gpu, nil
|
|
},
|
|
}
|
|
|
|
err := v.VerifyEvidence(encodeClaims(t, &eat.EATClaims{
|
|
PlatformType: "TDX",
|
|
RawReport: []byte("root-report"),
|
|
Nonce: []byte("session-nonce"),
|
|
}))
|
|
require.NoError(t, err)
|
|
assert.Equal(t, [][]byte{[]byte("root-report")}, root.reports)
|
|
assert.Empty(t, gpu.reports)
|
|
}
|
|
|
|
func TestPolicyEvidenceVerifierVerifyEvidence_RootAndGPU(t *testing.T) {
|
|
root := &stubVerifier{}
|
|
gpu := &stubVerifier{}
|
|
sessionNonce := []byte("session-nonce")
|
|
gpuNonce := deriveExpectedGPUNonce(sessionNonce)
|
|
gpuNonceHex := hex.EncodeToString(gpuNonce)
|
|
evidenceJSON := fmt.Appendf(nil, `[{"nonce":"%s","evidence":"abc","certificate":"def"}]`, gpuNonceHex)
|
|
|
|
v := &policyEvidenceVerifier{
|
|
policyPath: "/tmp/policy",
|
|
loadManifest: func(string) (*corim.UnsignedCorim, error) {
|
|
return &corim.UnsignedCorim{}, nil
|
|
},
|
|
rootVerifier: func(cocosattestation.PlatformType) (cocosattestation.Verifier, error) {
|
|
return root, nil
|
|
},
|
|
newGPUVerifier: func() (cocosattestation.Verifier, error) {
|
|
return gpu, nil
|
|
},
|
|
}
|
|
|
|
err := v.VerifyEvidence(encodeClaims(t, &eat.EATClaims{
|
|
PlatformType: "TDX",
|
|
RawReport: []byte("root-report"),
|
|
Nonce: sessionNonce,
|
|
GPUExtensions: &eat.GPUExtensions{
|
|
Nonce: gpuNonce,
|
|
EvidenceJSON: evidenceJSON,
|
|
},
|
|
}))
|
|
require.NoError(t, err)
|
|
assert.Equal(t, [][]byte{[]byte("root-report")}, root.reports)
|
|
assert.Equal(t, [][]byte{evidenceJSON}, gpu.reports)
|
|
}
|
|
|
|
func TestPolicyEvidenceVerifierVerifyEvidence_GPUNonceMismatch(t *testing.T) {
|
|
root := &stubVerifier{}
|
|
|
|
v := &policyEvidenceVerifier{
|
|
policyPath: "/tmp/policy",
|
|
loadManifest: func(string) (*corim.UnsignedCorim, error) {
|
|
return &corim.UnsignedCorim{}, nil
|
|
},
|
|
rootVerifier: func(cocosattestation.PlatformType) (cocosattestation.Verifier, error) {
|
|
return root, nil
|
|
},
|
|
}
|
|
|
|
err := v.VerifyEvidence(encodeClaims(t, &eat.EATClaims{
|
|
PlatformType: "TDX",
|
|
RawReport: []byte("root-report"),
|
|
Nonce: []byte("session-nonce"),
|
|
GPUExtensions: &eat.GPUExtensions{
|
|
Nonce: []byte("wrong"),
|
|
EvidenceJSON: []byte(`[{"nonce":"aabbcc"}]`),
|
|
},
|
|
}))
|
|
require.Error(t, err)
|
|
assert.ErrorContains(t, err, "gpu nonce binding mismatch")
|
|
assert.Equal(t, [][]byte{[]byte("root-report")}, root.reports)
|
|
}
|
|
|
|
func TestPolicyEvidenceVerifierVerifyEvidence_GPUVerifierError(t *testing.T) {
|
|
expectedErr := errors.New("gpu verify failed")
|
|
root := &stubVerifier{}
|
|
gpu := &stubVerifier{err: expectedErr}
|
|
sessionNonce := []byte("session-nonce")
|
|
derivedNonce := deriveExpectedGPUNonce(sessionNonce)
|
|
gpuEvidenceJSON := fmt.Appendf(nil, `[{"nonce":"%s"}]`, hex.EncodeToString(derivedNonce))
|
|
|
|
v := &policyEvidenceVerifier{
|
|
policyPath: "/tmp/policy",
|
|
loadManifest: func(string) (*corim.UnsignedCorim, error) {
|
|
return &corim.UnsignedCorim{}, nil
|
|
},
|
|
rootVerifier: func(cocosattestation.PlatformType) (cocosattestation.Verifier, error) {
|
|
return root, nil
|
|
},
|
|
newGPUVerifier: func() (cocosattestation.Verifier, error) {
|
|
return gpu, nil
|
|
},
|
|
}
|
|
|
|
err := v.VerifyEvidence(encodeClaims(t, &eat.EATClaims{
|
|
PlatformType: "TDX",
|
|
RawReport: []byte("root-report"),
|
|
Nonce: sessionNonce,
|
|
GPUExtensions: &eat.GPUExtensions{
|
|
Nonce: derivedNonce,
|
|
EvidenceJSON: gpuEvidenceJSON,
|
|
},
|
|
}))
|
|
require.Error(t, err)
|
|
assert.ErrorIs(t, err, expectedErr)
|
|
}
|
|
|
|
func encodeClaims(t *testing.T, claims *eat.EATClaims) []byte {
|
|
t.Helper()
|
|
|
|
b, err := cbor.Marshal(claims)
|
|
require.NoError(t, err)
|
|
return b
|
|
}
|
|
|
|
func deriveExpectedGPUNonce(sessionNonce []byte) []byte {
|
|
sum := sha256.Sum256(append(append([]byte(nil), sessionNonce...), []byte(":gpu")...))
|
|
return sum[:]
|
|
}
|