├── CODEOWNERS ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── LICENSE.md ├── README.md ├── common.js ├── index.html ├── terms.html └── w3c.json /CODEOWNERS: -------------------------------------------------------------------------------- 1 | # These owners will be the default owners for everything in 2 | # the repo. Unless a later match takes precedence, 3 | # they will be requested for review when someone opens a 4 | # pull request. 5 | * @msporny @dlongley @OR13 6 | 7 | # See CODEOWNERS syntax here: https://help.github.com/articles/about-codeowners/#codeowners-syntax 8 | -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Code of Conduct 2 | 3 | All documentation, code and communication under this repository are covered 4 | by the [W3C Code of Ethics and Professional Conduct](https://www.w3.org/Consortium/cepc/). 5 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Credentials Community Group 2 | 3 | Contributions to this repository are intended to become part of 4 | Recommendation-track documents governed by the 5 | [W3C Patent Policy](https://www.w3.org/Consortium/Patent-Policy-20040205/) and 6 | [Software and Document License](https://www.w3.org/Consortium/Legal/copyright-software). 7 | To make substantive contributions to specifications, you must either 8 | participate in the relevant W3C Working Group or make a non-member patent 9 | licensing commitment. 10 | 11 | If you are not the sole contributor to a contribution (pull request), please 12 | identify all contributors in the pull request comment. 13 | 14 | To add a contributor (other than yourself, that's automatic), mark them one 15 | per line as follows: 16 | 17 | ``` 18 | +@github_username 19 | ``` 20 | 21 | If you added a contributor by mistake, you can remove them in a comment with: 22 | 23 | ``` 24 | -@github_username 25 | ``` 26 | 27 | If you are making a pull request on behalf of someone else but you had no part 28 | in designing the feature, you can remove yourself with the above syntax. 29 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | All Reports in this Repository are licensed by Contributors under the [W3C Software and Document 2 | License](https://www.w3.org/Consortium/Legal/2015/copyright-software-and-document). 3 | 4 | Contributions to Specifications are made under the 5 | [W3C CLA](https://www.w3.org/community/about/agreements/cla/). 6 | 7 | Contributions to Software, including sample implementations, are under the 8 | [Apache 2.0 License](https://www.apache.org/licenses/LICENSE-2.0). 9 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## WebKMS Specification 2 | 3 | This specification describes a mechanism for performing remote cryptographic 4 | key operations including key creation, signing, encryption, and decryption. 5 | This technology is useful when securing communications using web-based, 6 | hardware backed cryptographic systems. 7 | 8 | We encourage contributions meeting the [Contribution 9 | Guidelines](CONTRIBUTING.md). While we prefer the creation of issues 10 | and Pull Requests in the GitHub repository, discussions often occur 11 | on the 12 | [public-credentials](http://lists.w3.org/Archives/Public/public-credentials/) 13 | mailing list as well. 14 | 15 | ### Other useful links 16 | * [Public group email archive](https://lists.w3.org/Archives/Public/public-credentials/) 17 | -------------------------------------------------------------------------------- /common.js: -------------------------------------------------------------------------------- 1 | /* globals omitTerms, respecConfig, $, require */ 2 | /* exported linkCrossReferences, restrictReferences, fixIncludes */ 3 | 4 | var ccg = { 5 | // Add as the respecConfig localBiblio variable 6 | // Extend or override global respec references 7 | localBiblio: { 8 | "REST": { 9 | title: "Architectural Styles and the Design of Network-based Software Architectures", 10 | date: "2000", 11 | href: "http://www.ics.uci.edu/~fielding/pubs/dissertation/", 12 | authors: [ 13 | "Fielding, Roy Thomas" 14 | ], 15 | publisher: "University of California, Irvine." 16 | }, 17 | "string-meta": { 18 | title: "Requirements for Language and Direction Metadata in Data Formats", 19 | href: "https://w3c.github.io/string-meta/", 20 | authors: [ 21 | "Addison Phillips", 22 | "Richard Ishida" 23 | ], 24 | status: "Editors-DRAFT", 25 | publisher: "Internationalization Working Group" 26 | }, 27 | "LD-PROOFS": { 28 | title: "Linked Data Proofs", 29 | href: "https://w3c-dvcg.github.io/ld-proofs/", 30 | authors: [ 31 | "Manu Sporny", 32 | "Dave Longley" 33 | ], 34 | status: "CG-DRAFT", 35 | publisher: "Digital Verification Community Group" 36 | }, 37 | "LD-SIGNATURES": { 38 | title: "Linked Data Signatures", 39 | href: "https://w3c-dvcg.github.io/ld-signatures/", 40 | authors: [ 41 | "Manu Sporny", 42 | "Dave Longley" 43 | ], 44 | status: "CG-DRAFT", 45 | publisher: "Digital Verification Community Group" 46 | }, 47 | "LDS-RSA2018": { 48 | title: "The 2018 RSA Linked Data Signature Suite", 49 | href: "https://w3c-dvcg.github.io/lds-rsa2018/", 50 | authors: [ 51 | "Manu Sporny", 52 | "Dave Longley" 53 | ], 54 | status: "CG-DRAFT", 55 | publisher: "Digital Verification Community Group" 56 | }, 57 | // aliases to known references 58 | "HTTP-SIGNATURES": { 59 | aliasOf: "http-signatures" 60 | }, 61 | 'HASHLINK': { 62 | title: 'Cryptographic Hyperlinks', 63 | href: 'https://tools.ietf.org/html/draft-sporny-hashlink', 64 | authors: ['Manu Sporny'], 65 | status: 'Internet-Draft', 66 | publisher: 'Internet Engineering Task Force (IETF)' 67 | }, 68 | 'IPFS': { 69 | title: 'InterPlanetary File System (IPFS)', 70 | href: 'https://en.wikipedia.org/wiki/InterPlanetary_File_System', 71 | publisher: 'Wikipedia' 72 | } 73 | } 74 | }; 75 | 76 | 77 | 78 | // We should be able to remove terms that are not actually 79 | // referenced from the common definitions 80 | // 81 | // the termlist is in a block of class "termlist", so make sure that 82 | // has an ID and put that ID into the termLists array so we can 83 | // interrogate all of the included termlists later. 84 | var termNames = [] ; 85 | var termLists = [] ; 86 | var termsReferencedByTerms = [] ; 87 | 88 | function restrictReferences(utils, content) { 89 | "use strict"; 90 | var base = document.createElement("div"); 91 | base.innerHTML = content; 92 | 93 | // New new logic: 94 | // 95 | // 1. build a list of all term-internal references 96 | // 2. When ready to process, for each reference INTO the terms, 97 | // remove any terms they reference from the termNames array too. 98 | $.each(base.querySelectorAll("dfn"), function(i, item) { 99 | var $t = $(item) ; 100 | var titles = $t.getDfnTitles(); 101 | var dropit = false; 102 | // do we have an omitTerms 103 | if (window.hasOwnProperty("omitTerms")) { 104 | // search for a match 105 | $.each(omitTerms, function(j, term) { 106 | if (titles.indexOf(term) !== -1) { 107 | dropit = true; 108 | } 109 | }); 110 | } 111 | // do we have an includeTerms 112 | if (window.hasOwnProperty("includeTerms")) { 113 | var found = false; 114 | // search for a match 115 | $.each(includeTerms, function(j, term) { 116 | if (titles.indexOf(term) !== -1) { 117 | found = true; 118 | } 119 | }); 120 | if (!found) { 121 | dropit = true; 122 | } 123 | } 124 | if (dropit) { 125 | $t.parent().next().remove(); 126 | $t.parent().remove(); 127 | } else { 128 | var n = $t.makeID("dfn", titles[0]); 129 | if (n) { 130 | termNames[n] = $t.parent() ; 131 | } 132 | } 133 | }); 134 | 135 | var $container = $(".termlist",base) ; 136 | var containerID = $container.makeID("", "terms") ; 137 | termLists.push(containerID) ; 138 | 139 | return (base.innerHTML); 140 | } 141 | // add a handler to come in after all the definitions are resolved 142 | // 143 | // New logic: If the reference is within a 'dl' element of 144 | // class 'termlist', and if the target of that reference is 145 | // also within a 'dl' element of class 'termlist', then 146 | // consider it an internal reference and ignore it. 147 | 148 | require(["core/pubsubhub"], function(respecEvents) { 149 | "use strict"; 150 | respecEvents.sub('end', function(message) { 151 | if (message === 'core/link-to-dfn') { 152 | // all definitions are linked; find any internal references 153 | $(".termlist a.internalDFN").each(function() { 154 | var $r = $(this); 155 | var id = $r.attr('href'); 156 | var idref = id.replace(/^#/,"") ; 157 | if (termNames[idref]) { 158 | // this is a reference to another term 159 | // what is the idref of THIS term? 160 | var $def = $r.closest('dd') ; 161 | if ($def.length) { 162 | var $p = $def.prev('dt').find('dfn') ; 163 | var tid = $p.attr('id') ; 164 | if (tid) { 165 | if (termsReferencedByTerms[tid]) { 166 | termsReferencedByTerms[tid].push(idref); 167 | } else { 168 | termsReferencedByTerms[tid] = [] ; 169 | termsReferencedByTerms[tid].push(idref); 170 | } 171 | } 172 | } 173 | } 174 | }) ; 175 | 176 | // clearRefs is recursive. Walk down the tree of 177 | // references to ensure that all references are resolved. 178 | var clearRefs = function(theTerm) { 179 | if ( termsReferencedByTerms[theTerm] ) { 180 | $.each(termsReferencedByTerms[theTerm], function(i, item) { 181 | if (termNames[item]) { 182 | delete termNames[item]; 183 | clearRefs(item); 184 | } 185 | }); 186 | } 187 | // make sure this term doesn't get removed 188 | if (termNames[theTerm]) { 189 | delete termNames[theTerm]; 190 | } 191 | }; 192 | 193 | // now termsReferencedByTerms has ALL terms that 194 | // reference other terms, and a list of the 195 | // terms that they reference 196 | $("a.internalDFN").each(function () { 197 | var $item = $(this) ; 198 | var t = $item.attr('href'); 199 | var r = t.replace(/^#/,"") ; 200 | // if the item is outside the term list 201 | if ( ! $item.closest('dl.termlist').length ) { 202 | clearRefs(r); 203 | } 204 | }); 205 | 206 | // delete any terms that were not referenced. 207 | /* 208 | Object.keys(termNames).forEach(function(term) { 209 | var $p = $("#"+term) ; 210 | if ($p) { 211 | var tList = $p.getDfnTitles(); 212 | $p.parent().next().remove(); 213 | $p.parent().remove() ; 214 | tList.forEach(function( item ) { 215 | console.log("CHECKING ITEM", item, respecConfig); 216 | if (respecConfig.definitionMap[item]) { 217 | delete respecConfig.definitionMap[item]; 218 | } 219 | }); 220 | } 221 | });*/ 222 | } 223 | }); 224 | }); 225 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | WebKMS v0.7 5 | 6 | 11 | 12 | 13 | 68 | 82 | 83 | 84 |
85 |

