Agent VerifyAgent Verify

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.

  1. Get the key from two places. This page and GET https://agentverify-api.agentverify.workers.dev/v1/profile-attestation/public-key. Both must agree.
  2. Pin the key. Require the bundle's attestation.publicKey and attestation.payload.keyId to equal the published key. A signature that verifies against a key the bundle brought with it proves only that the bundle is self-consistent.
  3. 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