Trust
Profile attestation signing key
When you request a signed OWASP Agentic Skills assessment, Agent Verify signs it with the key below. This page publishes that key independently of the API, so you can check a signed assessment against a key you obtained from a channel other than the assessment itself.
Production key (public half)
- Issuer
- agentverify-profile-prod
- Key ID
- eIO7_uhceQOQ0FDx5bGCODcYEUPkbSgAcuXczunT1QA
- Algorithm
- ECDSA-P256-SHA256
- Purpose
- agentverify-profile-v1
- Public key (JWK)
- {"kty":"EC","crv":"P-256","x":"VXPfI3NT991D1bcsM_2qFlQQ6exNcAvg64ls03VvoEA","y":"ipymtcwB_-j_ZdDw34A47IgxUg5N4rasS8qHvHGxXL4"}
Key ID is the RFC 7638 JWK thumbprint of the public key (SHA-256 over the canonical {"crv","kty","x","y"} JSON, base64url) — recompute it yourself rather than trusting the value shown. Machine-readable copy: profile-attestation-key.json.
Verify a signed assessment
A signed assessment is a bundle of { bundleVersion, attestation, assessment }. Download it from the result screen (Profile & technical details → Download), or take the assessment, attestation and bundleVersion fields from the API response.
- Get the key from two places. This page and
GET https://agentverify-api.agentverify.workers.dev/v1/profile-attestation/public-key. Both must agree. - Pin the key. Require the bundle's
attestation.publicKeyandattestation.payload.keyIdto equal the published key. A signature that verifies against a key the bundle brought with it proves only that the bundle is self-consistent. - Verify the signature and bindings. The reference verifier checks the signature, that the Key ID matches the embedded key, that the assessment digest matches the signed payload, and every cross-field binding.
// Node 20+. verifier: conformance/v4/reference/ in the open-source repo
// https://github.com/AI-Blockchain-Ventures/agentverify
import { readFileSync } from 'node:fs'
import { verifyProfileBundleBytes } from './conformance/v4/reference/profileAttestation.mjs'
const bytes = readFileSync('bundle.json')
const bundle = JSON.parse(bytes.toString('utf8'))
// 1-2. The published key is the trust anchor, not the bundle's own key.
const published = await (await fetch('https://agentverify-api.agentverify.workers.dev/v1/profile-attestation/public-key')).json()
const pinned =
published.keyId === bundle.attestation.payload.keyId &&
JSON.stringify(published.publicKey) === JSON.stringify(bundle.attestation.publicKey)
// 3. Signature, digest and binding checks.
const result = await verifyProfileBundleBytes(bytes)
console.log(pinned && result.integrity === 'VALID' && result.interpretation === 'SUPPORTED')What a valid signature means
The signature proves this exact assessment was issued by Agent Verify and has not been altered. It does not independently prove that every finding is correct or complete.
- Proves: the assessment is exactly what Agent Verify issued, unmodified; the issuer is Agent Verify, because the key is published independently; and the signature is bound to this exact package, assessment and profile version.
- Does not prove: that every finding is correct or complete, and it is not an OWASP certification or endorsement.
What this release does not provide
This is a single published key, not a key set. It does not yet provide key retirement or revocation history, rollback detection, or trusted timestamping. The issuedAt value in a bundle is Agent Verify's own clock, signed with the assessment, not an independent timestamp. When any of these are added, they will be published here.
Related: OWASP Agentic Skills profile · API and CLI documentation