86 | Cryptographic authentication systems enable more secure interactions among 87 | machines, individuals, and organizations. These systems often use public-private 88 | key cryptography or encryption mechanisms to manage both cryptographic material 89 | and operations utilizing that material. This specification provides a common data 90 | model and interface for interacting with these systems enabling one to perform 91 | secure cryptographic operations on keypairs such as creating, wrapping, unwrapping, 92 | signing, encrypting, and decrypting. 93 |

94 |
95 | 96 |
97 | 106 | 107 |
108 | 109 |
110 |

Introduction

111 | 112 |

113 | Cryptographic authentication systems enable machines, individuals, and 114 | organizations to more securely interact with one another. These systems often 115 | use public-private key cryptography or encryption mechanisms in order to manage 116 | cryptographic material as well as operations utilizing that material. There are 117 | a variety of these sorts of cryptographic systems in use today, sometimes 118 | referred to as Key Management Systems. While many of these sorts of systems 119 | exist, there is no common interface for accessing and using these systems. 120 |

121 |

122 | The creation of a common interface for accessing Key Management Systems would 123 | enable software to be written once to interact with these systems such that 124 | systems with different implementations and properties could be switched 125 | without affecting the client software that utilizes such systems. A common API 126 | would shift the burden of interacting with each implementation to the vendors 127 | of those systems, while eliminating the burden for application developers. 128 |

