Files
rustfs/protocol/agent/v1/fixtures/offline-enrollment/boundary-vectors.json
T
2026-09-05 10:23:35 +08:00

182 lines
6.6 KiB
JSON

{
"protocolVersion": "v1",
"fixtureSet": "offline-enrollment",
"fixture": "boundary-vectors",
"description": "Frozen challenge boundary and decision vectors for failures that cannot be added as newly signed golden documents because no fixture private key exists. Mutations start from the accepted pinned-root challenge and are applied without re-signing; every targeted rule runs before the signature invalidated by that mutation.",
"sourceVector": "challenge signed by a chained signing key under the pinned root",
"preparseMutations": [
{
"name": "challenge envelope is not JSON",
"scope": "serializedEnvelope",
"value": "{",
"expectedReason": "DOCUMENT_MALFORMED"
},
{
"name": "challenge bytes are non-canonical padded base64",
"scope": "envelopeBytes",
"value": "QR==",
"expectedReason": "DOCUMENT_MALFORMED"
},
{
"name": "challenge bytes decode to a JSON scalar",
"scope": "envelopeBytes",
"value": "bnVsbA==",
"expectedReason": "DOCUMENT_MALFORMED"
},
{
"name": "challenge is missing trustChain",
"scope": "challenge",
"operation": "remove",
"field": "trustChain",
"expectedReason": "DOCUMENT_MALFORMED"
},
{
"name": "challenge trustChain is a JSON object",
"scope": "challengeChain",
"operation": "objectWithFirst",
"expectedReason": "DOCUMENT_MALFORMED"
},
{
"name": "challenge issuedAt is not a real calendar instant",
"scope": "challenge",
"operation": "replace",
"field": "issuedAt",
"value": "2026-02-31T00:00:00Z",
"expectedReason": "DOCUMENT_MALFORMED"
},
{
"name": "first trust link issuerKeyId is malformed",
"scope": "trustLink",
"index": 0,
"operation": "replace",
"field": "issuerKeyId",
"value": "not-a-key-id",
"expectedReason": "DOCUMENT_MALFORMED"
}
],
"verificationMutations": [
{
"name": "challenge signature algorithm is not ES256",
"scope": "envelopeSignature",
"operation": "replace",
"field": "algorithm",
"value": "ES384",
"expectedReason": "SIGNATURE_MALFORMED"
},
{
"name": "challenge signature keyId is malformed",
"scope": "envelopeSignature",
"operation": "replace",
"field": "keyId",
"value": "not-a-key-id",
"expectedReason": "SIGNATURE_MALFORMED"
},
{
"name": "challenge signature keyId names another well-formed key",
"scope": "envelopeSignature",
"operation": "replace",
"field": "keyId",
"value": "f6fbe050defded18b50477ace38c9515fb61b8157e57b2f0e7e8ca69c862b6ca",
"expectedReason": "SIGNATURE_INVALID"
},
{
"name": "pinned-root challenge carries only one trust link",
"scope": "challengeChain",
"operation": "keepFirst",
"expectedReason": "TRUST_CHAIN_INVALID"
},
{
"name": "intermediate link formatVersion is unsupported",
"scope": "trustLink",
"index": 0,
"operation": "replace",
"field": "formatVersion",
"value": "rustfs.connect.offline.trustLink/2",
"expectedReason": "TRUST_CHAIN_INVALID"
},
{
"name": "intermediate link protocolVersion is unsupported",
"scope": "trustLink",
"index": 0,
"operation": "replace",
"field": "protocolVersion",
"value": "v2",
"expectedReason": "TRUST_CHAIN_INVALID"
},
{
"name": "intermediate link signature algorithm is not ES256",
"scope": "trustLinkSignature",
"index": 0,
"operation": "replace",
"field": "algorithm",
"value": "ES384",
"expectedReason": "TRUST_CHAIN_INVALID"
},
{
"name": "intermediate link omits serial",
"scope": "trustLink",
"index": 0,
"operation": "remove",
"field": "serial",
"expectedReason": "TRUST_CHAIN_INVALID"
},
{
"name": "first trust link carries signing role",
"scope": "trustLink",
"index": 0,
"operation": "replace",
"field": "role",
"value": "signing",
"expectedReason": "TRUST_CHAIN_INVALID"
}
],
"linkValidityPolicyVectors": [
{
"name": "intermediate link at its maximum validity",
"role": "intermediate",
"notBefore": "2026-01-01T00:00:00Z",
"notAfter": "2027-01-01T00:00:00Z",
"expectedReason": null
},
{
"name": "intermediate link one second beyond its maximum validity",
"role": "intermediate",
"notBefore": "2026-01-01T00:00:00Z",
"notAfter": "2027-01-01T00:00:01Z",
"expectedReason": "TRUST_CHAIN_INVALID"
},
{
"name": "signing link at its maximum validity",
"role": "signing",
"notBefore": "2026-08-01T00:00:00Z",
"notAfter": "2026-09-01T00:00:00Z",
"expectedReason": null
},
{
"name": "signing link one second beyond its maximum validity",
"role": "signing",
"notBefore": "2026-08-01T00:00:00Z",
"notAfter": "2026-09-01T00:00:01Z",
"expectedReason": "TRUST_CHAIN_INVALID"
}
],
"postSignaturePolicyVectors": [
{
"name": "overlong challenge expires at the frozen seven-day boundary",
"issuedAt": "2026-08-01T00:00:00Z",
"declaredExpiresAt": "2026-08-09T00:00:00Z",
"evaluationTime": "2026-08-08T00:05:01Z",
"expectedEffectiveExpiresAt": "2026-08-08T00:00:00Z",
"expectedReason": "CHALLENGE_EXPIRED"
},
{
"name": "overlong challenge remains valid at the frozen boundary plus tolerance",
"issuedAt": "2026-08-01T00:00:00Z",
"declaredExpiresAt": "2026-08-09T00:00:00Z",
"evaluationTime": "2026-08-08T00:05:00Z",
"expectedEffectiveExpiresAt": "2026-08-08T00:00:00Z",
"expectedReason": null
}
]
}