...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package policy
17
18 import (
19 "context"
20 "fmt"
21
22 "cuelang.org/go/cue/cuecontext"
23 "github.com/sigstore/cosign/v2/pkg/cosign/rego"
24 )
25
26
27
28
29
30
31
32
33 func EvaluatePolicyAgainstJSON(ctx context.Context, name, policyType string, policyBody string, jsonBytes []byte) (warnings error, errors error) {
34 switch policyType {
35 case "cue":
36 cueValidationErr := evaluateCue(ctx, jsonBytes, policyBody)
37 if cueValidationErr != nil {
38 return nil, &EvaluationFailure{
39 fmt.Errorf("failed evaluating cue policy for %s: %w", name, cueValidationErr),
40 }
41 }
42 case "rego":
43 regoValidationWarn, regoValidationErr := evaluateRego(ctx, jsonBytes, policyBody)
44 if regoValidationErr != nil {
45 return regoValidationWarn, &EvaluationFailure{
46 fmt.Errorf("failed evaluating rego policy for type %s: %w", name, regoValidationErr),
47 }
48 }
49
50 return regoValidationWarn, regoValidationErr
51 default:
52 return nil, fmt.Errorf("sorry Type %s is not supported yet", policyType)
53 }
54 return nil, nil
55 }
56
57
58 func evaluateCue(_ context.Context, attestation []byte, evaluator string) error {
59 cueCtx := cuecontext.New()
60 cueEvaluator := cueCtx.CompileString(evaluator)
61 if cueEvaluator.Err() != nil {
62 return fmt.Errorf("failed to compile the cue policy with error: %w", cueEvaluator.Err())
63 }
64 cueAtt := cueCtx.CompileBytes(attestation)
65 if cueAtt.Err() != nil {
66 return fmt.Errorf("failed to compile the attestation data with error: %w", cueAtt.Err())
67 }
68 result := cueEvaluator.Unify(cueAtt)
69 if err := result.Validate(); err != nil {
70 return fmt.Errorf("failed to evaluate the policy with error: %w", err)
71 }
72 return nil
73 }
74
75
76 func evaluateRego(_ context.Context, attestation []byte, evaluator string) (warnings error, errors error) {
77 return rego.ValidateJSONWithModuleInput(attestation, evaluator)
78 }
79
View as plain text