129 |

130 | While there are a variety of proprietary enterprise grade Key Management Systems today 131 | that would benefit from a common interface, personal Key Management Systems 132 | such as those created through the Fast Identity Online (FIDO) initiative could 133 | also benefit. 134 |

135 |

136 | If the interface is provided as a Web-based interface, then Web-based 137 | applications could be written against such an API. Similarly, Web-based 138 | applications could provide choice in Key Management Systems -- potentially 139 | allowing customers to bring their own Key Management Systems with them just as 140 | they bring their own devices today. 141 |

142 | 143 |
144 |

Ecosystem Overview

145 | 146 |

147 | This section describes the roles of the core actors and the relationships 148 | between them in an ecosystem where this specification is expected 149 | to be useful. A role is an abstraction that might be implemented in many 150 | different ways. The separation of roles suggests likely interfaces and 151 | protocols for standardization. The following roles are introduced in this 152 | specification: 153 |

154 | 155 |
156 |
controller
157 |
158 | A role an entity might perform by demonstrating control of 159 | cryptographic key material in order to authenticate itself with a system. 160 |
161 |
key management client
162 |
163 | A role an entity might perform by communicating with a Key Management 164 | System. 165 |
166 |
key management system
167 |
168 | A role an entity might perform by providing an interface to 169 | the management of cryptographic material and the execution of cryptographic 170 | operations. 171 |
172 |
173 | 174 |
175 | 176 |
177 |

