in cmd/conformance/main.go [1089:1236]
func runNegotiateAttestationTests(ctx context.Context) {
negotiateAttestationTestCases := []negotiateAttestationTest{
{
testName: "Valid request requesting null attestation",
expectErr: false,
evidenceTypes: []aepb.AttestationEvidenceType{aepb.AttestationEvidenceType_NULL_ATTESTATION},
},
{
testName: "Valid request supporting all vTPM attestation types",
expectErr: false,
evidenceTypes: []aepb.AttestationEvidenceType{
aepb.AttestationEvidenceType_TPM2_QUOTE,
aepb.AttestationEvidenceType_TCG_EVENT_LOG,
},
},
{
testName: "Valid request supporting all vTPM attestation types + null attestation",
expectErr: false,
evidenceTypes: []aepb.AttestationEvidenceType{
aepb.AttestationEvidenceType_NULL_ATTESTATION,
aepb.AttestationEvidenceType_TPM2_QUOTE,
aepb.AttestationEvidenceType_TCG_EVENT_LOG,
},
},
{
testName: "Valid request with server-unsupported evidence type",
expectErr: true,
evidenceTypes: []aepb.AttestationEvidenceType{
aepb.AttestationEvidenceType_UNKNOWN_EVIDENCE_TYPE,
},
},
{
testName: "Valid request with server-unsupported evidence type + null attestation",
expectErr: false,
evidenceTypes: []aepb.AttestationEvidenceType{
aepb.AttestationEvidenceType_UNKNOWN_EVIDENCE_TYPE,
aepb.AttestationEvidenceType_NULL_ATTESTATION,
},
},
{
testName: "Valid request trying to negotiate nonce types",
expectErr: false,
evidenceTypes: []aepb.AttestationEvidenceType{
aepb.AttestationEvidenceType_TPM2_QUOTE,
aepb.AttestationEvidenceType_TCG_EVENT_LOG,
},
nonceTypes: []aepb.NonceType{
aepb.NonceType_NONCE_EKM32,
},
},
{
testName: "Invalid request to negotiate Tpm2Quote without EventLog",
expectErr: true,
evidenceTypes: []aepb.AttestationEvidenceType{
aepb.AttestationEvidenceType_TPM2_QUOTE,
},
},
{
testName: "Invalid request to negotiate EventLog without Tpm2Quote",
expectErr: true,
evidenceTypes: []aepb.AttestationEvidenceType{
aepb.AttestationEvidenceType_TCG_EVENT_LOG,
},
},
{
testName: "No TLS records in request",
expectErr: true,
evidenceTypes: []aepb.AttestationEvidenceType{aepb.AttestationEvidenceType_NULL_ATTESTATION},
mutateTLSRecords: emptyFn,
},
{
testName: "Invalid session key",
expectErr: true,
evidenceTypes: []aepb.AttestationEvidenceType{aepb.AttestationEvidenceType_NULL_ATTESTATION},
mutateSessionKey: emptyFn,
},
{
testName: "JWT has invalid signature",
expectErr: true,
mutateJWT: invalidateJwtSignature,
evidenceTypes: []aepb.AttestationEvidenceType{aepb.AttestationEvidenceType_NULL_ATTESTATION},
optional: true,
},
{
testName: "JWT has a bad audience",
expectErr: true,
mutateJWT: badAudience,
evidenceTypes: []aepb.AttestationEvidenceType{aepb.AttestationEvidenceType_NULL_ATTESTATION},
optional: true,
},
}
for _, testCase := range negotiateAttestationTestCases {
negotiatedTypes, err := runNegotiateAttestationTestCase(ctx, testCase)
// Check that the negotiated types are what we expected.
if err == nil {
// At least one of the negotiated attestation types should be in the original list.
if len(testCase.evidenceTypes) > 0 {
goodAttestation := false
matchAttestation:
for _, negotiatedType := range negotiatedTypes.GetTypes() {
for _, requestedType := range testCase.evidenceTypes {
if negotiatedType == requestedType && negotiatedType != aepb.AttestationEvidenceType_UNKNOWN_EVIDENCE_TYPE {
goodAttestation = true
break matchAttestation
}
}
}
if !goodAttestation {
err = fmt.Errorf("Negotiated attestation type(s) (%v) not in requested list (%v)", negotiatedTypes.GetTypes(), testCase.evidenceTypes)
}
}
// At least one of the negotiated nonce types should be in the original list.
//
// Temporarily accept servers that don't negotiate nonce types, with the intention to
// deprecate this in the future once it is reasonable to expect that all servers will
// negotiate nonce types (as of now, this hasn't been part of the protocol for a long
// enough period of time to expect all servers to implement it correctly).
if len(testCase.nonceTypes) > 0 && len(negotiatedTypes.GetNonceTypes()) > 0 {
goodNonce := false
matchNonce:
for _, negotiatedNonce := range negotiatedTypes.GetNonceTypes() {
for _, requestedNonce := range testCase.nonceTypes {
if negotiatedNonce == requestedNonce {
goodNonce = true
break matchNonce
}
}
}
if !goodNonce {
err = fmt.Errorf("Negotiated nonce type(s) (%v) not in requested list (%v)", negotiatedTypes.GetNonceTypes(), testCase.nonceTypes)
}
}
}
testPassed := testCase.expectErr == (err != nil)
if testPassed {
colour.Printf(" - ^2%v^R\n", testCase.testName)
} else {
printError(testCase.testName, err, testCase.optional)
}
}
}