@mostajs/recette 0.1.0 → 0.2.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/CHANGELOG.md CHANGED
@@ -2,6 +2,27 @@
2
2
 
3
3
  **Auteur** : Dr Hamid MADANI <drmdh@msn.com>
4
4
 
5
+ ## 0.2.0 — 2026-09-10
6
+
7
+ Le sceau savait fermer un pli ; il ne savait pas l'ouvrir. C'est ce qui manquait pour que QaTrax
8
+ puisse recevoir ce que ValiTrax lui scelle — la moitié retour de la chaîne.
9
+
10
+ ### Ajouté
11
+
12
+ - **`sceau.ouvrir(scelle)`**, rendu quand `destinataire.privee` est fourni. Pendant exact de
13
+ `sceller`, et pour la même raison logé ici : le format ne s'écrit qu'à un seul endroit. Ouvrir
14
+ n'authentifie pas — c'est la signature retrouvée à l'intérieur qui dit l'origine. **Ouvrir
15
+ d'abord, vérifier ensuite.**
16
+ - **`verification: { publique }`**, alias neutre de `certificateur: { publique }`. La contrepartie
17
+ est *le certificateur* vue de ValiTrax et *l'émetteur* vue de QaTrax : même verbe, vantage
18
+ inverse. L'ancien nom reste servi, aucune application n'est à modifier.
19
+
20
+ ### Compatibilité
21
+
22
+ Aucune rupture. Une instance qui ne fournit pas `destinataire.privee` n'obtient pas `ouvrir` — la
23
+ règle inchangée du module : **un verbe n'existe que si sa clé existe**, pour que le manque se
24
+ découvre à la mise en service et non le jour de la remise.
25
+
5
26
  ## 0.1.0 — 2026-09-10
6
27
 
7
28
  Première version. Le moteur de la recette applicative, extrait du besoin de **déléguer la recette
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mostajs/recette",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "description": "Validation & recette applicative : trame `mostajs-devtest/1` reçue signée du certificateur, points enrichis POUR LE CLIENT (l'import n'écrase jamais l'enrichissement), feuillets composés à l'image du manifeste PDF (ok/ko/er), anomalies déclarées puis qualifiées, dossier figé et EXPORTÉ SIGNÉ — aucun appel réseau —, certificat reçu et vérifié, feu d'exploitation DÉRIVÉ du certificat. Powers ValiTrax (valitrax.mostajs.dev).",
5
5
  "author": "Dr Hamid MADANI <drmdh@msn.com>",
6
6
  "license": "AGPL-3.0-or-later",
package/src/sceau.js CHANGED
@@ -20,7 +20,7 @@
20
20
  // La formule « signé avec la clé publique fournie par le certificateur » décrit en réalité le
21
21
  // SCELLEMENT : cette clé sert à fermer le pli à son intention, pas à prouver notre identité.
22
22
  // C'est `destinataire.publique` ci-dessous. Notre identité, elle, vient de `signature.privee`.
23
- import { sign, verifySignature, seal, generateSigningKeyPair, generateRecipientKeyPair } from '@mostajs/crypto-box';
23
+ import { sign, verifySignature, seal, open, generateSigningKeyPair, generateRecipientKeyPair } from '@mostajs/crypto-box';
24
24
 
25
25
  const ALG_SIGNATURE = 'Ed25519';
26
26
 
@@ -43,10 +43,16 @@ function octets(k, quoi) {
43
43
  *
44
44
  * @param {object} opt
45
45
  * @param {object} [opt.signature] `{ privee, nom }` — NOTRE identité (Ed25519). Sans elle, pas d'export.
46
- * @param {object} [opt.destinataire] `{ publique }` — le certificateur (X25519). Sans elle, pas de scellement.
47
- * @param {object} [opt.certificateur] `{ publique }` — le certificateur (Ed25519). Sans elle, aucun PV vérifiable.
46
+ * @param {object} [opt.destinataire] `{ publique, privee }` — X25519. La PUBLIQUE du destinataire
47
+ * permet de SCELLER pour lui ; notre PRIVÉE permet d'OUVRIR
48
+ * ce qui nous a été scellé. Les deux vantages du même pli.
49
+ * @param {object} [opt.certificateur] `{ publique }` — Ed25519 de la contrepartie. Sans elle,
50
+ * aucun document reçu n'est vérifiable. Alias neutre :
51
+ * `verification`, car la contrepartie est le certificateur
52
+ * vu de ValiTrax, et l'émetteur vu de QaTrax — même verbe,
53
+ * vantage inverse.
48
54
  */
49
- export function creerSceau({ signature, destinataire, certificateur } = {}) {
55
+ export function creerSceau({ signature, destinataire, certificateur, verification } = {}) {
50
56
  const port = {};
51
57
 
52
58
  if (signature?.privee) {
@@ -67,8 +73,17 @@ export function creerSceau({ signature, destinataire, certificateur } = {}) {
67
73
  port.sceller = async (charge) => Buffer.from(seal([pub], charge)).toString('base64');
68
74
  }
69
75
 
70
- if (certificateur?.publique) {
71
- const pub = octets(certificateur.publique, 'certificateur.publique');
76
+ if (destinataire?.privee) {
77
+ const priv = octets(destinataire.privee, 'destinataire.privee');
78
+ // OUVRIR est le pendant exact de SCELLER, et il vit ici pour la même raison : le format ne
79
+ // s'écrit qu'à un seul endroit. Le pli ouvert n'est PAS authentifié pour autant — c'est la
80
+ // signature qu'il contient qui dira d'où il vient. Ouvrir d'abord, vérifier ensuite.
81
+ port.ouvrir = async (scelle) => open(priv, Buffer.from(String(scelle), 'base64')).toString('utf8');
82
+ }
83
+
84
+ const contrepartie = certificateur?.publique ? certificateur : verification;
85
+ if (contrepartie?.publique) {
86
+ const pub = octets(contrepartie.publique, 'clé publique de la contrepartie');
72
87
  port.verifier = async (charge, sig) => {
73
88
  // Un algorithme inattendu n'est pas une signature invalide : c'est un document qu'on ne
74
89
  // sait pas lire. On refuse dans les deux cas, mais on ne prétend pas avoir vérifié.