Use Cases and Requirements

178 | 179 |

180 | The following use cases outline a number of key scenarios that readers might 181 | find useful: 182 |

183 | 184 | 232 | 233 |

234 | As a result of documenting and analyzing the use cases, the following 235 | desirable ecosystem characteristics were identified for this specification: 236 |

237 | 238 | 260 |
261 | 262 |
263 |

264 | TBD 265 |

266 |
267 | 268 |
269 | 270 |
271 |

Terminology

272 | 273 |
274 |
275 |
276 | 277 |
278 |

Core Concepts

279 | 280 |

281 | There is a relatively small set of common cryptographic operations that Key 282 | Management Systems provide. These operations include: generate, wrap, unwrap, 283 | sign, verify, encrypt, and decrypt. These cryptographic operations can be 284 | thought of as functions that operate on objects, in this case 285 | cryptographic keys, in a remote execution environment. 286 |

287 |

288 | Ensure that the list is updated from 289 | here. 290 |

291 |

292 | The Authorization Capabilities for Linked Data [ZCAP-LD] specification, also 293 | know as ZCAPs, outlines how remote execution environments can be manipulated by 294 | demonstrating cryptographic control of functions and objects. 295 | The ZCAP-LD specification enables one to grant authority to remote clients to 296 | call functions on specific objects. This technology enables a Key Management 297 | System to provide a Web-based API that enables clients to create keys and 298 | execute cryptographic operations using those keys by invoking ZCAPs. 299 |

300 |

301 | The WebKMS API enables clients to create keystores, a type of object, 302 | that they control. That is, the client is the controller of the keystore. 303 | The client may also generate a key, another type of object, and 304 | associate it with a keystore. Each keystore is identified by a URI. In 305 | addition, the controller of a keystore can be changed to enable the transfer 306 | of keys without requiring the exfiltration of the key. Other entities can 307 | also be added as controllers of the keystore such that multiple parties might 308 | control the keystore without having access to the raw key material. 309 |

310 |

