-
Notifications
You must be signed in to change notification settings - Fork 2
[VC-1161] [VC-1162] updated tn, org-identity and brand owner schemas #32
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from all commits
6d561f8
575fb6c
6ce14a7
02b3bf9
9608140
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,5 +1,79 @@ | ||
| ## Brand Owner Credentials | ||
| ## OVC Brand Owner Credential | ||
|
|
||
| #### Purpose | ||
| ### Purpose | ||
|
|
||
| These credentials document the issuee's right to use certain elements of a brand, either because the brand is owned by the issuee, or because it is licensed to them. | ||
| This credential is issued to a legal entity that has the **right to use a brand** because it is either the direct owner of the brand or a licensee authorized to act under it. It establishes that a specific organization is the legitimate operator of a brand identity — including its name, logo, contact information, and communications channels. | ||
|
|
||
| In voice and messaging ecosystems, the OVC Brand Owner Credential is the mechanism by which a verifier can answer the question: *"Is this call or message legitimately coming from the organization it claims to represent?"* By chaining the brand credential back to both an identity credential (proving the legal entity exists) and a brand authority credential (proving the right to use the brand), a verifier gets cryptographic assurance that the brand presentation is authentic. | ||
|
|
||
| ### Schema | ||
|
|
||
| See [ovc-brand-owner.schema.json](ovc-brand-owner.schema.json). | ||
|
|
||
| ### Required and optional attributes | ||
|
|
||
| The attributes block requires `d` (attributes SAID), `i` (issuee AID), and `dt` (issuance datetime). `vcard` and `goals` are both optional, though in practice a brand owner credential without a `vcard` is of limited use. Both fields may be selectively disclosed. | ||
|
|
||
| ### Brand attributes (`vcard`) | ||
|
|
||
| The `vcard` field is an ordered array of unfolded VCard content lines (RFC 6350). This is the canonical representation of the brand's identity — the information a verifier would present to a call recipient or SMS recipient to describe who is contacting them. | ||
|
|
||
| Key conventions: | ||
|
|
||
| - Property and parameter names are **upper case**. | ||
| - Parameter names appear in **lexicographic order**. | ||
| - Telephone number values MUST be in **strict E.164 format** (leading `+`, no spaces or punctuation). | ||
| - The `CHATBOT` property is standard and takes a URI value. | ||
| - For `LOGO` and other static media URIs, the `HASH` parameter SHOULD be included and MUST be the CESR-encoded Blake3-256 digest of the content at the URI. This prevents a logo from being silently swapped after issuance. Alternatively, a data URI may be used to embed the media directly. | ||
| - URIs pointing to mutable content SHOULD NOT be used — if present, the credential asserts only the location, not the content. | ||
|
|
||
| Example vcard entries: | ||
|
|
||
| ``` | ||
| ORG:Acme Space Travel, Ltd. | ||
| NICKNAME:Acme Rockets | ||
| CHATBOT:https://acmespacetravel.biz/chat | ||
| LOGO;HASH=EK2r6EnDXre2pecTBO8s99j4OtNaaDIhVyr7uGugDhmp;VALUE=URI:https://acmespacetravel.biz/logo64x48.png | ||
| TEL;TYPE=support:+14155550199 | ||
| EMAIL:support@acmespacetravel.biz | ||
| URL:https://www.acmespacetravel.biz | ||
| ADR;TYPE=work:;;1 Rocket Road;Hawthorne;CA;90250;United States | ||
| TZ:America/Los_Angeles | ||
| LANG:en-US | ||
| ``` | ||
|
|
||
| ### Goal codes (`goals`) | ||
|
|
||
| The optional `goals` field lists [Hyperledger Aries goal codes](https://bit.ly/49V8YqV) that enumerate the formally-defined activities in which this brand may legitimately engage using the asserted brand attributes. If specified, any activity **not** covered by these goal codes is considered a context in which legitimate use of the brand is not asserted by this credential. | ||
|
|
||
| This field is the primary mechanism for **constraining channel and purpose**. For example: | ||
| - A brand that only does outbound voice calls would include goal codes for voice. | ||
| - A brand that only does A2P SMS marketing would include goal codes for SMS campaigns. | ||
| - A brand operating in both channels would include goal codes for both. | ||
|
|
||
| This allows a single OVC Brand Owner Credential to serve multiple channels without schema proliferation. | ||
|
|
||
| ### Edge structure | ||
|
|
||
| The `e` (edges) block is optional. When present, it may contain: | ||
|
|
||
| | Edge | Required in block? | Purpose | | ||
| |---|---|---| | ||
| | `issuer` | No | Links to an identity credential (e.g., OVC Org Identity, vLEI) proving the identity of the issuer. Uses `I2I` operator. | | ||
| | `brandauth` | No | Links to a credential proving brand authority — e.g., a trademark registration or license agreement. Uses `I2I` operator. | | ||
|
Comment on lines
+62
to
+63
Comment on lines
+62
to
+63
|
||
|
|
||
| ### Multichannel readiness | ||
|
|
||
| A single OVC Brand Owner Credential is designed to work across voice, SMS, and other channels. The `vcard` field captures the brand's full contact profile; the `goals` field constrains which channels and activities the credential covers. This avoids the need for separate brand credentials per channel. | ||
|
|
||
| If a brand's voice and SMS operations have materially different contact information (e.g., different numbers or chatbot endpoints), separate credentials can be issued — but in the common case, one credential is sufficient. | ||
|
|
||
| ### Rules and governance | ||
|
|
||
| The `r` (rules) block must contain: | ||
|
|
||
| - **`governance`** — A statement identifying the governance framework under which this credential was issued. Issuers must populate this field with the URI of their applicable governance document. | ||
|
|
||
| Additional rules may be present and are governed by the issuer's governance framework. | ||
|
|
||
| The act of issuing or accepting this credential constitutes binding acceptance of those rules. | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,35 +1,67 @@ | ||
| { | ||
| "$id": "EAoRVmgPyacjhUxaV0nPwiuUuHMjKDpNZrj7ClofZ-3Z", | ||
| "$schema": "http://json-schema.org/draft-07/schema#", | ||
| "$id": "EImfvpfRx4YKhTzAzdZzCCjSNmwtY5yw9QlpZirG6OUa", | ||
| "$schema": "https://json-schema.org/draft/2020-12/schema", | ||
| "title": "OVC Brand Owner Credential", | ||
| "description": "Issued to a legal entity that has the right to use a brand because it is the direct owner or a licensee of that brand.", | ||
| "type": "object", | ||
| "credentialType": "BrandOwnerCredential", | ||
| "version": "1.0.0", | ||
| "version": "2.0.0", | ||
| "required": [ | ||
| "v", | ||
| "d", | ||
| "i", | ||
| "ri", | ||
| "s", | ||
| "a", | ||
| "r" | ||
| ], | ||
| "properties": { | ||
| "v": { | ||
| "description": "Version", | ||
| "type": "string" | ||
| "description": "Version string using ACDC conventions, encoding protocol, serialization, and size.", | ||
| "type": "string", | ||
| "pattern": "^ACDC[0-9]{2}[A-Z]{4}[0-9a-f]{6}_$", | ||
| "examples": [ | ||
| "ACDC10JSON000345_" | ||
| ] | ||
| }, | ||
| "d": { | ||
| "description": "Credential SAID", | ||
| "type": "string" | ||
| "description": "SAID of the credential (Blake3-256 digest in CESR compact encoding).", | ||
| "type": "string", | ||
| "pattern": "^E[A-Za-z0-9_-]{43}$", | ||
| "examples": [ | ||
| "EBwNam2e0mYdTx0i9xv78AIm16g1XCkQO8f8yJXaxmJC" | ||
| ] | ||
| }, | ||
| "u": { | ||
| "description": "One time use nonce", | ||
| "type": "string" | ||
| "description": "A salty nonce (high-entropy random value) used to prevent rainbow-table attacks on the credential SAID.", | ||
| "type": "string", | ||
| "examples": [ | ||
| "0AHcgNghkDaG7ts1Bv8wkv3b" | ||
| ] | ||
| }, | ||
| "i": { | ||
| "description": "Issuer AID", | ||
| "type": "string" | ||
| "description": "AID of the issuer (the party certifying the brand ownership right).", | ||
| "type": "string", | ||
| "pattern": "^[A-Za-z0-9_-]{44}$", | ||
| "examples": [ | ||
| "EDC0Sj0CPYd70zUSY2ehvm7Z4kwZigugiA84wuS7lK2H", | ||
| "BCmx-dBiozRlK5MfRnznAHl9kmXjB3t-zxrE3hIIYkeS" | ||
| ] | ||
| }, | ||
| "ri": { | ||
| "description": "Credential status registry", | ||
| "type": "string" | ||
| "description": "SAID of the issuer's ACDC credential status registry.", | ||
| "type": "string", | ||
| "pattern": "^E[A-Za-z0-9_-]{43}$", | ||
| "examples": [ | ||
| "EOkdwKgeEF-Ww2d61uhHjAo13rjJROdbdIaxORQJRV2G" | ||
| ] | ||
| }, | ||
| "s": { | ||
| "description": "Schema SAID", | ||
| "type": "string" | ||
| "description": "SAID of this schema (Blake3-256 digest in CESR compact encoding).", | ||
| "type": "string", | ||
| "pattern": "^E[A-Za-z0-9_-]{43}$", | ||
| "examples": [ | ||
| "EAoRVmgPyacjhUxaV0nPwiuUuHMjKDpNZrj7ClofZ-3Z" | ||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Stale |
||
| ] | ||
|
Arsh-Sandhu marked this conversation as resolved.
Arsh-Sandhu marked this conversation as resolved.
|
||
| }, | ||
| "a": { | ||
| "oneOf": [ | ||
|
|
@@ -38,22 +70,45 @@ | |
| "type": "string" | ||
| }, | ||
| { | ||
| "$id": "EIDYFHkBOgNVWGFRcN1cEXNvRV47-nrNJGx6mKHBA7ia", | ||
| "$id": "ENyK4LC9nT4w86rqvwwQ5iQxbISJzTDsSyfeNyX8NbCB", | ||
| "description": "Attributes block", | ||
| "type": "object", | ||
| "required": [ | ||
| "d", | ||
| "i", | ||
| "dt" | ||
| ], | ||
| "properties": { | ||
| "d": { | ||
| "description": "Attributes block SAID", | ||
| "type": "string" | ||
| "description": "SAID of the attributes block (Blake3-256 digest in CESR compact encoding).", | ||
| "type": "string", | ||
| "pattern": "^E[A-Za-z0-9_-]{43}$", | ||
| "examples": [ | ||
| "EIDYFHkBOgNVWGFRcN1cEXNvRV47-nrNJGx6mKHBA7ia" | ||
| ] | ||
| }, | ||
| "u": { | ||
| "description": "A salty nonce for the attributes block, enabling selective disclosure.", | ||
| "type": "string", | ||
| "examples": [ | ||
| "0AHcgNghkDaG7ts1Bv8wkv3b" | ||
| ] | ||
| }, | ||
| "i": { | ||
| "description": "AID of the legal entity that is the direct owner or a licensee of the brand", | ||
| "type": "string" | ||
| "description": "AID of the legal entity that is the direct owner or licensee of the brand.", | ||
| "type": "string", | ||
| "pattern": "^[A-Za-z0-9_-]{44}$", | ||
| "examples": [ | ||
| "EAZz0-cvLBLfqw3TRo-J0kBzM1TEwQ6a_v_892uH3Yjz" | ||
| ] | ||
| }, | ||
| "dt": { | ||
| "description": "Issuance date time", | ||
| "description": "Issuance date-time (when the ACDC was signed), as an ISO-8601 datetime string with timezone.", | ||
| "type": "string", | ||
| "format": "date-time", | ||
| "type": "string" | ||
| "examples": [ | ||
| "2024-01-15T10:30:00.000000+00:00" | ||
| ] | ||
| }, | ||
| "vcard": { | ||
| "description": "An ordered list of unfolded, VCard content lines (properties) per RFC 6350, where property and parameter names are upper case, and parameter names appear in lexicographic order. Values that are telephone numbers MUST be in strict E164 format with a leading + but no other spaces or punctuation. The CHATBOT property is standard and is of type URI. If the type of a particular value is URI and refers to static media files (as, for example, with LOGO), the HASH parameter SHOULD be included and MUST be the CESR-encoded value of the content at the URI. Alternatively, data URIs MAY be used. A URI that refers to mutable content SHOULD NOT be used, as it is insecure; if present, the credential is asserting only the location, not the content of the logo.", | ||
|
|
@@ -89,11 +144,7 @@ | |
| } | ||
| } | ||
| }, | ||
| "additionalProperties": true, | ||
| "required": [ | ||
| "i", | ||
| "dt" | ||
| ] | ||
| "additionalProperties": true | ||
| } | ||
| ] | ||
| }, | ||
|
|
@@ -104,34 +155,51 @@ | |
| "type": "string" | ||
| }, | ||
| { | ||
| "$id": "EGt3Q1rQJweeryWfJGBYlKCFsYbNrYGYc6AaTRBzwzHG", | ||
| "$id": "EFJV3CKaX9-_cbp7x1RWxhWQrlbo-Qe6r4HL2gUeTvx7", | ||
| "description": "Edges detail", | ||
| "type": "object", | ||
| "required": [ | ||
| "d", | ||
| "issuer" | ||
| "d" | ||
| ], | ||
| "properties": { | ||
| "d": { | ||
| "description": "Edges block SAID", | ||
| "type": "string" | ||
| "description": "SAID of the edges block (Blake3-256 digest in CESR compact encoding).", | ||
| "type": "string", | ||
| "pattern": "^E[A-Za-z0-9_-]{43}$", | ||
| "examples": [ | ||
| "EGt3Q1rQJweeryWfJGBYlKCFsYbNrYGYc6AaTRBzwzHG" | ||
| ] | ||
| }, | ||
| "issuer": { | ||
| "description": "Edge credential that proves the identity of the issuer.", | ||
| "type": "object", | ||
| "properties": { | ||
| "n": { | ||
| "description": "SAID of a credential that proves the identity of the issuer", | ||
| "type": "string" | ||
| "description": "SAID of a credential that proves the identity of the issuer.", | ||
| "type": "string", | ||
| "pattern": "^E[A-Za-z0-9_-]{43}$", | ||
| "examples": [ | ||
| "EBwNam2e0mYdTx0i9xv78AIm16g1XCkQO8f8yJXaxmJC" | ||
| ] | ||
| }, | ||
| "s": { | ||
| "description": "SAID of credential schema that proves the identity of the issuer", | ||
| "type": "string" | ||
| "description": "SAID of the schema that the issuer identity credential must satisfy.", | ||
| "type": "string", | ||
| "pattern": "^E[A-Za-z0-9_-]{43}$", | ||
| "examples": [ | ||
| "ENPE4hUQ8Peu84tEcCni3koOQFOnBrDB0rg_at2NRhV9" | ||
| ] | ||
| }, | ||
| "o": { | ||
| "description": "Operator indicating issuer AID of this ACDC MUST be the Issuee AID of the node this Edge points to.", | ||
| "description": "Edge operator. I2I: issuer AID must be the issuee AID of the far node. NI2I: no such requirement. DI2I: delegated issuer AID must be issuee AID of the far node. NOT: inverts the validity of the edge.", | ||
| "type": "string", | ||
| "const": "I2I" | ||
| "default": "I2I", | ||
| "enum": [ | ||
| "I2I", | ||
| "NI2I", | ||
| "DI2I", | ||
| "NOT" | ||
| ] | ||
| } | ||
|
Arsh-Sandhu marked this conversation as resolved.
|
||
| }, | ||
| "additionalProperties": false, | ||
|
|
@@ -142,21 +210,35 @@ | |
| ] | ||
| }, | ||
| "brandauth": { | ||
| "description": "Edge credential that proves the brand authority.", | ||
| "description": "Edge credential that proves the brand authority (e.g., a trademark registration or license agreement).", | ||
| "type": "object", | ||
| "properties": { | ||
| "n": { | ||
| "description": "SAID of a credential that proves the brand authority", | ||
| "type": "string" | ||
| "description": "SAID of a credential that proves the brand authority.", | ||
| "type": "string", | ||
| "pattern": "^E[A-Za-z0-9_-]{43}$", | ||
| "examples": [ | ||
| "EBwNam2e0mYdTx0i9xv78AIm16g1XCkQO8f8yJXaxmJC" | ||
| ] | ||
| }, | ||
| "s": { | ||
| "description": "SAID of credential schema that proves the brand authority", | ||
| "type": "string" | ||
| "description": "SAID of the schema that the brand authority credential must satisfy.", | ||
| "type": "string", | ||
| "pattern": "^E[A-Za-z0-9_-]{43}$", | ||
| "examples": [ | ||
| "EAoRVmgPyacjhUxaV0nPwiuUuHMjKDpNZrj7ClofZ-3Z" | ||
| ] | ||
|
Arsh-Sandhu marked this conversation as resolved.
Arsh-Sandhu marked this conversation as resolved.
|
||
| }, | ||
| "o": { | ||
| "description": "Operator indicating issuer AID of this ACDC MUST be the Issuee AID of the node this Edge points to.", | ||
| "description": "Edge operator. I2I: issuer AID must be the issuee AID of the far node. NI2I: no such requirement. DI2I: delegated issuer AID must be issuee AID of the far node. NOT: inverts the validity of the edge.", | ||
| "type": "string", | ||
| "const": "I2I" | ||
| "default": "I2I", | ||
| "enum": [ | ||
| "I2I", | ||
| "NI2I", | ||
| "DI2I", | ||
| "NOT" | ||
| ] | ||
| } | ||
| }, | ||
| "additionalProperties": false, | ||
|
|
@@ -167,40 +249,43 @@ | |
| ] | ||
| } | ||
| }, | ||
| "additionalProperties": false | ||
| "additionalProperties": true | ||
| } | ||
| ] | ||
| }, | ||
| "r": { | ||
| "oneOf": [ | ||
| { | ||
| "description": "Rules section SAID", | ||
| "type": "string" | ||
| "description": "SAID of rules block (Blake3-256 digest in CESR compact encoding)", | ||
| "type": "string", | ||
| "pattern": "^E[A-Za-z0-9_-]{43}$" | ||
| }, | ||
| { | ||
| "$id": "EGFgHT7Xrzy9YLdQNXnNTYVBu9_Q0O7K5A2VCWjg93t3", | ||
| "$id": "EBap4YrLFX2JOBZkCIbHiC2pi5xb5I90Plq3089vM9cx", | ||
| "description": "Rules detail", | ||
| "type": "object", | ||
| "properties": { | ||
| "d": { | ||
| "description": "Rule section SAID", | ||
| "type": "string" | ||
| "description": "SAID of the rules block (Blake3-256 digest in CESR compact encoding).", | ||
| "type": "string", | ||
| "pattern": "^E[A-Za-z0-9_-]{43}$" | ||
| }, | ||
| "governance": { | ||
| "description": "Statement identifying the governance framework under which this credential was issued.", | ||
| "type": "string", | ||
| "examples": [ | ||
| "Issued under governance published at https://provenant.net/governance/ovc-brand-owner/" | ||
| ] | ||
| } | ||
| }, | ||
| "additionalProperties": true, | ||
| "required": [ | ||
| "d" | ||
| "d", | ||
| "governance" | ||
| ] | ||
| } | ||
| ] | ||
| } | ||
| }, | ||
| "additionalProperties": false, | ||
| "required": [ | ||
| "i", | ||
| "ri", | ||
| "s", | ||
| "d", | ||
| "r" | ||
| ] | ||
| "additionalProperties": false | ||
| } | ||
Uh oh!
There was an error while loading. Please reload this page.