The World Wide Web is frequently referred to as a "public square", into which anyone can publish. Vast numbers of websites, small and large, publish content daily, and massive, powerful corporations have arisen to make that content discoverable.
PSQR Decentralized Identifiers (DIDs) represent the public brands of digital publishers, the identity of authors, or psuedonymous publishing identities. The keys within them are used to attach cryptographic signatures to content for distribution to platforms that maintain newsfeeds, search indexes or curated sets while preserving verifiable provenance of that content.
PSQR presents a simplified structure to meet this limited need while enabling tight integration with content management systems. The exemplary implementation is a WordPress plugin that puts PSQR DIDs within the reach of hundreds of millions of existing WordPress powered websites.
This document describes a namespace to segregate ongoing development of the simple capabilities referenced in the Abstract and to provide stability for production deployment of these capabilities across the web.
The PSQR element described below is not complete, and additions are expected. As implementation of the PSQR method becomes common, additional public data needs will assuredly arise.
It is anticipated that some elements of the PSQR namespace and method may eventually be incorporated into other DID methods or the DID core specification.
This section is non-normative.
Digital publishing has become readily available to individuals, organizations, and corporations globally. Content management systems generally, and WordPress specifically, have made launching a website and publishing content on that website easily possible. WordPress alone powers more than a third of domains on the web today, including sites published by entities ranging from individuals to very large corporations.
As a matter of necessity, content management systems have established human readable profile pages for authors and pages to describe the site itself. PSQR recognizes this as de-facto identity infrastructure and extends it with DIDs to enable content provenance so that the millions of articles published on WordPress websites each day can be made portable with verifiable provenance.
This section is non-normative.
The terminology used by the DID core specification is adopted.
PSQR identities are referenced by domain or by the path to the user profile:
did:psqr:{domain}did:psqr:{domain/path}
Public keys within the psqr.keys element are referenced individually
by KID:
did:psqr:{psqr-method-specific-identifier}#{keyID}The data model in section 4 of the DID core specification is adopted. PSQR extends this model as described in section 5.2.
PSQR DIDs require only the id element from DID core and a
psqr extension element. Optional elements from DID core remain
optional, together with core functionality they enable.
| Property | Required? | Value constraints |
|---|---|---|
id |
yes | A string that conforms to the rules in DID Syntax. |
psqr |
yes | A map containing the elements described in section 5.1. |
The following table describes PSQR properties that faciliate distribution of content with verifiable cryptographic provenance.
| Property | Required? | Value constraints |
|---|---|---|
publicIdentity |
yes | A map containing the elements described in section 5.2. |
publicKeys |
yes | A array containing the elements described in section 5.3. |
permissions |
yes | A array containing the elements described in section 5.4. |
updated |
no | An integer representing the milliseconds since the epoch at the last update. |
The publicIdentity element contains human readable information to
represent as the subject of a PSQR DID. This information will appear as the
verified source of content.
| Property | Required? | Value constraints |
|---|---|---|
name |
yes | A string containing the name of the publisher. |
tagline |
no | A string containing a tagline or motto used by the publisher. |
image |
no | A URL pointing to a logo or image of the publisher. |
url |
no | A URL pointing to a website or profile page of the publisher. |
description |
no | A string describing the publisher. |
bio |
no | A string containing biographical information for a human publisher. |
Each element of the publicKey array is a JWK containing an ES384
Ellyptical Curve key of length 384. These JWKs MUST NOT contain private key
information (the d element is not allowed).
PSQR exclusively uses ECDSA-P384 for signature generation. EC P-384 keys have been selected as the greatest common denominator among modern web browser cryptographic suites. These keys are recommended by the NSA in the Commercial National Security Algorithm Suite.
Each element of the permissions array contains a kid of
a JWK in the publicKeys array, an array of permission roles, and an
optional map indicating the platform granting permission and the assets to which
that permision applies.
Professional publishers will use a variety of keys for different purposes. A
common use case involves automated publishing using keys with only publish
and provenance grants that can be overridden by manually operated
clients with greater permissions.
| Property | Required? | Value constraints |
|---|---|---|
kid |
yes | A string containing a key ID that appears in publicKeys. |
grant |
yes | An array of strings enumerated in section 5.4.1. |
PSQR clients will operate on multiple platforms and have various permissions to various assets on those platforms.
| Property | Value | Indicates |
|---|---|---|
grant |
publish | This key publishes content. |
grant |
provenance | This key signs content for future reader validation. |
grant |
curate | This key deletes content. (Used for manual override of automated publishing.) |
grant |
list | This key manages lists. |
grant |
admin | This key is intended to exert administrative control. |
PSQR DIDs are simple JSON, but include JSON-LD context. They may be stored as static files with the .json filename extension, and the IANA media type is application/json.
{
"@context": [
"https://www.w3.org/ns/did/v1",
"https://vpsqr.com/ns/did-psqr/v1"
],
...
}
Despite the inclusion of JSON-LD context, no JSON-LD processing is required at for the moment.
PSQR DIDs are resolved exclusively via did:psqr. Resolution is coded directly into PSQR applications to enable immediate production deployment.
To preserve interoperability with existing content management solutions, specifically WordPress, PSQR DIDs support only did:psqr.
did:psqr shares elements with did:web, but is simplified
for the limited PSQR use case and extended to support existing human-readable
author identity URLs.
This section is non-normative.
Security is provided by the website hosting the identities. Creation, update, and delete functions are out of band and rely on the content management system or website administrator for security. Read security is provided by the SSL implemented to secure the website itself.
This section is non-normative.
PSQR is explicitly public, and there is no expectation of privacy regarding content that is posted to any public square.
To minimize third party tracking of identity and content access, publishers are encouraged to host their own sites on their own infrastructure, including CDN. Realistically, many websites take advantage of free or low cost CDN services, leaving tracking data in the hands of the CDN provider. If this is the case, it must be recognized that tracking data has been exposed at the point that SSL connections are terminated (typically at the CDN edge servers).
This section is non-normative.
The example below describes publisher with different roles for publishing, curation, and administration.
The key values are not genuine.
{
"@context": [
"https://www.w3id.org/did/v1",
"https://vpsqr.com/ns/did-psqr/v1"
],
"id": "did:psqr:acme-publishing.com",
"psqr": {
"@id": "https://vpsqr.com/ns/did-psqr/v1#psqr",
"publicIdentity": {
"name": "Acme Publishing",
"tagline": "All the Best",
"image": "https://www.acme-publishing/assets/logo-180x180.png",
"url": "https://www.acme-publishing.com"
},
"publicKeys": [
{
"kid": "did:psqr:acme-publishing.com#publish",
"kty": "EC", "crv": "P-384", "alg": "ES384",
"x": "3v5...muQ",
"y": "X4w...3Z1"
},
{
"kid": "did:psqr:acme-publishing.com#curate",
"kty": "EC", "crv": "P-384", "alg": "ES384",
"x": "am2...z31",
"y": "v22...Fg3"
},
{
"kid": "did:psqr:acme-publishing.com#admin",
"kty": "EC", "crv": "P-384", "alg": "ES384",
"x": "apK...Yyo",
"y": "aJm...qChs"
}
],
"permissions": [
{
"kid": "did:psqr:acme-publishing.com#publish",
"grant": [ "publish", "provenance" ],
},
{
"kid": "did:psqr:acme-publishing.com#curate",
"grant": [ "list", "curate" ],
},
{
"kid": "did:psqr:acme-publishing.com#admin",
"grant": [ "admin" ],
}
],
"updated": 1640713069290
}
}