311 | Each key in the keystore has an associated set of functions according 312 | to the type of key that it is. Examples of key types include keys used for 313 | performing asymmetric cryptographic operations such as digital signatures and 314 | keys used for performing symmetric cryptographic operations such as 315 | encryption and decryption. These functions can be remotely executed 316 | via the use of ZCAPs such that the cryptographic key material never 317 | needs to be exfiltrated in order to use the key. In many hardware-backed 318 | cryptographic key management systems, the exfiltration of keys is not 319 | supported and the system itself is hardened against tampering with the 320 | intent to exfiltrate the keys. 321 |

322 |

323 | In order to execute a function on a key, a KmsOperation 324 | of a specific type can be applied to the key, including a ZCAP that 325 | invokes the capability that demonstrates the authorization to perform the 326 | operation. For example, a KmsOperation might be constructed and POSTed to 327 | the key URL with an invocation of a ZCAP performed via HTTP Signatures. 328 |

329 | 330 |
331 | 332 |
333 |

HTTP API

334 | 335 |
336 |
generateKey(options)<map>
337 |
338 |

Generates a new cryptographic key in the keystore.

339 |
340 |
getKeyDescription(options)<map>
341 |
342 |

Gets the key description for the given key ID.

343 |
344 |
revokeCapability(options)<map>
345 |
346 |

Store a capability revocation.

347 |
348 |
wrapKey(options)<string>
349 |
350 |

Wraps a cryptographic key using a key encryption key (KEK).

351 |
352 |
unwrapKey(options)<(Uint8Array|null)>
353 |
354 |

Unwraps a cryptographic key using a key encryption key (KEK).

355 |
356 |
sign(options)<string>
357 |
358 |

Signs some data. Note that the data will be sent to the server, so if 359 | this data is intended to be secret it should be hashed first. However, 360 | hashing the data first may present interoperability issues so choose 361 | wisely. 362 |

363 |
364 |
verify(options)<boolean>
365 |
366 |

Verifies some data. Note that the data will be sent to the server, so if 367 | this data is intended to be secret it should be hashed first. However, 368 | hashing the data first may present interoperability issues so choose 369 | wisely. 370 |

371 |
372 |
deriveSecret(options)<Uint8Array>
373 |
374 |

Derives a shared secret via the given peer public key, typically for use 375 | as one parameter for computing a shared key. It should not be used as 376 | a shared key itself, but rather input into a key derivation function (KDF) 377 | to produce a shared key. 378 |

379 |
380 |
enableCapability(options)<map>
381 |
382 |

Stores a delegated authorization capability, enabling it to be invoked by 383 | its designated invoker. 384 |

385 |
386 |
disableCapability(options)<boolean>
387 |
388 |

Removes a previously stored delegated authorization capability, preventing 389 | it from being invoked by its designated invoker. 390 |

391 |
392 |
createKeystore(options)<map>
393 |
394 |

Creates a new keystore using the given configuration.

395 |
396 |
getKeystore(options)<map>
397 |
398 |

Gets the configuration for a keystore by its ID.

399 |
400 |
findKeystore(options)<map>
401 |
402 |

Finds the configuration for a keystore by its controller and reference ID.

403 |
404 |
405 | 406 |

generateKey(options) ⇒ <map>

407 |

Generates a new cryptographic key in the keystore.

408 |

Response: HTTP 200 - <map> - The key description for the key.

409 | 410 | 411 | 412 | 413 | 414 | 415 | 416 | 417 | 418 | 419 | 420 | 421 | 422 | 423 | 424 | 425 | 426 | 427 | 428 | 429 | 430 | 431 | 432 | 433 | 434 | 435 | 436 | 437 | 438 | 439 |
ParamTypeDescription
options.kmsModulestringThe KMS module to use.
options.typestringThe key type (e.g. 'AesKeyWrappingKey2019').
[options.capability]stringThe zCAP-LD authorization capability to use to authorize the invocation of this operation.
options.invocationSignermapAn API with an id property and a sign function for signing a capability invocation.
440 |

441 |

getKeyDescription(options) ⇒ <map>

442 |

Gets the key description for the given key ID.

443 |

Response: HTTP 200 - <map> - The key description.

