@dotrino/identity 0.54.1 → 0.55.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dotrino/identity",
3
- "version": "0.54.1",
3
+ "version": "0.55.0",
4
4
  "description": "Identidad y rating de usuarios compartidos entre apps de Dotrino (vault iframe + postMessage)",
5
5
  "type": "module",
6
6
  "main": "src/index.js",
package/src/node.js CHANGED
@@ -170,6 +170,20 @@ export class Identity {
170
170
  // Acta de perfil (qué llaves son del perfil y qué puede cada una; ver acta-de-perfil.md)
171
171
  profileActa () { return this._h('profileActa') }
172
172
  profileMembers () { return this._h('profileMembers') }
173
+ /**
174
+ * Quien SELLA SOBRES (la bóveda) registra aquí cómo estrenar su llave de sellado: se
175
+ * llama al sellar cada acta, porque esa llave rota con el acta (§8.9 de
176
+ * `dotrino-vault/docs/secretos-sellados.md`). Va por aquí y no por el iframe porque
177
+ * este puente es en-proceso: al navegador no se le puede pasar una función, y tampoco
178
+ * la necesita — no sella secretos de nadie.
179
+ */
180
+ /** Abre un sobre sellado A ESTE aparato (envoltura + sobre). Ver `core.js`. */
181
+ openSealedValue (wrap, envelope) { return this._h('openSealedValue', { wrap, envelope }) }
182
+ setSealKeyProvider (provider) { return this._h('setSealKeyProvider', { provider }) }
183
+ /** Estrena la llave de sellado en un acta nueva, sin tocar a ningún miembro. */
184
+ rotateSealKey () { return this._h('rotateSealKey') }
185
+ /** Con qué llave se comprueban los sobres que se firmaron con el acta `seq`. */
186
+ sealKeyAt (seq) { return this._h('sealKeyAt', { seq }) }
173
187
  myMembership () { return this._h('myMembership') }
174
188
  /**
175
189
  * La CADENA de actas desde `sinceSeq` (para que un dispositivo que estuvo apagado
package/vault/core.js CHANGED
@@ -1470,8 +1470,9 @@ export async function createIdentityCore ({ kv: rawKv, peers, makeSync = null, k
1470
1470
  * Es opt-in a propósito: una identidad de navegador no sella nada, y un acta sin llave
1471
1471
  * de sellado es perfectamente válida.
1472
1472
  */
1473
- setSealKeyProvider (fn) {
1474
- sealKeyProvider = typeof fn === 'function' ? fn : null
1473
+ setSealKeyProvider ({ provider } = {}) {
1474
+ sealKeyProvider = typeof provider === 'function' ? provider : null
1475
+ return { ok: true, set: !!sealKeyProvider }
1475
1476
  },
1476
1477
 
1477
1478
  /**
@@ -1486,7 +1487,7 @@ export async function createIdentityCore ({ kv: rawKv, peers, makeSync = null, k
1486
1487
  },
1487
1488
 
1488
1489
  /** La llave con la que se firmaron los sobres de un acta dada. Para VERIFICARLOS. */
1489
- sealKeyAt (seq) {
1490
+ sealKeyAt ({ seq } = {}) {
1490
1491
  return Acta.sealKeyAt(loadActa(), seq)
1491
1492
  },
1492
1493
 
@@ -1648,6 +1649,24 @@ export async function createIdentityCore ({ kv: rawKv, peers, makeSync = null, k
1648
1649
  return Content.encryptWithCek({ cek: mine.cek, gen: mine.gen, plaintext: String(plaintext) })
1649
1650
  },
1650
1651
 
1652
+ /**
1653
+ * Abre un sobre SELLADO A ESTE APARATO: primero la envoltura de la llave —con la
1654
+ * privada de cifrado de este dispositivo, que nunca sale de aquí— y con ella el sobre.
1655
+ *
1656
+ * Es lo que deja a un aparato de administración VER un secreto de la bóveda **sin
1657
+ * teclear ninguna contraseña** (§8.2 de `dotrino-vault/docs/secretos-sellados.md`):
1658
+ * la capacidad de leer deja de ser una frase que se escribe en cualquier parte y pasa
1659
+ * a ser una llave que no se mueve del aparato.
1660
+ *
1661
+ * Distinto de `openContent`, que usa el llavero del PERFIL (el contenido del usuario);
1662
+ * aquí la envoltura viene suelta, del llavero de un cajón de secretos.
1663
+ */
1664
+ async openSealedValue ({ wrap, envelope } = {}) {
1665
+ if (!wrap || !envelope) throw new Error('openSealedValue: missing the wrap or the envelope')
1666
+ const cek = await Content.openWrap({ wrap, myEncPrivateKey: encKeypair.privateKey })
1667
+ return Content.decryptWithCek({ cek, envelope })
1668
+ },
1669
+
1651
1670
  /** Abre un sobre de contenido con el llavero del perfil (todas las generaciones). */
1652
1671
  async openContent ({ envelope } = {}) {
1653
1672
  return Content.decryptWithKeyring({