/*
Copyright (C) 2023 Yarmo Mackenbach
This program is free software: you can redistribute it and/or modify it under
the terms of the GNU Affero General Public License as published by the Free
Software Foundation, either version 3 of the License, or (at your option)
any later version.
This program is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
details.
You should have received a copy of the GNU Affero General Public License along
with this program. If not, see .
Also add information on how to contact you by electronic and paper mail.
If your software can interact with users remotely through a computer network,
you should also make sure that it provides a way for users to get its source.
For example, if your program is a web application, its interface could display
a "Source" link that leads users to an archive of the code. There are many
ways you could offer source, and different solutions will be better for different
programs; see section 13 for the specific requirements.
You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary. For
more information on this, and how to apply and follow the GNU AGPL, see .
*/
export const profileSchema = {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://spec.keyoxide.org/2/profile.schema.json",
"title": "Profile",
"description": "Keyoxide profile with personas",
"type": "object",
"properties": {
"profileVersion": {
"description": "The version of the profile",
"type": "integer"
},
"profileType": {
"description": "The type of the profile [openpgp, asp]",
"type": "string"
},
"identifier": {
"description": "Identifier of the profile (email, fingerprint, URI)",
"type": "string"
},
"personas": {
"description": "The personas inside the profile",
"type": "array",
"items": {
"$ref": "https://spec.keyoxide.org/2/persona.schema.json"
},
"minItems": 1,
"uniqueItems": true
},
"primaryPersonaIndex": {
"description": "The index of the primary persona",
"type": "integer"
},
"publicKey": {
"description": "The cryptographic key associated with the profile",
"type": "object",
"properties": {
"keyType": {
"description": "The type of cryptographic key [eddsa, es256, openpgp, none]",
"type": "string"
},
"encoding": {
"description": "The encoding of the cryptographic key [pem, jwk, armored_pgp, none]",
"type": "string"
},
"encodedKey": {
"description": "The encoded cryptographic key (PEM, stringified JWK, ...)",
"type": ["string", "null"]
},
"fetch": {
"description": "Details on how to fetch the public key",
"type": "object",
"properties": {
"method": {
"description": "The method to fetch the key [aspe, hkp, wkd, http, none]",
"type": "string"
},
"query": {
"description": "The query to fetch the key",
"type": ["string", "null"]
},
"resolvedUrl": {
"description": "The URL the method eventually resolved to",
"type": ["string", "null"]
}
}
}
},
"required": [
"keyType",
"fetch"
]
},
"verifiers": {
"description": "A list of links to verifiers",
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"description": "Name of the verifier site",
"type": "string"
},
"url": {
"description": "URL to the profile page on the verifier site",
"type": "string"
}
}
},
"uniqueItems": true
}
},
"required": [
"profileVersion",
"profileType",
"identifier",
"personas",
"primaryPersonaIndex",
"publicKey",
"verifiers"
],
"additionalProperties": false
}
export const personaSchema = {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://spec.keyoxide.org/2/persona.schema.json",
"title": "Profile",
"description": "Keyoxide persona with identity claims",
"type": "object",
"properties": {
"identifier": {
"description": "Identifier of the persona",
"type": ["string", "null"]
},
"name": {
"description": "Name of the persona",
"type": "string"
},
"email": {
"description": "Email address of the persona",
"type": ["string", "null"]
},
"description": {
"description": "Description of the persona",
"type": ["string", "null"]
},
"avatarUrl": {
"description": "URL to an avatar image",
"type": ["string", "null"]
},
"isRevoked": {
"type": "boolean"
},
"claims": {
"description": "A list of identity claims",
"type": "array",
"items": {
"$ref": "https://spec.keyoxide.org/2/claim.schema.json"
},
"uniqueItems": true
}
},
"required": [
"name",
"claims"
],
"additionalProperties": false
}
export const claimSchema = {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://spec.keyoxide.org/2/claim.schema.json",
"title": "Identity claim",
"description": "Verifiable online identity claim",
"type": "object",
"properties": {
"claimVersion": {
"description": "The version of the claim",
"type": "integer"
},
"uri": {
"description": "The claim URI",
"type": "string"
},
"proofs": {
"description": "The proofs that would verify the claim",
"type": "array",
"items": {
"type": "string"
},
"minItems": 1,
"uniqueItems": true
},
"matches": {
"description": "Service providers matched to the claim",
"type": "array",
"items": {
"$ref": "https://spec.keyoxide.org/2/serviceprovider.schema.json"
},
"uniqueItems": true
},
"status": {
"type": "integer",
"description": "Claim status code"
},
"display": {
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "Account name to display in the user interface"
},
"url": {
"type": ["string", "null"],
"description": "URL to link to in the user interface"
},
"serviceProviderName": {
"type": ["string", "null"],
"description": "Name of the service provider to display in the user interface"
}
}
}
},
"required": [
"claimVersion",
"uri",
"proofs",
"status",
"display"
],
"additionalProperties": false
}
export const serviceProviderSchema = {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://spec.keyoxide.org/2/serviceprovider.schema.json",
"title": "Service provider",
"description": "A service provider that can be matched to identity claims",
"type": "object",
"properties": {
"about": {
"description": "Details about the service provider",
"type": "object",
"properties": {
"name": {
"description": "Full name of the service provider",
"type": "string"
},
"id": {
"description": "Identifier of the service provider (no whitespace or symbols, lowercase)",
"type": "string"
},
"homepage": {
"description": "URL to the homepage of the service provider",
"type": ["string", "null"]
}
}
},
"profile": {
"description": "What the profile would look like if the match is correct",
"type": "object",
"properties": {
"display": {
"description": "Profile name to be displayed",
"type": "string"
},
"uri": {
"description": "URI or URL for public access to the profile",
"type": "string"
},
"qr": {
"description": "URI or URL associated with the profile usually served as a QR code",
"type": ["string", "null"]
}
}
},
"claim": {
"description": "Details from the claim matching process",
"type": "object",
"properties": {
"uriRegularExpression": {
"description": "Regular expression used to parse the URI",
"type": "string"
},
"uriIsAmbiguous": {
"description": "Whether this match automatically excludes other matches",
"type": "boolean"
}
}
},
"proof": {
"description": "Information for the proof verification process",
"type": "object",
"properties": {
"request": {
"description": "Details to request the potential proof",
"type": "object",
"properties": {
"uri": {
"description": "Location of the proof",
"type": ["string", "null"]
},
"accessRestriction": {
"description": "Type of access restriction [none, nocors, granted, server]",
"type": "string"
},
"fetcher": {
"description": "Name of the fetcher to use",
"type": "string"
},
"data": {
"description": "Data needed by the fetcher or proxy to request the proof",
"type": "object",
"additionalProperties": true
}
}
},
"response": {
"description": "Details about the expected response",
"type": "object",
"properties": {
"format": {
"description": "Expected format of the proof [text, json]",
"type": "string"
},
}
},
"target": {
"description": "Details about the target located in the response",
"type": "array",
"items": {
"type": "object",
"properties": {
"format": {
"description": "How is the proof formatted [uri, fingerprint]",
"type": "string"
},
"encoding": {
"description": "How is the proof encoded [plain, html, xml]",
"type": "string"
},
"relation": {
"description": "How are the response and the target related [contains, equals]",
"type": "string"
},
"path": {
"description": "Path to the target location if the response is JSON",
"type": "array",
"items": {
"type": "string"
}
}
}
}
}
}
}
},
"required": [
"about",
"profile",
"claim",
"proof"
],
"additionalProperties": false
}