444 | 445 | 446 | 447 | 448 | 449 | 450 | 451 | 452 | 453 | 454 | 455 | 456 | 457 | 458 | 459 | 460 | 461 | 462 | 463 | 464 | 465 | 466 | 467 | 468 | 469 |
ParamTypeDescription
[options.keyId]stringThe ID of the key.
[options.capability]stringThe zCAP-LD authorization capability to use to authorize the invocation of this operation.
options.invocationSignermapAn API with an id property and a sign function for signing a capability invocation.
470 |

471 |

revokeCapability(options) ⇒ <map>

472 |

Store a capability revocation.

473 |

Response: HTTP 200 - <map> - Resolves once the operation completes.

474 | 475 | 476 | 477 | 478 | 479 | 480 | 481 | 482 | 483 | 484 | 485 | 486 | 487 | 488 | 489 | 490 | 491 | 492 | 493 | 494 | 495 | 496 | 497 | 498 | 499 |
ParamTypeDescription
options.capabilityToRevokemapThe capability to enable.
[options.capability]stringThe zcap authorization capability to use to authorize the invocation of this operation.
options.invocationSignermapAn API with an id property and a sign function for signing a capability invocation.
500 |

501 |

wrapKey(options) ⇒ <string>

502 |

Wraps a cryptographic key using a key encryption key (KEK).

503 |

Response: HTTP 200 - <string> - The base64url-encoded wrapped key bytes.

504 | 505 | 506 | 507 | 508 | 509 | 510 | 511 | 512 | 513 | 514 | 515 | 516 | 517 | 518 | 519 | 520 | 521 | 522 | 523 | 524 | 525 | 526 | 527 | 528 | 529 | 530 | 531 | 532 | 533 | 534 |
ParamTypeDescription
options.kekIdstringThe ID of the wrapping key to use.
options.unwrappedKeyUint8ArrayThe unwrapped key material as a Uint8Array.
[options.capability]stringThe zCAP-LD authorization capability to use to authorize the invocation of this operation.
options.invocationSignermapAn API with an id property and a sign function for signing a capability invocation.
535 |

536 |

unwrapKey(options) ⇒ <(Uint8Array|null)>

537 |

Unwraps a cryptographic key using a key encryption key (KEK).

538 |

Response: HTTP 200 - <(Uint8Array|null)> - Resolves to the unwrapped key material 539 | or null if the unwrapping failed because the key did not match. 540 |

541 | 542 | 543 | 544 | 545 | 546 | 547 | 548 | 549 | 550 | 551 | 552 | 553 | 554 | 555 | 556 | 557 | 558 | 559 | 560 | 561 | 562 | 563 | 564 | 565 | 566 | 567 | 568 | 569 | 570 | 571 |
ParamTypeDescription
options.kekIdstringThe ID of the unwrapping key to use.
options.wrappedKeystringThe wrapped key material as a base64url-encoded string.
[options.capability]stringThe zCAP-LD authorization capability to use to authorize the invocation of this operation.
options.invocationSignermapAn API with an id property and a sign function for signing a capability invocation.
572 |

573 |

sign(options) ⇒ <string>

574 |

Signs some data. Note that the data will be sent to the server, so if 575 | this data is intended to be secret it should be hashed first. However, 576 | hashing the data first may present interoperability issues so choose 577 | wisely. 578 |

579 |

Response: HTTP 200 - <string> - The base64url-encoded signature.

580 | 581 | 582 | 583 | 584 | 585 | 586 | 587 | 588 | 589 | 590 | 591 | 592 | 593 | 594 | 595 | 596 | 597 | 598 | 599 | 600 | 601 | 602 | 603 | 604 | 605 | 606 | 607 | 608 | 609 | 610 |
ParamTypeDescription
options.keyIdstringThe ID of the signing key to use.
options.dataUint8ArrayThe data to sign as a Uint8Array.
[options.capability]stringThe zCAP-LD authorization capability to use to authorize the invocation of this operation.
options.invocationSignermapAn API with an id property and a sign function for signing a capability invocation.
611 |

612 |

verify(options) ⇒ <boolean>

613 |

Verifies some data. Note that the data will be sent to the server, so if 614 | this data is intended to be secret it should be hashed first. However, 615 | hashing the data first may present interoperability issues so choose 616 | wisely. 617 |

