feat(licence): lier la licence au poste (carte mere + disque)

C'etait la decision prise, et je l'avais mal lue : "pour le moment 1"
repondait a la question 1, pas "une seule licence".

PM.MachineId melange l'UUID de la carte mere (WMI) et la serie du volume
systeme, puis n'en publie que 16 hexa : l'empreinte se recopie dans un
courriel, l'UUID brut n'a pas a circuler. Un UUID nul ou tout a FF est
rejete — VM et images clonees l'annoncent, et deux postes tomberaient
alors sur la meme empreinte.

Le champ m est compare APRES la signature. m absent = licence flottante,
acceptee : seule la cle privee peut en emettre, et le champ ne peut pas
etre retire sans casser la signature. Cote script -Machine est
obligatoire sauf -Floating explicite.

L'ecran d'activation affiche l'Installation ID : une licence liee ne peut
plus etre emise avant l'installation.

Verifie sur ce poste : liee a lui acceptee, liee a un autre refusee,
flottante acceptee.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
r-zakarya
2026-09-05 15:16:35 +01:00
parent 2cb7d29450
commit 405ac7fac4
10 changed files with 287 additions and 8 deletions
+31
View File
@@ -280,6 +280,37 @@ tools\licence.ps1 -For "a@b.com" -Name "Ami" # une licence
- **Pas d'expiration dans la charge utile**, volontairement : une date qu'on
fait respecter avec l'horloge de la machine du client ne prouve rien. Le
champ `d` n'est qu'une date d'emission.
### Liage au poste (`PM.MachineId`)
Le champ `m` de la charge utile porte l'empreinte du poste ; `MachineMatches`
la compare **apres** la verification de signature — une empreinte n'a de sens
que dans une charge utile dont on sait deja qu'elle vient de nous.
- Empreinte = `SHA256('pmserver/machine/v1|' + UUID carte mere + '|' + serie du
volume systeme)`, tronquee a 16 hexa, affichee en groupes de quatre
(`CD6F-F1B3-25C4-0111`). **Hachee, pas concatenee** : elle se recopie dans un
courriel, et l'UUID brut de la carte mere est un identifiant materiel unique
qui n'a pas a circuler en clair ni a finir dans nos journaux.
- UUID lu par WMI (`Win32_ComputerSystemProduct`, COM via `Winapi.ActiveX` pour
`IEnumVariant`). **Un UUID nul ou tout a FF est rejete** : beaucoup de VM et
d'images clonees l'annoncent, et s'en contenter ferait tomber des postes
differents sur la MEME empreinte — une licence emise pour l'un ouvrirait chez
l'autre. Repli sur `MachineGuid` (HKLM\...\Cryptography), distinct par
installation. Les deux sources absentes → `'unavailable'`, qui ne correspond a
aucune licence : mieux qu'une chaine vide, identique partout.
- Calculee une fois puis retenue (l'appel WMI coute quelques centaines de ms).
- **`m` absent = licence flottante, acceptee** — seule la cle privee peut en
emettre une, et un tiers ne peut pas retirer le champ sans casser la
signature. Ce n'est donc pas un contournement, c'est une licence de site.
Cote script, `-Machine` est **obligatoire** sauf `-Floating` explicite :
l'oubli produirait sinon la licence la plus permissive en silence.
- **Consequence de flux** : on ne peut plus emettre une licence avant que le
client ait installe. L'ecran d'activation affiche l'Installation ID, il
l'envoie, on emet. Changer la carte mere ou le disque systeme casse la
licence — la reparation est une reemission.
- Ce qui casse l'empreinte : carte mere remplacee, disque systeme remplace,
Windows reinstalle sur un autre volume, machine clonee.
- `SelfTestLicence` a l'`initialization` (comme `SelfTestCrypto`) rejoue un
vecteur fige signe par une **paire de test** dont la privee a ete jetee :
licence valable acceptee, un octet retourne dans la charge utile refuse.