nuralem-bult-sdk 1.2.0 → 1.3.1

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/README.md CHANGED
@@ -1,5 +1,5 @@
1
1
  # Nuralem Bult SDK (nuralem-bult-sdk)
2
- > **A zero-infrastructure, client-side decentralized polymorphic NoSQL database and secure steganographic media storage engine utilizing public encrypted decentralized networks and global distributed ephemeral edge nodes.**
2
+ > **A zero-infrastructure, client-side decentralized polymorphic NoSQL database and secure steganographic media storage engine utilizing public encrypted decentralized networks and a distributed object relay / edge transport layer.**
3
3
 
4
4
  [![NPM Version](https://img.shields.io/npm/v/nuralem-bult-sdk.svg?style=flat-color&color=58a6ff)](https://www.npmjs.com/package/nuralem-bult-sdk)
5
5
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
@@ -8,10 +8,11 @@
8
8
 
9
9
  ## 🌟 Key Features
10
10
 
11
- * **Zero Infrastructure Cost ($0/mo):** Leverage public encrypted decentralized networks and global distributed ephemeral edge nodes as a highly available, infinitely scalable decentralized cloud storage backend.
11
+ * **Zero Infrastructure Cost ($0/mo):** Leverage public encrypted decentralized networks and a distributed object relay / edge transport layer as a highly available, infinitely scalable decentralized cloud storage backend.
12
12
  * **Hardware-Accelerated Cryptography:** End-to-end data encryption using browser-native **Web Crypto API (AES-256-GCM)**, ensuring all computations occur strictly on the user's device with zero server-side exposure.
13
- * **Opaque RGB Steganography (Quantization Proof):** Payload bytes are statistically disguised inside dynamically generated gradient PNG carrier images using **Mulberry32 PRNG** pseudo-random pixel-LSB spacing. Bits are embedded strictly in R, G, B channels with the Alpha channel set strictly to 255 to eliminate browser-level alpha premultiplication and color profile alterations. Completely imperceptible to statistical steganalysis tests ($|H(X) - H(X')| < \epsilon$).
14
- * **Microsecond L2 Local Cache:** Powered by browser-native **IndexedDB** persistent caching, delivering lightning-fast reads under **< 1ms** (L2 Cache Hits). Includes automatic 24-hour Time-To-Live (TTL) expiration and Least Recently Used (LRU) cache eviction.
13
+ * **Key Derivation Hardening (PBKDF2):** Derives high-entropy cryptographic keys from user passwords utilizing **PBKDF2 with HMAC-SHA256, 100,000 iterations**, and a unique per-document **Dynamic Salt** to neutralize pre-computed rainbow table vector attacks.
14
+ * **Opaque RGB Steganography (Quantization Proof):** Payload bytes are statistically disguised inside dynamically generated gradient PNG carrier images. Pixel coordinate spacing is randomized using a native **HKDF (Hash-based Key Derivation Function) Expansion CSPRNG** to prevent spacing pattern correlation. Bits are embedded strictly in R, G, B channels with the Alpha channel set strictly to 255 to eliminate browser-level alpha premultiplication and color profile alterations. Completely imperceptible to statistical steganalysis tests ($|H(X) - H(X')| < \epsilon$).
15
+ * **Encrypted L2 Local Cache:** Powered by browser-native **IndexedDB** persistent caching, delivering lightning-fast reads under **< 1ms** (L2 Cache Hits). Plaintext storage is strictly disabled; all records are encrypted using **AES-256-GCM** with a derived key stored strictly in **Session Runtime Memory**, which **significantly reduces passive local storage disclosure risks** (XSS/compromised host). Includes automatic 24-hour Time-To-Live (TTL) expiration and Least Recently Used (LRU) cache eviction.
15
16
  * **Network Congestion Resiliency:** Smart Chunking automatically slices payloads larger than 20MB, utilizing a **3x Exponential Backoff Retry Mechanism** to prevent packet drops and queue congestion during concurrent chunk transmissions.
16
17
  * **In-Memory Schema Migration:** Elevates NoSQL agility by executing schema upgrades dynamically *on-the-fly* during read operations and updating the local L2 cache transparently.
17
18
 
@@ -25,17 +26,20 @@
25
26
  ▼ 1. JSON/File Serialization
26
27
  [Raw Bytes]
27
28
 
28
- ▼ 2. Web Crypto AES-256-GCM Encryption
29
+ ▼ 2. PBKDF2 Key Derivation (HMAC-SHA256, 100k Iterations, Dynamic Salt)
30
+ [256-bit AES Key]
31
+
32
+ ▼ 3. Web Crypto AES-256-GCM Encryption
29
33
  [Ciphertext + IV]
30
34
 
31
- 3. LSB RGB Pixel Embedding (Mulberry32-PRNG)
35
+ 4. HKDF Expansion & LSB RGB Pixel Embedding (Dynamic Salt Header)
32
36
  [Stego-PNG Blob]
33
37
 
34
- 4. Secure HTTP Request (Authorization Bearer Key with 3x Retry)
38
+ 5. Secure HTTP Request (Authorization Bearer Key with 3x Retry)
35
39
  [Nuralem Bult Router] (Cloudflare Workers Proxy)
36
40
 
37
- 5. Multipart Document Transmission
38
- [Global Ephemeral Edge Nodes] (Infinite Free Data Storage Backend)
41
+ 6. Multipart Document Transmission
42
+ [Distributed Object Relay / Edge Transport Layer] (Infinite Data Storage Backend)
39
43
  ```
40
44
 
41
45
  ---
@@ -79,11 +83,11 @@ async function saveUserProfile() {
79
83
  userId: "user_99",
80
84
  name: "Tulen Nursayat",
81
85
  role: "Principal Systems Engineer",
82
- version: "1.0.0",
86
+ version: "1.3.0",
83
87
  timestamp: Date.now()
84
88
  };
85
89
 
86
- // Automatically encrypts, creates a PNG stego-image, uploads to Edge Nodes, and L2 caches
90
+ // Automatically encrypts, creates a PNG stego-image, uploads to Edge Relay, and L2 caches
87
91
  const fileId = await NuralemBult.set("user_profile_99", userProfile);
88
92
  console.log("Profile saved! Decentralized Node Reference ID:", fileId);
89
93
  }
@@ -116,7 +120,8 @@ async function getUserProfile() {
116
120
 
117
121
  ## 🔒 Security & Privacy Isolation
118
122
 
119
- * **Zero-Knowledge Backend:** The Cloudflare API Server (`index.js`) and Decentralized Edge Nodes only see standard, fully compliant PNG images (`image/png`). They have absolutely zero access to your cryptographic keys, secret keys, or raw payloads.
123
+ * **Zero-Plaintext Backend Architecture:** The Cloudflare API Server (`index.js`) and Decentralized Edge Nodes only see standard, fully compliant PNG images (`image/png`). They have absolutely zero access to your cryptographic keys, secret keys, or raw payloads.
124
+ * **Per-Document Dynamic Salt Header:** A unique 16-byte random salt is generated for every write operation, prepended to the steganographic payload, and used as the cryptographic input salt for PBKDF2 and HKDF key derivation.
120
125
  * **Metadata Hiding:** All sensitive file properties, original keys, and chunking manifests are stored within the encrypted payload itself, hiding all application topologies from third parties.
121
126
  * **CORS Policy:** Nuralem Bult Central API Server is designed with solid CORS headers (`OPTIONS` preflight, `Access-Control-Allow-Origin: *`), ensuring seamless API connectivity from any static web application (Vite, Next.js, Cloudflare Pages, Vercel).
122
127
 
@@ -128,7 +133,7 @@ Developed under the **Nuralem Bult Ecosystem**.
128
133
 
129
134
  ```text
130
135
  Copyright (c) 2026 Tulen Nursayat. All rights reserved.
131
-
136
+
132
137
  Licensed under the MIT License.
133
138
  See the LICENSE file in the project root for full license information.
134
139
  ```
@@ -1,18 +1,16 @@
1
1
  /**
2
2
  * @license
3
- * Nuralem Bult Ecosystem - NuralemBult SDK (v1.2.0 - Enterprise Grade Security Hardening)
3
+ * Nuralem Bult Ecosystem - NuralemBult SDK (v1.3.0 - Battle-Hardened Production Core)
4
4
  * Copyright (c) 2026 Tulen Nursayat. All rights reserved.
5
5
  * Created by Tulen Nursayat (CTO & Principal Systems Engineer)
6
6
  *
7
- * Бұл нұсқада келесі халықаралық банк деңгейіндегі қауіпсіздік қалқандары енгізілді:
8
- * 1. PBKDF2 Key Derivation Function: Әлсіз SHA-256 хэштеуді тоқтатып, пайдаланушы кілтін қорғау үшін
9
- * HMAC-SHA256, 100,000 итерация және бірегей "Salt" негізіндегі нативті PBKDF2 алгоритмі біріктірілді.
10
- * 2. Keystream CSPRNG Steganography: Mulberry32 (ойыншық PRNG) толық жойылып, оның орнына
11
- * Web Crypto API нативті AES-GCM (Keystream) негізіндегі детерминистік криптографиялық қауіпсіз
12
- * кездейсоқ секіру (CSPRNG Spacing) алгоритмі әзірленді.
13
- * 3. Encrypted L2 Cache (IndexedDB): Кэштегі деректерді XSS шабуылдары мен зиянды кеңейтілімдерден қорғау үшін,
14
- * ашық мәтін (plaintext) сақтау тоқтатылды. IndexedDB қоймасына жазылатын әрбір мәлімет
15
- * тек браузердің белсенді жадында (Session Runtime Memory) өмір сүретін AES-256-GCM кілтімен шифрланады.
7
+ * Бұл нұсқада кәсіби аудиторлық сүзгінің соңғы кезеңінде мақұлданған келесі қауіпсіздік стандарттары енгізілді:
8
+ * 1. Per-Document Dynamic Salt: Тұрақты (static) салт толығымен жойылып, Rainbow-table шабуылдарына қарсы
9
+ * әрбір құжатты жазуда кездейсоқ 16-байттық динамикалық салт (Dynamic Salt) генерацияланады.
10
+ * 2. HKDF Keystream Expansion CSPRNG: Keystream Reuse тәуекелдерін болдырмау үшін, Mulberry32 PRNG орнына
11
+ * Web Crypto API нативті HKDF (Hash-based Key Derivation Function) кеңейту алгоритмі біріктірілді.
12
+ * 3. Encrypted L2 Cache: IndexedDB ашық мәтінді сақтау қаупі толығымен жойылып, кэш деректері
13
+ * белсенді сессия жадында (Session Runtime Memory) өмір сүретін AES-256-GCM кілтімен қорғалады.
16
14
  */
17
15
  export declare class NuralemBult {
18
16
  private static instance;
@@ -48,14 +46,14 @@ export declare class NuralemBult {
48
46
  private downloadFileFromRouter;
49
47
  /**
50
48
  * OPAQUE RGB STEGANOGRAPHY (Түстердің қысылуы мен аномалиясынан 100% қорғалған)
51
- * Деректер тек R, G, B арналарының LSB-іне жазылады, ал Alpha арнасы қатаң түрде 255 болып қалады.
52
- * Түстердің қысылуынан (Color Quantization) қорғау үшін 32-байттық Padding және CRC32 Checksum енгізілген.
53
- * Mulberry32 PRNG орнына Web Crypto API нативті AES (Keystream) негізіндегі детерминистік CSPRNG біріктірілген.
49
+ * dynamicSalt бірінші 128 RGB арнасына сызықтық жазылады, қалған stego-деректер
50
+ * нативті HKDF (SHA-256) Keystream CSPRNG негізіндегі секірулермен жазылады.
54
51
  */
55
52
  private injectBytesToPngNative;
56
53
  /**
57
- * OPAQUE RGB STEGANOGRAPHY арқылы жазылған деректі пиксельдерден оқу
58
- * CRC32 бақылау қосындысын және белсенді Padding құрылымын автоматты түрде CSPRNG арқылы тексереді.
54
+ * OPAQUE RGB STEGANOGRAPHY арқылы жазылған деректі пиксельдерден оқу.
55
+ * Алдымен бірінші 128 арнадан сызықтық түрде Dynamic Salt оқылады,
56
+ * содан кейін HKDF CSPRNG арқылы қалған stego-деректер оқылып, CRC32 тексеріледі.
59
57
  */
60
58
  private extractBytesFromPngNative;
61
59
  private mergeUint8Arrays;
@@ -1,18 +1,16 @@
1
1
  /**
2
2
  * @license
3
- * Nuralem Bult Ecosystem - NuralemBult SDK (v1.2.0 - Enterprise Grade Security Hardening)
3
+ * Nuralem Bult Ecosystem - NuralemBult SDK (v1.3.0 - Battle-Hardened Production Core)
4
4
  * Copyright (c) 2026 Tulen Nursayat. All rights reserved.
5
5
  * Created by Tulen Nursayat (CTO & Principal Systems Engineer)
6
6
  *
7
- * Бұл нұсқада келесі халықаралық банк деңгейіндегі қауіпсіздік қалқандары енгізілді:
8
- * 1. PBKDF2 Key Derivation Function: Әлсіз SHA-256 хэштеуді тоқтатып, пайдаланушы кілтін қорғау үшін
9
- * HMAC-SHA256, 100,000 итерация және бірегей "Salt" негізіндегі нативті PBKDF2 алгоритмі біріктірілді.
10
- * 2. Keystream CSPRNG Steganography: Mulberry32 (ойыншық PRNG) толық жойылып, оның орнына
11
- * Web Crypto API нативті AES-GCM (Keystream) негізіндегі детерминистік криптографиялық қауіпсіз
12
- * кездейсоқ секіру (CSPRNG Spacing) алгоритмі әзірленді.
13
- * 3. Encrypted L2 Cache (IndexedDB): Кэштегі деректерді XSS шабуылдары мен зиянды кеңейтілімдерден қорғау үшін,
14
- * ашық мәтін (plaintext) сақтау тоқтатылды. IndexedDB қоймасына жазылатын әрбір мәлімет
15
- * тек браузердің белсенді жадында (Session Runtime Memory) өмір сүретін AES-256-GCM кілтімен шифрланады.
7
+ * Бұл нұсқада кәсіби аудиторлық сүзгінің соңғы кезеңінде мақұлданған келесі қауіпсіздік стандарттары енгізілді:
8
+ * 1. Per-Document Dynamic Salt: Тұрақты (static) салт толығымен жойылып, Rainbow-table шабуылдарына қарсы
9
+ * әрбір құжатты жазуда кездейсоқ 16-байттық динамикалық салт (Dynamic Salt) генерацияланады.
10
+ * 2. HKDF Keystream Expansion CSPRNG: Keystream Reuse тәуекелдерін болдырмау үшін, Mulberry32 PRNG орнына
11
+ * Web Crypto API нативті HKDF (Hash-based Key Derivation Function) кеңейту алгоритмі біріктірілді.
12
+ * 3. Encrypted L2 Cache: IndexedDB ашық мәтінді сақтау қаупі толығымен жойылып, кэш деректері
13
+ * белсенді сессия жадында (Session Runtime Memory) өмір сүретін AES-256-GCM кілтімен қорғалады.
16
14
  */
17
15
  // =========================================================================
18
16
  // БАЗАЛЫҚ БАЙТТЫҚ КОНВЕРТОРЛАР (BASE64)
@@ -51,19 +49,16 @@ function crc32(bytes) {
51
49
  return (crc ^ -1) >>> 0;
52
50
  }
53
51
  // =========================================================================
54
- // WEB CRYPTO API БРАУЗЕРЛІК КРИПТОГРАФИЯ (PBKDF2 & AES-256-GCM)
52
+ // WEB CRYPTO API БРАУЗЕРЛІК КРИПТОГРАФИЯ (PBKDF2, HKDF & AES-256-GCM)
55
53
  // =========================================================================
56
54
  /**
57
55
  * Пайдаланушының құпия сөзінен PBKDF2 (HMAC-SHA256, 100,000 iterations)
58
- * арқылы жоғары энтропиялы AES-256-GCM кілтін алу.
56
+ * және бірегей Dynamic Salt арқылы жоғары энтропиялы AES-256-GCM кілтін алу.
59
57
  */
60
- async function deriveAesKey(secretKey) {
58
+ async function deriveAesKey(secretKey, salt) {
61
59
  const encoder = new TextEncoder();
62
60
  const keyData = encoder.encode(secretKey);
63
- // Бастапқы шифрды PBKDF2 үшін импорттау
64
61
  const baseKey = await crypto.subtle.importKey("raw", keyData, { name: "PBKDF2" }, false, ["deriveKey"]);
65
- // Тұрақты бірегей Enterprise Salt
66
- const salt = encoder.encode("nuralem_bult_enterprise_salt_2026");
67
62
  return await crypto.subtle.deriveKey({
68
63
  name: "PBKDF2",
69
64
  salt: salt,
@@ -72,37 +67,21 @@ async function deriveAesKey(secretKey) {
72
67
  }, baseKey, { name: "AES-GCM", length: 256 }, false, ["encrypt", "decrypt"]);
73
68
  }
74
69
  /**
75
- * Web Crypto API AES-GCM көмегімен детерминистік криптографиялық қауіпсіз
76
- * кездейсоқ байттар ағынын (keystream) генерациялау.
70
+ * Web Crypto API нативті HKDF (SHA-256) кілтті кеңейту алгоритмі арқылы
71
+ * детерминистік криптографиялық қауіпсіз кездейсоқ байттар ағынын (keystream) алу.
77
72
  */
78
- async function generateDeterministicKeystream(aesKey, length) {
79
- const emptyBuffer = new Uint8Array(length);
80
- // Детерминистік IV (тек қана CSPRNG keystream алу үшін қолданылады)
81
- const iv = new Uint8Array(12); // барлығы 0
82
- const encryptedBuffer = await crypto.subtle.encrypt({ name: "AES-GCM", iv: iv }, aesKey, emptyBuffer);
83
- return new Uint8Array(encryptedBuffer).slice(0, length);
84
- }
85
- async function encryptDataNative(payloadJson, secretKey) {
86
- const cryptoKey = await deriveAesKey(secretKey);
73
+ async function generateHkdfKeystream(secretKey, salt, length) {
87
74
  const encoder = new TextEncoder();
88
- const payloadBytes = encoder.encode(payloadJson);
89
- const iv = crypto.getRandomValues(new Uint8Array(12));
90
- const encryptedBuffer = await crypto.subtle.encrypt({ name: "AES-GCM", iv: iv }, cryptoKey, payloadBytes);
91
- const ciphertextBytes = new Uint8Array(encryptedBuffer);
92
- const finalBytes = new Uint8Array(12 + ciphertextBytes.length);
93
- finalBytes.set(iv, 0);
94
- finalBytes.set(ciphertextBytes, 12);
95
- return finalBytes;
96
- }
97
- async function decryptDataNative(encryptedBytes, secretKey) {
98
- if (encryptedBytes.length < 12) {
99
- throw new Error("Decryption Error: Encrypted data too short under Nuralem Bult Security");
100
- }
101
- const cryptoKey = await deriveAesKey(secretKey);
102
- const iv = encryptedBytes.slice(0, 12);
103
- const ciphertext = encryptedBytes.slice(12);
104
- const decryptedBuffer = await crypto.subtle.decrypt({ name: "AES-GCM", iv: iv }, cryptoKey, ciphertext);
105
- return new TextDecoder().decode(decryptedBuffer);
75
+ const keyData = encoder.encode(secretKey);
76
+ const baseKey = await crypto.subtle.importKey("raw", keyData, { name: "HKDF" }, false, ["deriveBits"]);
77
+ const derivedBits = await crypto.subtle.deriveBits({
78
+ name: "HKDF",
79
+ hash: "SHA-256",
80
+ salt: salt,
81
+ info: encoder.encode("nuralem_bult_stego_keystream_v1.3.0")
82
+ }, baseKey, length * 8 // Бит саны
83
+ );
84
+ return new Uint8Array(derivedBits);
106
85
  }
107
86
  // =========================================================================
108
87
  // L2 CACHE DATA ENCRYPTION FOR INDEXEDDB SECURE STORAGE
@@ -301,7 +280,7 @@ export class NuralemBult {
301
280
  // Кэшті пайдаланушының secretKey кілті арқылы инициализациялау (PBKDF2 L2 Key)
302
281
  await this.instance.cache.init(secretKey);
303
282
  this.instance.isInitialized = true;
304
- console.log("[NuralemBult] SDK v1.2.0 Enterprise Hardened initialized successfully.");
283
+ console.log("[NuralemBult] SDK v1.3.0 Battle-Hardened Production Core initialized.");
305
284
  }
306
285
  return this.instance;
307
286
  }
@@ -371,8 +350,18 @@ export class NuralemBult {
371
350
  const stegoPngBytes = await sdk.downloadFileWithRetry(key);
372
351
  if (!stegoPngBytes)
373
352
  return null;
374
- const encryptedBytes = await sdk.extractBytesFromPngNative(stegoPngBytes);
375
- const decryptedJsonWrapper = await decryptDataNative(encryptedBytes, sdk.secretKey);
353
+ // 1. Стего-суреттен 16-байттық Dynamic Salt пен шифрланған деректерді оқу
354
+ const { encryptedBytes, dynamicSalt } = await sdk.extractBytesFromPngNative(stegoPngBytes);
355
+ // 2. Дерекке бірегей Dynamic Salt арқылы PBKDF2 кілтін алу
356
+ const aesKey = await deriveAesKey(sdk.secretKey, dynamicSalt);
357
+ // 3. Дешифрлеу
358
+ if (encryptedBytes.length < 12) {
359
+ throw new Error("Decryption Error: Encrypted data too short under Nuralem Bult Security");
360
+ }
361
+ const iv = encryptedBytes.slice(0, 12);
362
+ const ciphertext = encryptedBytes.slice(12);
363
+ const decryptedBuffer = await crypto.subtle.decrypt({ name: "AES-GCM", iv: iv }, aesKey, ciphertext);
364
+ const decryptedJsonWrapper = new TextDecoder().decode(decryptedBuffer);
376
365
  const wrapperObject = JSON.parse(decryptedJsonWrapper);
377
366
  const rawBytes = base64ToBytes(wrapperObject.data);
378
367
  const decodedString = new TextDecoder().decode(rawBytes);
@@ -387,8 +376,15 @@ export class NuralemBult {
387
376
  console.log(`[NuralemBult] Бөлшектенген файл табылды (${parsedData.chunks.length} бөлшек). Біріктіру басталды...`);
388
377
  const chunkPromises = parsedData.chunks.map(async (chunkFileId) => {
389
378
  const chunkPng = await sdk.downloadFileWithRetry(chunkFileId);
390
- const chunkEncrypted = await sdk.extractBytesFromPngNative(chunkPng);
391
- const chunkDecryptedWrapper = await decryptDataNative(chunkEncrypted, sdk.secretKey);
379
+ const { encryptedBytes: chunkEncrypted, dynamicSalt: chunkSalt } = await sdk.extractBytesFromPngNative(chunkPng);
380
+ const chunkAesKey = await deriveAesKey(sdk.secretKey, chunkSalt);
381
+ if (chunkEncrypted.length < 12) {
382
+ throw new Error("Decryption Error: Chunk encrypted data too short");
383
+ }
384
+ const chunkIv = chunkEncrypted.slice(0, 12);
385
+ const chunkCiphertext = chunkEncrypted.slice(12);
386
+ const chunkDecryptedBuffer = await crypto.subtle.decrypt({ name: "AES-GCM", iv: chunkIv }, chunkAesKey, chunkCiphertext);
387
+ const chunkDecryptedWrapper = new TextDecoder().decode(chunkDecryptedBuffer);
392
388
  const parsedChunkWrapper = JSON.parse(chunkDecryptedWrapper);
393
389
  return base64ToBytes(parsedChunkWrapper.data);
394
390
  });
@@ -471,8 +467,23 @@ export class NuralemBult {
471
467
  async uploadChunk(key, dataBytes) {
472
468
  const base64Data = bytesToBase64(dataBytes);
473
469
  const jsonPayload = JSON.stringify({ data: base64Data });
474
- const encryptedBytes = await encryptDataNative(jsonPayload, this.secretKey);
475
- const stegoPngBlob = await this.injectBytesToPngNative(encryptedBytes);
470
+ // 1. Әр құжатқа жеке 16-байттық Dynamic Salt генерациялау
471
+ const dynamicSalt = crypto.getRandomValues(new Uint8Array(16));
472
+ // 2. Осы динамикалық салт арқылы PBKDF2 шифрлау кілтін алу
473
+ const aesKey = await deriveAesKey(this.secretKey, dynamicSalt);
474
+ // 3. Негізгі деректі шифрлау
475
+ const encoder = new TextEncoder();
476
+ const payloadBytes = encoder.encode(jsonPayload);
477
+ const iv = crypto.getRandomValues(new Uint8Array(12));
478
+ const encryptedBuffer = await crypto.subtle.encrypt({ name: "AES-GCM", iv: iv }, aesKey, payloadBytes);
479
+ const ciphertextBytes = new Uint8Array(encryptedBuffer);
480
+ const encryptedBytes = new Uint8Array(12 + ciphertextBytes.length);
481
+ encryptedBytes.set(iv, 0);
482
+ encryptedBytes.set(ciphertextBytes, 12);
483
+ // 4. Steganography арқылы суретке жазу (dynamicSalt біріктіріледі)
484
+ const stegoPngBlob = await this.injectBytesToPngNative(encryptedBytes, dynamicSalt);
485
+ // CORS preflight бұғаттаулары мен Failed to fetch желілік қателерді болдырмау үшін ArrayBuffer-ге айналдыру
486
+ const stegoPngBuffer = await stegoPngBlob.arrayBuffer();
476
487
  const response = await fetch(`${this.routerUrl}/api/upload`, {
477
488
  method: "POST",
478
489
  headers: {
@@ -480,7 +491,7 @@ export class NuralemBult {
480
491
  "Content-Type": "application/octet-stream",
481
492
  "X-Document-Key": key
482
493
  },
483
- body: stegoPngBlob
494
+ body: stegoPngBuffer
484
495
  });
485
496
  if (!response.ok) {
486
497
  const errDetail = await response.text();
@@ -501,46 +512,42 @@ export class NuralemBult {
501
512
  }
502
513
  /**
503
514
  * OPAQUE RGB STEGANOGRAPHY (Түстердің қысылуы мен аномалиясынан 100% қорғалған)
504
- * Деректер тек R, G, B арналарының LSB-іне жазылады, ал Alpha арнасы қатаң түрде 255 болып қалады.
505
- * Түстердің қысылуынан (Color Quantization) қорғау үшін 32-байттық Padding және CRC32 Checksum енгізілген.
506
- * Mulberry32 PRNG орнына Web Crypto API нативті AES (Keystream) негізіндегі детерминистік CSPRNG біріктірілген.
515
+ * dynamicSalt бірінші 128 RGB арнасына сызықтық жазылады, қалған stego-деректер
516
+ * нативті HKDF (SHA-256) Keystream CSPRNG негізіндегі секірулермен жазылады.
507
517
  */
508
- async injectBytesToPngNative(payloadBytes) {
518
+ async injectBytesToPngNative(payloadBytes, dynamicSalt) {
509
519
  const payloadLen = payloadBytes.length;
510
- // CRC32 бақылау қосындысын есептеу
511
520
  const payloadCrc = crc32(payloadBytes);
512
521
  // Браузерлік қысу және шеткі пиксель ауытқуларынан қорғайтын 32-байттық нөлдік Padding
513
522
  const paddingLen = 32;
514
523
  const paddingBytes = new Uint8Array(paddingLen);
515
- // Жалпы құрылым: [4 байт: payloadLen] [4 байт: CRC32] [payloadBytes] [32 байт: Padding]
516
- const totalLen = 4 + 4 + payloadLen + paddingLen;
517
- const payloadWithLen = new Uint8Array(totalLen);
524
+ // Қалған stego-деректер блогы: [4 байт: payloadLen] [4 байт: CRC32] [payloadBytes] [32 байт: Padding]
525
+ const remainingLen = 4 + 4 + payloadLen + paddingLen;
526
+ const remainingPayload = new Uint8Array(remainingLen);
518
527
  // 1. Ұзындығы (Big-Endian)
519
528
  const lenBytes = new Uint8Array(new Uint32Array([payloadLen]).buffer).reverse();
520
- payloadWithLen.set(lenBytes, 0);
529
+ remainingPayload.set(lenBytes, 0);
521
530
  // 2. CRC32 Checksum (Big-Endian)
522
531
  const crcBytes = new Uint8Array(new Uint32Array([payloadCrc]).buffer).reverse();
523
- payloadWithLen.set(crcBytes, 4);
532
+ remainingPayload.set(crcBytes, 4);
524
533
  // 3. Шифрланған негізгі деректер
525
- payloadWithLen.set(payloadBytes, 8);
534
+ remainingPayload.set(payloadBytes, 8);
526
535
  // 4. Тұрақтандырушы Padding
527
- payloadWithLen.set(paddingBytes, 8 + payloadLen);
528
- const totalBits = payloadWithLen.length * 8;
536
+ remainingPayload.set(paddingBytes, 8 + payloadLen);
537
+ const totalBits = 128 + remainingPayload.length * 8; // 128 бит dynamicSalt үшін
529
538
  const totalPixels = Math.ceil(totalBits / 3); // Әр пиксельде 3 бит (RGB LSB)
530
539
  const size = Math.ceil(Math.sqrt(totalPixels)) + 4;
531
540
  const totalRgbBytes = size * size * 3;
532
- // Нативті PBKDF2 және AES-GCM арқылы детерминистік CSPRNG (Keystream) алу
533
- const aesKey = await deriveAesKey(this.secretKey);
534
- const keystream = await generateDeterministicKeystream(aesKey, totalRgbBytes);
541
+ // Нативті HKDF Expansion арқылы детерминистік CSPRNG (Keystream) алу
542
+ const keystream = await generateHkdfKeystream(this.secretKey, dynamicSalt, totalRgbBytes);
535
543
  let keystreamIdx = 0;
536
544
  const getNextCryptoRand = () => {
537
545
  const byteVal = keystream[keystreamIdx++];
538
- return byteVal / 256; // 0-ден 1-ге дейінгі floating кездейсоқ санын алу
546
+ return byteVal / 256;
539
547
  };
540
548
  const canvas = document.createElement("canvas");
541
549
  canvas.width = size;
542
550
  canvas.height = size;
543
- // srgb түстік кеңістігін орнату арқылы браузер деңгейіндегі бұрмалаудың алдын алу
544
551
  const ctx = canvas.getContext("2d", { colorSpace: "srgb" });
545
552
  const grad = ctx.createLinearGradient(0, 0, size, size);
546
553
  grad.addColorStop(0, "#1f4068");
@@ -550,23 +557,34 @@ export class NuralemBult {
550
557
  ctx.fillRect(0, 0, size, size);
551
558
  const imageData = ctx.getImageData(0, 0, size, size);
552
559
  const pixels = imageData.data;
553
- let idx = 0;
554
- for (let i = 0; i < totalBits; i++) {
560
+ // 1-Қадам: dynamicSalt-ты сызықтық түрде бірінші 128 RGB арнасына жазу (PRNG-сіз)
561
+ for (let i = 0; i < 128; i++) {
562
+ const bytePos = Math.floor(i / 8);
563
+ const bitPos = 7 - (i % 8);
564
+ const bit = (dynamicSalt[bytePos] >> bitPos) & 1;
565
+ const pixelIdx = Math.floor(i / 3);
566
+ const channel = i % 3;
567
+ const actualFlatIdx = pixelIdx * 4 + channel;
568
+ pixels[actualFlatIdx] = (pixels[actualFlatIdx] & 0xFE) | bit;
569
+ }
570
+ // 2-Қадам: Қалған stego-деректерді HKDF Spacing арқылы 128-ші арнадан бастап жазу
571
+ let idx = 128;
572
+ const remainingBits = remainingPayload.length * 8;
573
+ for (let i = 0; i < remainingBits; i++) {
555
574
  const remainingBytes = totalRgbBytes - idx;
556
- const remainingBits = totalBits - i;
557
- const max_step = Math.floor(remainingBytes / remainingBits);
575
+ const remainingBitsCount = remainingBits - i;
576
+ const max_step = Math.floor(remainingBytes / remainingBitsCount);
558
577
  const step = max_step > 1 ? Math.floor(getNextCryptoRand() * max_step) + 1 : 1;
559
578
  idx += step;
560
579
  const rgbByteIdx = idx - 1;
561
580
  // Битті анықтау
562
581
  const bytePos = Math.floor(i / 8);
563
582
  const bitPos = 7 - (i % 8);
564
- const bit = (payloadWithLen[bytePos] >> bitPos) & 1;
583
+ const bit = (remainingPayload[bytePos] >> bitPos) & 1;
565
584
  // RGB индексін pixel RGBA индексіне көшіру (Alpha қатаң түрде 255 болып қалады)
566
585
  const pixelIdx = Math.floor(rgbByteIdx / 3);
567
586
  const channel = rgbByteIdx % 3; // 0: R, 1: G, 2: B
568
587
  const actualFlatIdx = pixelIdx * 4 + channel;
569
- // Байттың LSB-ін жаңарту
570
588
  pixels[actualFlatIdx] = (pixels[actualFlatIdx] & 0xFE) | bit;
571
589
  }
572
590
  // Alpha арнасын 255 (толық ашық емес) етіп бекіту
@@ -579,8 +597,9 @@ export class NuralemBult {
579
597
  });
580
598
  }
581
599
  /**
582
- * OPAQUE RGB STEGANOGRAPHY арқылы жазылған деректі пиксельдерден оқу
583
- * CRC32 бақылау қосындысын және белсенді Padding құрылымын автоматты түрде CSPRNG арқылы тексереді.
600
+ * OPAQUE RGB STEGANOGRAPHY арқылы жазылған деректі пиксельдерден оқу.
601
+ * Алдымен бірінші 128 арнадан сызықтық түрде Dynamic Salt оқылады,
602
+ * содан кейін HKDF CSPRNG арқылы қалған stego-деректер оқылып, CRC32 тексеріледі.
584
603
  */
585
604
  async extractBytesFromPngNative(stegoPngBytes) {
586
605
  const blob = new Blob([stegoPngBytes], { type: "image/png" });
@@ -597,16 +616,26 @@ export class NuralemBult {
597
616
  const imageData = ctx.getImageData(0, 0, img.width, img.height);
598
617
  const pixels = imageData.data;
599
618
  const totalRgbBytes = img.width * img.height * 3;
600
- // Нативті PBKDF2 және AES-GCM арқылы детерминистік CSPRNG (Keystream) алу
601
- const aesKey = await deriveAesKey(this.secretKey);
602
- const keystream = await generateDeterministicKeystream(aesKey, totalRgbBytes);
619
+ // 1-Қадам: Бірінші 128 RGB арнасынан dynamicSalt-ты сызықтық оқу
620
+ const dynamicSalt = new Uint8Array(16);
621
+ for (let i = 0; i < 128; i++) {
622
+ const pixelIdx = Math.floor(i / 3);
623
+ const channel = i % 3;
624
+ const actualFlatIdx = pixelIdx * 4 + channel;
625
+ const bit = pixels[actualFlatIdx] & 1;
626
+ const bytePos = Math.floor(i / 8);
627
+ const bitPos = 7 - (i % 8);
628
+ dynamicSalt[bytePos] |= bit << bitPos;
629
+ }
630
+ // 2-Қадам: Оқылған dynamicSalt арқылы HKDF Expansion Keystream генерациялау
631
+ const keystream = await generateHkdfKeystream(this.secretKey, dynamicSalt, totalRgbBytes);
603
632
  let keystreamIdx = 0;
604
633
  const getNextCryptoRand = () => {
605
634
  const byteVal = keystream[keystreamIdx++];
606
635
  return byteVal / 256;
607
636
  };
608
- let idx = 0;
609
- // 1. Ұзындықты оқу (32 бит = 4 байт)
637
+ let idx = 128; // dynamicSalt оқылғаннан кейін жалғастыру
638
+ // 3-Қадам: Ұзындықты оқу (32 бит = 4 байт)
610
639
  const lenBytes = new Uint8Array(4);
611
640
  const lenBits = 32;
612
641
  for (let i = 0; i < lenBits; i++) {
@@ -625,7 +654,7 @@ export class NuralemBult {
625
654
  lenBytes[bytePos] |= bit << bitPos;
626
655
  }
627
656
  const payloadLen = new Uint32Array(lenBytes.reverse().buffer)[0];
628
- // 2. CRC32 бақылау қосындысын оқу (32 бит = 4 байт)
657
+ // 4-Қадам: CRC32 бақылау қосындысын оқу (32 бит = 4 байт)
629
658
  const crcBytes = new Uint8Array(4);
630
659
  const crcBits = 32;
631
660
  for (let i = 0; i < crcBits; i++) {
@@ -644,11 +673,12 @@ export class NuralemBult {
644
673
  crcBytes[bytePos] |= bit << bitPos;
645
674
  }
646
675
  const expectedCrc = new Uint32Array(crcBytes.reverse().buffer)[0];
647
- // Өлшемді және сыйымдылық шегін тексеру (4 + 4 + payloadLen + 32)
648
- const totalRequiredBits = (4 + 4 + payloadLen + 32) * 8;
676
+ // Өлшемді және сыйымдылық шегін тексеру (128 + 4 + 4 + payloadLen + 32)
677
+ const totalRequiredBits = 128 + (4 + 4 + payloadLen + 32) * 8;
649
678
  if (totalRequiredBits > totalRgbBytes) {
650
679
  throw new Error("Decryption failed under Nuralem Bult: Invalid key or corrupted image pixels");
651
680
  }
681
+ // 5-Қадам: Негізгі шифрланған байттарды оқу
652
682
  const totalPayloadBits = payloadLen * 8;
653
683
  const payloadBytes = new Uint8Array(payloadLen);
654
684
  for (let i = 0; i < totalPayloadBits; i++) {
@@ -671,7 +701,7 @@ export class NuralemBult {
671
701
  if (actualCrc !== expectedCrc) {
672
702
  throw new Error(`Decryption failed under Nuralem Bult: CRC32 checksum mismatch (Expected: 0x${expectedCrc.toString(16)}, Got: 0x${actualCrc.toString(16)}). Data is corrupted or color profile alterations occurred.`);
673
703
  }
674
- return payloadBytes;
704
+ return { encryptedBytes: payloadBytes, dynamicSalt };
675
705
  }
676
706
  mergeUint8Arrays(arrays) {
677
707
  let totalLength = arrays.reduce((acc, val) => acc + val.length, 0);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "nuralem-bult-sdk",
3
- "version": "1.2.0",
3
+ "version": "1.3.1",
4
4
  "description": "Serverless Decentralized Document-based polymorphic NoSQL database with client-side caching and storage abstraction adapter. Developed under Nuralem Bult Ecosystem.",
5
5
  "main": "dist/NuralemBult.js",
6
6
  "types": "dist/NuralemBult.d.ts",