618 |

Response: HTTP 200 - <boolean> - true if verified, false if not.

619 | 620 | 621 | 622 | 623 | 624 | 625 | 626 | 627 | 628 | 629 | 630 | 631 | 632 | 633 | 634 | 635 | 636 | 637 | 638 | 639 | 640 | 641 | 642 | 643 | 644 | 645 | 646 | 647 | 648 | 649 | 650 | 651 | 652 | 653 | 654 |
ParamTypeDescription
options.keyIdstringThe ID of the signing key to use.
options.dataUint8ArrayThe data to verify as a Uint8Array.
options.signaturestringThe base64url-encoded signature to verify.
[options.capability]stringThe zCAP-LD authorization capability to use to authorize the invocation of this operation.
options.invocationSignermapAn API with an id property and a sign function for signing a capability invocation.
655 |

656 |

deriveSecret(options) ⇒ <Uint8Array>

657 |

Derives a shared secret via the given peer public key, typically for use 658 | as one parameter for computing a shared key. It should not be used as 659 | a shared key itself, but rather input into a key derivation function (KDF) 660 | to produce a shared key. 661 |

662 |

Response: HTTP 200 - <Uint8Array> - The shared secret bytes.

663 | 664 | 665 | 666 | 667 | 668 | 669 | 670 | 671 | 672 | 673 | 674 | 675 | 676 | 677 | 678 | 679 | 680 | 681 | 682 | 683 | 684 | 685 | 686 | 687 | 688 | 689 | 690 | 691 | 692 | 693 |
ParamTypeDescription
options.keyIdstringThe ID of the key agreement key to use.
options.publicKeymapThe public key to compute the shared secret against; the public key type must match the key agreement key's type.
[options.capability]stringThe zCAP-LD authorization capability to use to authorize the invocation of this operation.
options.invocationSignermapAn API with an id property and a sign function for signing a capability invocation.
694 |

695 |

enableCapability(options) ⇒ <map>

696 |

Stores a delegated authorization capability, enabling it to be invoked by 697 | its designated invoker. 698 |

699 |

Response: HTTP 200 - <map> - Resolves once the operation completes.

700 | 701 | 702 | 703 | 704 | 705 | 706 | 707 | 708 | 709 | 710 | 711 | 712 | 713 | 714 | 715 | 716 | 717 | 718 | 719 | 720 | 721 | 722 | 723 | 724 | 725 |
ParamTypeDescription
options.capabilityToEnablemapThe capability to enable.
[options.capability]stringThe zCAP-LD authorization capability to use to authorize the invocation of this operation.
options.invocationSignermapAn API with an id property and a sign function for signing a capability invocation.
726 |

727 |

disableCapability(options) ⇒ <boolean>

728 |

Removes a previously stored delegated authorization capability, preventing 729 | it from being invoked by its designated invoker. 730 |

731 |

Response: HTTP 200 - <boolean> - Resolves to true if the document was deleted 732 | and false if it did not exist. 733 |

734 | 735 | 736 | 737 | 738 | 739 | 740 | 741 | 742 | 743 | 744 | 745 | 746 | 747 | 748 | 749 | 750 | 751 | 752 | 753 | 754 | 755 | 756 | 757 | 758 | 759 |
ParamTypeDescription
options.idmapThe ID of the capability to revoke.
[options.capability]stringThe zCAP-LD authorization capability to use to authorize the invocation of this operation.
options.invocationSignermapAn API with an id property and a sign function for signing a capability invocation.
760 |

761 |

createKeystore(options) ⇒ <map>

762 |

Creates a new keystore using the given configuration.

763 |

Response: HTTP 200 - <map> - Resolves to the configuration for the newly 764 | created keystore. 765 |

766 | 767 | 768 | 769 | 770 | 771 | 772 | 773 | 774 | 775 | 776 | 777 | 778 | 779 | 780 | 781 | 782 | 783 | 784 | 785 | 786 |
ParamTypeDescription
options.urlstringThe url to post the configuration to.
options.configstringThe keystore's configuration.
787 |

