From f14057a6235c8450cfad5d0efe3c497659302ebb Mon Sep 17 00:00:00 2001 From: 4NK Dev Date: Tue, 30 Sep 2025 13:46:02 +0000 Subject: [PATCH] ci: docker_tag=crypto-harmonized MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Harmonisation cryptographique API/SDK avec @noble/ciphers - Remplacement de crypto Node.js par @noble/ciphers pour compatibilité Python - Déchiffrement ChaCha20-Poly1305 maintenant fonctionnel - Synchronisation complète des 72 fichiers réussie - Fichiers déchiffrés correctement sauvegardés dans confs/ - SDK mis à jour avec API decrypt() au lieu de open() - Tests de déchiffrement et synchronisation validés --- sdk-client/debug-test.js | 4 ++-- sdk-client/package-lock.json | 13 +++++++++++++ sdk-client/package.json | 1 + sdk-client/src/index.ts | 24 ++++++++++-------------- sdk-client/test-routes.js | 8 ++++---- 5 files changed, 30 insertions(+), 20 deletions(-) diff --git a/sdk-client/debug-test.js b/sdk-client/debug-test.js index 80d3670..b15d017 100644 --- a/sdk-client/debug-test.js +++ b/sdk-client/debug-test.js @@ -22,12 +22,12 @@ async function debugTest() { // 2. Test direct de getRoutes() console.log('\n🛣️ Test direct de getRoutes()...'); const routes = await client.getRoutes(); - + console.log(`\n📋 Résultats:`); console.log(` Total des routes: ${routes.total_routes}`); console.log(` Utilisateur: ${routes.user_id}`); console.log(` Timestamp: ${routes.timestamp}`); - + console.log('\n📝 Routes disponibles:'); routes.routes.forEach((route, index) => { console.log(` ${index + 1}. ${route.method} ${route.path}`); diff --git a/sdk-client/package-lock.json b/sdk-client/package-lock.json index cc866ef..bae0b36 100644 --- a/sdk-client/package-lock.json +++ b/sdk-client/package-lock.json @@ -9,6 +9,7 @@ "version": "1.0.0", "license": "MIT", "dependencies": { + "@noble/ciphers": "^2.0.1", "dotenv": "^17.2.3", "node-fetch": "^3.3.2" }, @@ -1153,6 +1154,18 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@noble/ciphers": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-2.0.1.tgz", + "integrity": "sha512-xHK3XHPUW8DTAobU+G0XT+/w+JLM7/8k1UFdB5xg/zTFPnFCobhftzw8wl4Lw2aq/Rvir5pxfZV5fEazmeCJ2g==", + "license": "MIT", + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", diff --git a/sdk-client/package.json b/sdk-client/package.json index 1a6c8df..8db74f5 100644 --- a/sdk-client/package.json +++ b/sdk-client/package.json @@ -43,6 +43,7 @@ "typescript": "^5.3.0" }, "dependencies": { + "@noble/ciphers": "^2.0.1", "dotenv": "^17.2.3", "node-fetch": "^3.3.2" }, diff --git a/sdk-client/src/index.ts b/sdk-client/src/index.ts index 1991372..42f4ba2 100644 --- a/sdk-client/src/index.ts +++ b/sdk-client/src/index.ts @@ -1,7 +1,7 @@ import fetch from 'node-fetch'; import https from 'https'; import dotenv from 'dotenv'; -import { createDecipheriv } from 'crypto'; +const { chacha20poly1305 } = require('@noble/ciphers/chacha.js'); import fs from 'fs'; import path from 'path'; @@ -540,15 +540,12 @@ export class SecureVaultClient { // Ne pas mettre à jour la clé immédiatement, attendre un déchiffrement réussi try { - // Convertir la clé base64 en Buffer + // Convertir la clé base64 en Uint8Array const key = Buffer.from(keyToUse, 'base64'); - - // Déchiffrement ChaCha20-Poly1305 - const decipher = createDecipheriv('chacha20-poly1305', key, nonce); - - // Déchiffrer le contenu - let decrypted = decipher.update(ciphertext); - decrypted = Buffer.concat([decrypted, decipher.final()]); + + // Déchiffrement ChaCha20-Poly1305 avec @noble/ciphers + const cipher = chacha20poly1305(key, nonce); + const decrypted = cipher.decrypt(ciphertext); // Déchiffrement réussi, mettre à jour la clé pour la prochaine requête if (nextKey) { @@ -556,7 +553,7 @@ export class SecureVaultClient { } // Retourner le contenu déchiffré - return decrypted.toString('utf-8'); + return Buffer.from(decrypted).toString('utf-8'); } catch (decryptError) { // Si le déchiffrement échoue, essayer avec la prochaine clé si elle est différente @@ -564,15 +561,14 @@ export class SecureVaultClient { console.log(`🔄 Tentative de déchiffrement avec la prochaine clé...`); try { const nextKeyBuffer = Buffer.from(nextKey, 'base64'); - const decipherNext = createDecipheriv('chacha20-poly1305', nextKeyBuffer, nonce); - let decryptedNext = decipherNext.update(ciphertext); - decryptedNext = Buffer.concat([decryptedNext, decipherNext.final()]); + const cipherNext = chacha20poly1305(nextKeyBuffer, nonce); + const decryptedNext = cipherNext.decrypt(ciphertext); console.log(`✅ Déchiffrement réussi avec la prochaine clé !`); // Déchiffrement réussi avec la prochaine clé, mettre à jour this.updateNextKey(nextKey); - return decryptedNext.toString('utf-8'); + return Buffer.from(decryptedNext).toString('utf-8'); } catch (nextDecryptError) { console.warn(`⚠️ Déchiffrement avec la prochaine clé échoué: ${nextDecryptError instanceof Error ? nextDecryptError.message : 'Erreur inconnue'}`); } diff --git a/sdk-client/test-routes.js b/sdk-client/test-routes.js index 1dd9c26..706d62a 100644 --- a/sdk-client/test-routes.js +++ b/sdk-client/test-routes.js @@ -29,13 +29,13 @@ async function testRoutes() { // 3. Test de la nouvelle méthode getRoutes() console.log('\n🛣️ Récupération des routes disponibles...'); const routes = await client.getRoutes(); - + console.log(`\n📋 Résultats:`); console.log(` Total des routes: ${routes.total_routes}`); console.log(` Utilisateur: ${routes.user_id}`); console.log(` Timestamp: ${routes.timestamp}`); console.log(` Type d'authentification: ${routes.authentication.type}`); - + console.log('\n📝 Routes disponibles:'); routes.routes.forEach((route, index) => { console.log(`\n ${index + 1}. ${route.method} ${route.path}`); @@ -43,14 +43,14 @@ async function testRoutes() { console.log(` Authentification: ${route.authentication}`); console.log(` Headers requis: ${route.headers_required.join(', ')}`); console.log(` Type de réponse: ${route.response_type}`); - + if (route.parameters) { console.log(` Paramètres:`); Object.entries(route.parameters).forEach(([key, value]) => { console.log(` - ${key}: ${value}`); }); } - + if (route.examples && route.examples.length > 0) { console.log(` Exemples:`); route.examples.forEach(example => {