788 |

getKeystore(options) ⇒ <map>

789 |

Gets the configuration for a keystore by its ID.

790 |

Response: HTTP 200 - <map> - Resolves to the configuration for the keystore.

791 | 792 | 793 | 794 | 795 | 796 | 797 | 798 | 799 | 800 | 801 | 802 | 803 | 804 | 805 | 806 |
ParamTypeDescription
options.idstringThe keystore's ID.
807 |

808 |

findKeystore(options) ⇒ <map>

809 |

Finds the configuration for a keystore by its controller and reference ID.

810 |

Response: HTTP 200 - <map> - Resolves to the configuration for the keystore.

811 | 812 | 813 | 814 | 815 | 816 | 817 | 818 | 819 | 820 | 821 | 822 | 823 | 824 | 825 | 826 | 827 | 828 | 829 | 830 | 831 | 832 | 833 | 834 | 835 | 836 |
ParamTypeDescription
[options.url]stringThe url to query.
options.controllerstringThe keystore's controller.
options.referenceIdstringThe keystore's reference ID.
837 | 838 |
839 |
840 | 841 |
842 |

Privacy Considerations

843 | 844 |

845 | This section details the general privacy considerations and specific privacy 846 | implications of deploying this specification into production environments. 847 |

848 | 849 |
850 | 851 |
852 |

Security Considerations

853 | 854 |

855 | There are a number of security considerations that implementers should be 856 | aware of when processing data described by this specification. Ignoring or 857 | not understanding the implications of this section can result in 858 | security vulnerabilities. 859 |

860 | 861 |

862 | While this section attempts to highlight a broad set of security 863 | considerations, it is not a complete list. Implementers are urged to seek the 864 | advice of security and cryptography professionals when implementing mission 865 | critical systems using the technology outlined in this specification. 866 |

867 | 868 |
869 | 870 |
871 |

Accessibility Considerations

872 | 873 |

874 | There are a number of accessibility considerations implementers should be 875 | aware of when processing data described in this specification. As with any web 876 | standards or protocols implementation, ignoring accessibility issues makes 877 | this information unusable to a large subset of the population. It is important 878 | to follow accessibility guidelines and standards, such as [[WCAG21]], to ensure 879 | all people, regardless of ability, can make use of this data. This is 880 | especially important when establishing systems utilizing cryptography, which 881 | have historically created problems for assistive technologies. 882 |

883 | 884 |

885 | This section details the general accessibility considerations to take into 886 | account when utilizing this data model. 887 |

888 | 889 |
890 | 891 |
892 |

Internationalization Considerations

893 | 894 |

895 | There are a number of internationalization considerations implementers should be 896 | aware of when publishing data described in this specification. As with any web 897 | standards or protocols implementation, ignoring internationalization makes it 898 | difficult for data to be produced and consumed across a disparate set of 899 | languages and societies, which would limit the applicability of the 900 | specification and significantly diminish its value as a standard. 901 |

902 | 903 |

904 | This section outlines general internationalization considerations to take into 905 | account when utilizing this data model. 906 |

907 | 908 |
909 | 910 | 911 | 912 | -------------------------------------------------------------------------------- /terms.html: -------------------------------------------------------------------------------- 1 |

2 | The following terms are used to describe concepts in this specification. 3 |

4 | 5 |
6 |
entity
7 |
8 | A thing with distinct and independent existence, such as a person, 9 | organization, or device that performs one or more roles in the ecosystem. 10 |
11 |
user agent
12 |
13 | A program, such as a browser or other Web client, that mediates the 14 | communication between the various roles in this specification. 15 |
16 |
URI
17 |
18 | An identifier as defined by [[RFC3986]]. 19 |
20 |
21 | -------------------------------------------------------------------------------- /w3c.json: -------------------------------------------------------------------------------- 1 | { 2 | "group": [ 3 | "credentials" 4 | ], 5 | "contacts": [ 6 | "msporny", "dlongley" 7 | ], 8 | "shortName": "data-hubs", 9 | "repo-type": "cg-report" 10 | } 11 | --------------------------------------------------------------------------------