{"_id":"@brashkie/signalis-core","_rev":"18-71bbbb614d517ee766e5392528d4c2a0","name":"@brashkie/signalis-core","dist-tags":{"latest":"0.5.2"},"versions":{"0.1.0":{"name":"@brashkie/signalis-core","version":"0.1.0","keywords":["signal-protocol","e2e-encryption","cryptography","curve25519","x25519","hkdf","aes-gcm","aes-cbc","hmac","sha256","rust","napi","native","esm","commonjs","dual-package"],"author":{"url":"Hepein","name":"Brashkie"},"license":"Apache-2.0","_id":"@brashkie/signalis-core@0.1.0","maintainers":[{"name":"brashkie","email":"fabianoarjunken@gmail.com"}],"homepage":"https://github.com/Brashkie/signalis-core#readme","bugs":{"url":"https://github.com/Brashkie/signalis-core/issues"},"dist":{"shasum":"52a732678d73c66379c91b046b2b2fcbc5eabd28","tarball":"https://registry.npmjs.org/@brashkie/signalis-core/-/signalis-core-0.1.0.tgz","fileCount":13,"integrity":"sha512-pm+dX9BOlxBE2KoaFWbEcS06xodkmrPwkmkpfmPuOGwyxpE1lI+/Ess9qakT+rYr26yxoI4YnZAA4aEvk2Gulw==","signatures":[{"sig":"MEQCIHz8L4lwcOXZA7e8i68HlBxnhMaUzlwtn1B+WqPuOKvBAiAoMCpuz26gH2lY21zuzjjsA7TIOteiTaaXa7IqKUdHrQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":269946},"main":"./dist/index.cjs","napi":{"name":"signalis-core","triples":{"defaults":true,"additional":["x86_64-unknown-linux-musl","aarch64-unknown-linux-gnu","aarch64-apple-darwin","aarch64-pc-windows-msvc"]}},"type":"commonjs","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">= 18"},"exports":{".":{"types":{"import":"./dist/index.d.mts","require":"./dist/index.d.cts"},"import":"./dist/index.mjs","default":"./dist/index.cjs","require":"./dist/index.cjs"},"./package.json":"./package.json"},"gitHead":"50a6d20431bb878e567ab232a945523ebc6a5240","scripts":{"lint":"eslint \"src/**/*.ts\" \"__tests__/**/*.ts\"","test":"npm run test:rust && npm run test:vitest && npm run test:dual","build":"npm run build:native && npm run build:ts","clean":"node -e \"const fs=require('fs');['dist','target','index.js','index.d.ts'].forEach(p=>fs.rmSync(p,{recursive:true,force:true}));fs.readdirSync('.').filter(f=>f.endsWith('.node')).forEach(f=>fs.rmSync(f,{force:true}));console.log('✓ Cleaned')\"","clippy":"cargo clippy --workspace --all-targets -- -D warnings","format":"prettier --write \"src/**/*.{ts,js}\" \"__tests__/**/*.ts\"","version":"napi version","build:ts":"tsup","examples":"npm run example:cjs && npm run example:esm && npm run example:ts","artifacts":"napi artifacts","test:dual":"node __tests__/cjs.test.cjs && node __tests__/esm.test.mjs","test:rust":"cargo test --workspace --exclude sc-node","example:ts":"tsx examples/ts-example.ts","test:watch":"cross-env VITE_CJS_IGNORE_WARNING=true vitest","build:debug":"npm run build:native:debug && npm run build:ts","example:cjs":"node examples/cjs-example.cjs","example:esm":"node examples/esm-example.mjs","format:rust":"cargo fmt --all","test:vitest":"cross-env VITE_CJS_IGNORE_WARNING=true vitest run","build:native":"napi build --platform --release --cargo-cwd crates/sc-node --js index.js --dts index.d.ts","preartifacts":"node scripts/create-npm-dirs.js","coverage:open":"node -e \"require('child_process').exec(process.platform==='win32'?'start coverage/index.html':process.platform==='darwin'?'open coverage/index.html':'xdg-open coverage/index.html')\"","test:coverage":"cross-env VITE_CJS_IGNORE_WARNING=true vitest run --coverage","test:coverage:ui":"cross-env VITE_CJS_IGNORE_WARNING=true vitest --coverage --ui","build:native:debug":"napi build --platform --cargo-cwd crates/sc-node --js index.js --dts index.d.ts"},"_npmUser":{"name":"brashkie","email":"fabianoarjunken@gmail.com"},"repository":{"url":"git+https://github.com/Brashkie/signalis-core.git","type":"git"},"_npmVersion":"10.8.2","description":"Cryptographic primitives for Signal Protocol — Rust-powered Node.js library (ESM + CJS + TypeScript)","directories":{},"_nodeVersion":"20.20.2","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.7.0","tsup":"^8.0.1","eslint":"^8.57.0","vitest":"^1.2.0","prettier":"^3.2.0","cross-env":"^7.0.3","@vitest/ui":"^1.2.0","typescript":"^5.3.0","@types/node":"^20.11.0","@napi-rs/cli":"^2.18.4","@vitest/coverage-v8":"^1.2.0","@typescript-eslint/parser":"^7.0.0","@typescript-eslint/eslint-plugin":"^7.0.0"},"optionalDependencies":{"@brashkie/signalis-core-darwin-x64":"0.1.0","@brashkie/signalis-core-darwin-arm64":"0.1.0","@brashkie/signalis-core-linux-x64-gnu":"0.1.0","@brashkie/signalis-core-linux-x64-musl":"0.1.0","@brashkie/signalis-core-win32-x64-msvc":"0.1.0","@brashkie/signalis-core-linux-arm64-gnu":"0.1.0","@brashkie/signalis-core-win32-arm64-msvc":"0.1.0"},"_npmOperationalInternal":{"tmp":"tmp/signalis-core_0.1.0_1778991389279_0.552661804766035","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@brashkie/signalis-core","version":"0.2.0","keywords":["signal-protocol","e2e-encryption","cryptography","curve25519","ed25519","xed25519","x25519","ecdh","diffie-hellman","hkdf","aes-gcm","aes-cbc","aead","hmac","sha256","digital-signature","rust","napi","native","esm","commonjs","dual-package","hepein"],"author":{"url":"Hepein","name":"Brashkie"},"license":"Apache-2.0","_id":"@brashkie/signalis-core@0.2.0","maintainers":[{"name":"brashkie","email":"fabianoarjunken@gmail.com"}],"homepage":"https://github.com/Brashkie/signalis-core#readme","bugs":{"url":"https://github.com/Brashkie/signalis-core/issues"},"dist":{"shasum":"606628065f657328daa4069340c39c9910f65993","tarball":"https://registry.npmjs.org/@brashkie/signalis-core/-/signalis-core-0.2.0.tgz","fileCount":16,"integrity":"sha512-aE+RPt3vpK68SfaB44GkT2lTkBJskMs2T+vLNzeHIkfpYpY2oBd7TqvkehY+v9Y3zdqtAw+/NeqGXov7F2BfNw==","signatures":[{"sig":"MEQCIFA2xTWmkb0TF3XUZ3dlQWNqQlwxIY9ylhfRU31lM/QpAiAsZqws6efObtGNYJAHVCfqKyRn4O5MGX4JtPBLFom4Kg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":371255},"main":"./dist/index.cjs","napi":{"name":"signalis-core","triples":{"defaults":true,"additional":["x86_64-unknown-linux-musl","aarch64-unknown-linux-gnu","aarch64-apple-darwin","aarch64-pc-windows-msvc"]}},"type":"commonjs","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">= 18"},"exports":{".":{"types":{"import":"./dist/index.d.mts","require":"./dist/index.d.cts"},"import":"./dist/index.mjs","default":"./dist/index.cjs","require":"./dist/index.cjs"},"./package.json":"./package.json"},"gitHead":"77b4f078c362be039b985c95adc2b793c2e36958","scripts":{"lint":"eslint \"src/**/*.ts\" \"__tests__/**/*.ts\"","test":"npm run test:rust && npm run test:vitest && npm run test:dual","build":"npm run build:native && npm run build:ts","clean":"node -e \"const fs=require('fs');['dist','target','index.js','index.d.ts'].forEach(p=>fs.rmSync(p,{recursive:true,force:true}));fs.readdirSync('.').filter(f=>f.endsWith('.node')).forEach(f=>fs.rmSync(f,{force:true}));console.log('✓ Cleaned')\"","clippy":"cargo clippy --workspace --all-targets -- -D warnings","format":"prettier --write \"src/**/*.{ts,js}\" \"__tests__/**/*.ts\"","version":"napi version","build:ts":"tsup","examples":"npm run example:cjs && npm run example:esm && npm run example:ts && npm run example:signing && npm run example:aad && npm run example:e2e","artifacts":"napi artifacts","test:dual":"node __tests__/cjs.test.cjs && node __tests__/esm.test.mjs","test:rust":"cargo test --workspace --exclude sc-node","example:ts":"tsx examples/ts-example.ts","test:watch":"cross-env VITE_CJS_IGNORE_WARNING=true vitest","build:debug":"npm run build:native:debug && npm run build:ts","example:aad":"node examples/aad.mjs","example:cjs":"node examples/cjs-example.cjs","example:e2e":"node examples/e2e-channel.mjs","example:esm":"node examples/esm-example.mjs","format:rust":"cargo fmt --all","test:vitest":"cross-env VITE_CJS_IGNORE_WARNING=true vitest run","build:native":"napi build --platform --release --cargo-cwd crates/sc-node --js index.js --dts index.d.ts","preartifacts":"node scripts/create-npm-dirs.js","coverage:open":"node -e \"require('child_process').exec(process.platform==='win32'?'start coverage/index.html':process.platform==='darwin'?'open coverage/index.html':'xdg-open coverage/index.html')\"","test:coverage":"cross-env VITE_CJS_IGNORE_WARNING=true vitest run --coverage","example:signing":"node examples/signing.mjs","test:coverage:ui":"cross-env VITE_CJS_IGNORE_WARNING=true vitest --coverage --ui","build:native:debug":"napi build --platform --cargo-cwd crates/sc-node --js index.js --dts index.d.ts"},"_npmUser":{"name":"brashkie","email":"fabianoarjunken@gmail.com"},"repository":{"url":"git+https://github.com/Brashkie/signalis-core.git","type":"git"},"_npmVersion":"10.8.2","description":"Cryptographic primitives for Signal Protocol — Rust-powered Node.js library with Ed25519, XEd25519, Curve25519, HKDF, AES-GCM (with AAD), AES-CBC, HMAC, SHA-256 (ESM + CJS + TypeScript)","directories":{},"_nodeVersion":"20.20.2","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","tsup":"^8.5.0","eslint":"^9.0.0","vitest":"^3.0.0","prettier":"^3.3.0","cross-env":"^7.0.3","@vitest/ui":"^3.0.0","typescript":"^6.0.3","@types/node":"^22.0.0","@napi-rs/cli":"^2.18.4","@vitest/coverage-v8":"^3.0.0","@typescript-eslint/parser":"^8.0.0","@typescript-eslint/eslint-plugin":"^8.0.0"},"optionalDependencies":{"@brashkie/signalis-core-darwin-x64":"0.2.0","@brashkie/signalis-core-darwin-arm64":"0.2.0","@brashkie/signalis-core-linux-x64-gnu":"0.2.0","@brashkie/signalis-core-linux-x64-musl":"0.2.0","@brashkie/signalis-core-win32-x64-msvc":"0.2.0","@brashkie/signalis-core-linux-arm64-gnu":"0.2.0","@brashkie/signalis-core-win32-arm64-msvc":"0.2.0"},"_npmOperationalInternal":{"tmp":"tmp/signalis-core_0.2.0_1779576954363_0.36075501140612487","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@brashkie/signalis-core","version":"0.3.0","keywords":["signal-protocol","e2e-encryption","cryptography","curve25519","ed25519","xed25519","x25519","ecdh","diffie-hellman","hkdf","aes-gcm","aes-cbc","aead","hmac","sha256","digital-signature","rust","napi","native","esm","commonjs","dual-package","hepein"],"author":{"url":"Hepein","name":"Brashkie"},"license":"Apache-2.0","_id":"@brashkie/signalis-core@0.3.0","maintainers":[{"name":"brashkie","email":"fabianoarjunken@gmail.com"}],"homepage":"https://github.com/Brashkie/signalis-core#readme","bugs":{"url":"https://github.com/Brashkie/signalis-core/issues"},"dist":{"shasum":"0a0a0c33399dde5a1002eb60576190d75a4f0708","tarball":"https://registry.npmjs.org/@brashkie/signalis-core/-/signalis-core-0.3.0.tgz","fileCount":16,"integrity":"sha512-OFMEwku8xHHShjK/6cPzPtCRxTHc9NmsGpFkI0FYYye8Ga2PZWn9xTRPNI7YlvTeTGPMK9h3XDsWOAeqzT0g0w==","signatures":[{"sig":"MEYCIQDuCLlpwWlU8rkcLmtbNz1cNyQbZuNj+jMjNvQEfJaxLAIhANQUMSUmXWmxoCEtFqQoUUwa6DXJpSxPmnkhx3c5/W9J","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":420239},"main":"./dist/index.cjs","napi":{"name":"signalis-core","triples":{"defaults":true,"additional":["x86_64-unknown-linux-musl","aarch64-unknown-linux-gnu","aarch64-apple-darwin","aarch64-pc-windows-msvc","aarch64-linux-android","armv7-linux-androideabi"]}},"type":"commonjs","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">= 18"},"exports":{".":{"types":{"import":"./dist/index.d.mts","require":"./dist/index.d.cts"},"import":"./dist/index.mjs","default":"./dist/index.cjs","require":"./dist/index.cjs"},"./package.json":"./package.json"},"gitHead":"ecf4af825bee3696e1a189c4776498c9c9614eff","scripts":{"lint":"eslint \"src/**/*.ts\" \"__tests__/**/*.ts\"","test":"npm run test:rust && npm run test:vitest && npm run test:dual","build":"npm run build:native && npm run build:ts","clean":"node -e \"const fs=require('fs');['dist','target','index.js','index.d.ts'].forEach(p=>fs.rmSync(p,{recursive:true,force:true}));fs.readdirSync('.').filter(f=>f.endsWith('.node')).forEach(f=>fs.rmSync(f,{force:true}));console.log('✓ Cleaned')\"","clippy":"cargo clippy --workspace --all-targets -- -D warnings","format":"prettier --write \"src/**/*.{ts,js}\" \"__tests__/**/*.ts\"","version":"napi version","build:ts":"tsup","examples":"npm run example:cjs && npm run example:esm && npm run example:ts && npm run example:signing && npm run example:aad && npm run example:e2e","artifacts":"napi artifacts","test:dual":"node __tests__/cjs.test.cjs && node __tests__/esm.test.mjs","test:rust":"cargo test --workspace --exclude sc-node","example:ts":"tsx examples/ts-example.ts","test:watch":"cross-env VITE_CJS_IGNORE_WARNING=true vitest","build:debug":"npm run build:native:debug && npm run build:ts","example:aad":"node examples/aad.mjs","example:cjs":"node examples/cjs-example.cjs","example:e2e":"node examples/e2e-channel.mjs","example:esm":"node examples/esm-example.mjs","format:rust":"cargo fmt --all","test:vitest":"cross-env VITE_CJS_IGNORE_WARNING=true vitest run","build:native":"napi build --platform --release --cargo-cwd crates/sc-node --js index.js --dts index.d.ts","preartifacts":"node scripts/create-npm-dirs.js","coverage:open":"node -e \"require('child_process').exec(process.platform==='win32'?'start coverage/index.html':process.platform==='darwin'?'open coverage/index.html':'xdg-open coverage/index.html')\"","test:coverage":"cross-env VITE_CJS_IGNORE_WARNING=true vitest run --coverage","example:signing":"node examples/signing.mjs","test:coverage:ui":"cross-env VITE_CJS_IGNORE_WARNING=true vitest --coverage --ui","build:native:debug":"napi build --platform --cargo-cwd crates/sc-node --js index.js --dts index.d.ts"},"_npmUser":{"name":"brashkie","email":"fabianoarjunken@gmail.com"},"repository":{"url":"git+https://github.com/Brashkie/signalis-core.git","type":"git"},"_npmVersion":"10.8.2","description":"Cryptographic primitives for Signal Protocol — Rust-powered Node.js library with Ed25519, XEd25519, Curve25519, HKDF, AES-GCM (with AAD), AES-CBC, ChaCha20-Poly1305, HMAC, SHA-256 (ESM + CJS + TypeScript). Android arm64/armv7 support.","directories":{},"_nodeVersion":"20.20.2","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","tsup":"^8.5.0","eslint":"^9.0.0","vitest":"^3.0.0","prettier":"^3.3.0","cross-env":"^7.0.3","@vitest/ui":"^3.0.0","typescript":"^6.0.3","@types/node":"^22.0.0","@napi-rs/cli":"^2.18.4","@vitest/coverage-v8":"^3.0.0","@typescript-eslint/parser":"^8.0.0","@typescript-eslint/eslint-plugin":"^8.0.0"},"optionalDependencies":{"@brashkie/signalis-core-darwin-x64":"0.3.0","@brashkie/signalis-core-darwin-arm64":"0.3.0","@brashkie/signalis-core-android-arm64":"0.3.0","@brashkie/signalis-core-linux-x64-gnu":"0.3.0","@brashkie/signalis-core-linux-x64-musl":"0.3.0","@brashkie/signalis-core-win32-x64-msvc":"0.3.0","@brashkie/signalis-core-linux-arm64-gnu":"0.3.0","@brashkie/signalis-core-android-arm-eabi":"0.3.0","@brashkie/signalis-core-win32-arm64-msvc":"0.3.0"},"_npmOperationalInternal":{"tmp":"tmp/signalis-core_0.3.0_1781880757863_0.09121510299825886","host":"s3://npm-registry-packages-npm-production"}},"0.3.1":{"name":"@brashkie/signalis-core","version":"0.3.1","keywords":["signal-protocol","e2e-encryption","cryptography","curve25519","ed25519","xed25519","x25519","ecdh","diffie-hellman","hkdf","aes-gcm","aes-cbc","aead","hmac","sha256","digital-signature","rust","napi","native","esm","commonjs","dual-package","hepein"],"author":{"url":"Hepein","name":"Brashkie"},"license":"Apache-2.0","_id":"@brashkie/signalis-core@0.3.1","maintainers":[{"name":"brashkie","email":"fabianoarjunken@gmail.com"}],"homepage":"https://github.com/Brashkie/signalis-core#readme","bugs":{"url":"https://github.com/Brashkie/signalis-core/issues"},"dist":{"shasum":"7d41ae2f206bc36546c1db67ba42e822b53ea4be","tarball":"https://registry.npmjs.org/@brashkie/signalis-core/-/signalis-core-0.3.1.tgz","fileCount":16,"integrity":"sha512-GTFqmZsaRaSmOVQsKp95PSc6RiLFwfQob5DzfXH5rrm+zhbD4MHhrQldHnT5s1piW3ZGO7WRu07MJ7IzEXZNSg==","signatures":[{"sig":"MEUCIBjGP97GBgEF9LwPQmuV2lITRTFfHtk29hS9Vb+jNcEAAiEA8dkFL93+rczgjsImedWlEkrGPNMyl9FIv+5N+ko5hMY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":420239},"main":"./dist/index.cjs","napi":{"name":"signalis-core","triples":{"defaults":true,"additional":["x86_64-unknown-linux-musl","aarch64-unknown-linux-gnu","aarch64-apple-darwin","aarch64-pc-windows-msvc","aarch64-linux-android","armv7-linux-androideabi"]}},"type":"commonjs","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">= 18"},"exports":{".":{"types":{"import":"./dist/index.d.mts","require":"./dist/index.d.cts"},"import":"./dist/index.mjs","default":"./dist/index.cjs","require":"./dist/index.cjs"},"./package.json":"./package.json"},"gitHead":"7a79a6605a952f46d62fffbeffd14024e76042ec","scripts":{"lint":"eslint \"src/**/*.ts\" \"__tests__/**/*.ts\"","test":"npm run test:rust && npm run test:vitest && npm run test:dual","build":"npm run build:native && npm run build:ts","clean":"node -e \"const fs=require('fs');['dist','target','index.js','index.d.ts'].forEach(p=>fs.rmSync(p,{recursive:true,force:true}));fs.readdirSync('.').filter(f=>f.endsWith('.node')).forEach(f=>fs.rmSync(f,{force:true}));console.log('✓ Cleaned')\"","clippy":"cargo clippy --workspace --all-targets -- -D warnings","format":"prettier --write \"src/**/*.{ts,js}\" \"__tests__/**/*.ts\"","version":"napi version","build:ts":"tsup","examples":"npm run example:cjs && npm run example:esm && npm run example:ts && npm run example:signing && npm run example:aad && npm run example:e2e","artifacts":"napi artifacts","test:dual":"node __tests__/cjs.test.cjs && node __tests__/esm.test.mjs","test:rust":"cargo test --workspace --exclude sc-node","example:ts":"tsx examples/ts-example.ts","test:watch":"cross-env VITE_CJS_IGNORE_WARNING=true vitest","build:debug":"npm run build:native:debug && npm run build:ts","example:aad":"node examples/aad.mjs","example:cjs":"node examples/cjs-example.cjs","example:e2e":"node examples/e2e-channel.mjs","example:esm":"node examples/esm-example.mjs","format:rust":"cargo fmt --all","test:vitest":"cross-env VITE_CJS_IGNORE_WARNING=true vitest run","build:native":"napi build --platform --release --cargo-cwd crates/sc-node --js index.js --dts index.d.ts","preartifacts":"node scripts/create-npm-dirs.js","coverage:open":"node -e \"require('child_process').exec(process.platform==='win32'?'start coverage/index.html':process.platform==='darwin'?'open coverage/index.html':'xdg-open coverage/index.html')\"","test:coverage":"cross-env VITE_CJS_IGNORE_WARNING=true vitest run --coverage","example:signing":"node examples/signing.mjs","test:coverage:ui":"cross-env VITE_CJS_IGNORE_WARNING=true vitest --coverage --ui","build:native:debug":"napi build --platform --cargo-cwd crates/sc-node --js index.js --dts index.d.ts"},"_npmUser":{"name":"brashkie","email":"fabianoarjunken@gmail.com"},"repository":{"url":"git+https://github.com/Brashkie/signalis-core.git","type":"git"},"_npmVersion":"10.8.2","description":"Cryptographic primitives for Signal Protocol — Rust-powered Node.js library with Ed25519, XEd25519, Curve25519, HKDF, AES-GCM (with AAD), AES-CBC, ChaCha20-Poly1305, HMAC, SHA-256 (ESM + CJS + TypeScript). Android arm64/armv7 support.","directories":{},"_nodeVersion":"20.20.2","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","tsup":"^8.5.0","eslint":"^9.0.0","vitest":"^3.0.0","prettier":"^3.3.0","cross-env":"^7.0.3","@vitest/ui":"^3.0.0","typescript":"^6.0.3","@types/node":"^22.0.0","@napi-rs/cli":"^2.18.4","@vitest/coverage-v8":"^3.0.0","@typescript-eslint/parser":"^8.0.0","@typescript-eslint/eslint-plugin":"^8.0.0"},"optionalDependencies":{"@brashkie/signalis-core-darwin-x64":"0.3.1","@brashkie/signalis-core-darwin-arm64":"0.3.1","@brashkie/signalis-core-android-arm64":"0.3.1","@brashkie/signalis-core-linux-x64-gnu":"0.3.1","@brashkie/signalis-core-linux-x64-musl":"0.3.1","@brashkie/signalis-core-win32-x64-msvc":"0.3.1","@brashkie/signalis-core-linux-arm64-gnu":"0.3.1","@brashkie/signalis-core-android-arm-eabi":"0.3.1","@brashkie/signalis-core-win32-arm64-msvc":"0.3.1"},"_npmOperationalInternal":{"tmp":"tmp/signalis-core_0.3.1_1782266142020_0.9063959462462097","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@brashkie/signalis-core","version":"0.4.0","keywords":["signal-protocol","e2e-encryption","cryptography","curve25519","ed25519","xed25519","x25519","ecdh","diffie-hellman","hkdf","aes-gcm","aes-cbc","aead","hmac","sha256","digital-signature","rust","napi","native","esm","commonjs","dual-package","hepein"],"author":{"url":"Hepein","name":"Brashkie"},"license":"Apache-2.0","_id":"@brashkie/signalis-core@0.4.0","maintainers":[{"name":"brashkie","email":"fabianoarjunken@gmail.com"}],"homepage":"https://github.com/Brashkie/signalis-core#readme","bugs":{"url":"https://github.com/Brashkie/signalis-core/issues"},"dist":{"shasum":"d9fbf8ef1a6dee06461087b3b03694c2fd7b773e","tarball":"https://registry.npmjs.org/@brashkie/signalis-core/-/signalis-core-0.4.0.tgz","fileCount":16,"integrity":"sha512-4FpVYl2qS+6h3aFYNxVKANmfz19JoALoqNk6FlQ1uFyGHTG4Hcj7SV4qY8GYcnAk5M7tqIu0/UMU7BFAJtgaqA==","signatures":[{"sig":"MEYCIQDLc+Uk/gIe6N8rNqbFnC9B2RS+hw83nnNhczYvtsIO/gIhAIskQbqQIpI2yniXv2Y+Hxv8mSkF9jkoidyI7btodhOZ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":470098},"main":"./dist/index.cjs","napi":{"name":"signalis-core","triples":{"defaults":true,"additional":["x86_64-unknown-linux-musl","aarch64-unknown-linux-gnu","aarch64-apple-darwin","aarch64-pc-windows-msvc","aarch64-linux-android","armv7-linux-androideabi","x86_64-linux-android"]}},"type":"commonjs","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">= 18"},"exports":{".":{"types":{"import":"./dist/index.d.mts","require":"./dist/index.d.cts"},"import":"./dist/index.mjs","default":"./dist/index.cjs","require":"./dist/index.cjs"},"./package.json":"./package.json"},"gitHead":"c9810bfa04387360d06b5041a20b2c2a9d5b79f5","scripts":{"lint":"eslint \"src/**/*.ts\" \"__tests__/**/*.ts\"","test":"npm run test:rust && npm run test:vitest && npm run test:dual","build":"npm run build:native && npm run build:ts","clean":"node -e \"const fs=require('fs');['dist','target','index.js','index.d.ts'].forEach(p=>fs.rmSync(p,{recursive:true,force:true}));fs.readdirSync('.').filter(f=>f.endsWith('.node')).forEach(f=>fs.rmSync(f,{force:true}));console.log('✓ Cleaned')\"","clippy":"cargo clippy --workspace --all-targets -- -D warnings","format":"prettier --write \"src/**/*.{ts,js}\" \"__tests__/**/*.ts\"","version":"napi version","build:ts":"tsup","examples":"npm run example:cjs && npm run example:esm && npm run example:ts && npm run example:signing && npm run example:aad && npm run example:e2e","artifacts":"napi artifacts","test:dual":"node __tests__/cjs.test.cjs && node __tests__/esm.test.mjs","test:rust":"cargo test --workspace --exclude sc-node","typecheck":"tsc --noEmit","example:ts":"tsx examples/ts-example.ts","test:watch":"cross-env VITE_CJS_IGNORE_WARNING=true vitest","build:debug":"npm run build:native:debug && npm run build:ts","example:aad":"node examples/aad.mjs","example:cjs":"node examples/cjs-example.cjs","example:e2e":"node examples/e2e-channel.mjs","example:esm":"node examples/esm-example.mjs","format:rust":"cargo fmt --all","test:vitest":"cross-env VITE_CJS_IGNORE_WARNING=true vitest run","build:native":"napi build --platform --release --cargo-cwd crates/sc-node --js index.js --dts index.d.ts","preartifacts":"node scripts/create-npm-dirs.js","coverage:open":"node -e \"require('child_process').exec(process.platform==='win32'?'start coverage/index.html':process.platform==='darwin'?'open coverage/index.html':'xdg-open coverage/index.html')\"","test:coverage":"cross-env VITE_CJS_IGNORE_WARNING=true vitest run --coverage","example:signing":"node examples/signing.mjs","test:coverage:ui":"cross-env VITE_CJS_IGNORE_WARNING=true vitest --coverage --ui","build:native:debug":"napi build --platform --cargo-cwd crates/sc-node --js index.js --dts index.d.ts"},"_npmUser":{"name":"brashkie","email":"fabianoarjunken@gmail.com"},"repository":{"url":"git+https://github.com/Brashkie/signalis-core.git","type":"git"},"_npmVersion":"10.8.2","description":"Cryptographic primitives for Signal Protocol — Rust-powered Node.js library with Ed25519, XEd25519, Curve25519, HKDF, AES-GCM (with AAD), AES-CBC, ChaCha20-Poly1305, HMAC, SHA-256 (ESM + CJS + TypeScript). Android arm64/armv7 support.","directories":{},"_nodeVersion":"20.20.2","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","tsup":"^8.5.0","eslint":"^9.0.0","vitest":"^3.0.0","prettier":"^3.3.0","cross-env":"^7.0.3","@vitest/ui":"^3.0.0","typescript":"^6.0.3","@types/node":"^22.0.0","@napi-rs/cli":"^2.18.4","@vitest/coverage-v8":"^3.0.0","@typescript-eslint/parser":"^8.0.0","@typescript-eslint/eslint-plugin":"^8.0.0"},"optionalDependencies":{"@brashkie/signalis-core-darwin-x64":"0.4.0","@brashkie/signalis-core-android-x64":"0.4.0","@brashkie/signalis-core-darwin-arm64":"0.4.0","@brashkie/signalis-core-android-arm64":"0.4.0","@brashkie/signalis-core-linux-x64-gnu":"0.4.0","@brashkie/signalis-core-linux-x64-musl":"0.4.0","@brashkie/signalis-core-win32-x64-msvc":"0.4.0","@brashkie/signalis-core-linux-arm64-gnu":"0.4.0","@brashkie/signalis-core-android-arm-eabi":"0.4.0","@brashkie/signalis-core-win32-arm64-msvc":"0.4.0"},"_npmOperationalInternal":{"tmp":"tmp/signalis-core_0.4.0_1783746788543_0.9164682651953027","host":"s3://npm-registry-packages-npm-production"}},"0.4.1":{"name":"@brashkie/signalis-core","version":"0.4.1","keywords":["signal-protocol","e2e-encryption","cryptography","curve25519","ed25519","xed25519","x25519","ecdh","diffie-hellman","hkdf","aes-gcm","aes-cbc","aead","hmac","sha256","digital-signature","rust","napi","native","esm","commonjs","dual-package","hepein"],"author":{"url":"Hepein","name":"Brashkie"},"license":"Apache-2.0","_id":"@brashkie/signalis-core@0.4.1","maintainers":[{"name":"brashkie","email":"fabianoarjunken@gmail.com"}],"homepage":"https://github.com/Brashkie/signalis-core#readme","bugs":{"url":"https://github.com/Brashkie/signalis-core/issues"},"dist":{"shasum":"bff75415bf7b0d39f48794742e39f7cb1c0d9cf7","tarball":"https://registry.npmjs.org/@brashkie/signalis-core/-/signalis-core-0.4.1.tgz","fileCount":16,"integrity":"sha512-kXN+2PWue+xUL4QbTsV2m1V0TswynRTyFs9xaRP0Ifsu4kXu266Srci1Mvu/W8dki6rKWg1DYRdOl6muY6s6tg==","signatures":[{"sig":"MEYCIQDbxvlFsQa0h3xYDZbUkezE/yw6vyMmIQ+GpUDck4KY6gIhAJZx4OGPQHZ4qqiPFCa6lL8JZOwJR90ERaaCGMSpJh/0","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":488110},"main":"./dist/index.cjs","napi":{"name":"signalis-core","triples":{"defaults":true,"additional":["x86_64-unknown-linux-musl","aarch64-unknown-linux-gnu","aarch64-apple-darwin","aarch64-pc-windows-msvc","aarch64-linux-android","armv7-linux-androideabi","x86_64-linux-android"]}},"type":"commonjs","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">= 18"},"exports":{".":{"types":{"import":"./dist/index.d.mts","require":"./dist/index.d.cts"},"import":"./dist/index.mjs","default":"./dist/index.cjs","require":"./dist/index.cjs"},"./package.json":"./package.json"},"gitHead":"91ba72ad1b76ecd3608b4fdfc21a7f358108e027","scripts":{"lint":"eslint \"src/**/*.ts\" \"__tests__/**/*.ts\"","test":"npm run test:rust && npm run test:vitest && npm run test:dual","build":"npm run build:native && npm run build:ts","clean":"node -e \"const fs=require('fs');['dist','target','index.js','index.d.ts'].forEach(p=>fs.rmSync(p,{recursive:true,force:true}));fs.readdirSync('.').filter(f=>f.endsWith('.node')).forEach(f=>fs.rmSync(f,{force:true}));console.log('✓ Cleaned')\"","clippy":"cargo clippy --workspace --all-targets -- -D warnings","format":"prettier --write \"src/**/*.{ts,js}\" \"__tests__/**/*.ts\"","version":"napi version","build:ts":"tsup","examples":"npm run example:cjs && npm run example:esm && npm run example:ts && npm run example:signing && npm run example:aad && npm run example:e2e","artifacts":"napi artifacts","test:dual":"node __tests__/cjs.test.cjs && node __tests__/esm.test.mjs","test:rust":"cargo test --workspace --exclude sc-node","typecheck":"tsc --noEmit","example:ts":"tsx examples/ts-example.ts","test:watch":"cross-env VITE_CJS_IGNORE_WARNING=true vitest","build:debug":"npm run build:native:debug && npm run build:ts","example:aad":"node examples/aad.mjs","example:cjs":"node examples/cjs-example.cjs","example:e2e":"node examples/e2e-channel.mjs","example:esm":"node examples/esm-example.mjs","format:rust":"cargo fmt --all","test:vitest":"cross-env VITE_CJS_IGNORE_WARNING=true vitest run","build:native":"napi build --platform --release --cargo-cwd crates/sc-node --js index.js --dts index.d.ts","preartifacts":"node scripts/create-npm-dirs.js","coverage:open":"node -e \"require('child_process').exec(process.platform==='win32'?'start coverage/index.html':process.platform==='darwin'?'open coverage/index.html':'xdg-open coverage/index.html')\"","test:coverage":"cross-env VITE_CJS_IGNORE_WARNING=true vitest run --coverage","example:signing":"node examples/signing.mjs","test:coverage:ui":"cross-env VITE_CJS_IGNORE_WARNING=true vitest --coverage --ui","build:native:debug":"napi build --platform --cargo-cwd crates/sc-node --js index.js --dts index.d.ts"},"_npmUser":{"name":"brashkie","email":"fabianoarjunken@gmail.com"},"repository":{"url":"git+https://github.com/Brashkie/signalis-core.git","type":"git"},"_npmVersion":"10.8.2","description":"Cryptographic primitives for Signal Protocol — Rust-powered Node.js library with Ed25519, XEd25519, Curve25519, HKDF, AES-GCM (with AAD), AES-CBC, ChaCha20-Poly1305, HMAC, SHA-256 (ESM + CJS + TypeScript). Android arm64/armv7 support.","directories":{},"_nodeVersion":"20.20.2","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","tsup":"^8.5.0","eslint":"^9.0.0","vitest":"^3.0.0","prettier":"^3.3.0","cross-env":"^7.0.3","@vitest/ui":"^3.0.0","typescript":"^6.0.3","@types/node":"^22.0.0","@napi-rs/cli":"^2.18.4","@vitest/coverage-v8":"^3.0.0","@typescript-eslint/parser":"^8.0.0","@typescript-eslint/eslint-plugin":"^8.0.0"},"optionalDependencies":{"@brashkie/signalis-core-darwin-x64":"0.4.1","@brashkie/signalis-core-android-x64":"0.4.1","@brashkie/signalis-core-darwin-arm64":"0.4.1","@brashkie/signalis-core-android-arm64":"0.4.1","@brashkie/signalis-core-linux-x64-gnu":"0.4.1","@brashkie/signalis-core-linux-x64-musl":"0.4.1","@brashkie/signalis-core-win32-x64-msvc":"0.4.1","@brashkie/signalis-core-linux-arm64-gnu":"0.4.1","@brashkie/signalis-core-android-arm-eabi":"0.4.1","@brashkie/signalis-core-win32-arm64-msvc":"0.4.1"},"_npmOperationalInternal":{"tmp":"tmp/signalis-core_0.4.1_1786404213064_0.36872228694395837","host":"s3://npm-registry-packages-npm-production"}},"0.4.2":{"name":"@brashkie/signalis-core","version":"0.4.2","keywords":["signal-protocol","e2e-encryption","cryptography","curve25519","ed25519","xed25519","x25519","ecdh","diffie-hellman","hkdf","aes-gcm","aes-cbc","aead","hmac","sha256","digital-signature","rust","napi","native","esm","commonjs","dual-package","hepein"],"author":{"url":"Hepein","name":"Brashkie"},"license":"Apache-2.0","_id":"@brashkie/signalis-core@0.4.2","maintainers":[{"name":"brashkie","email":"fabianoarjunken@gmail.com"}],"homepage":"https://github.com/Brashkie/signalis-core#readme","bugs":{"url":"https://github.com/Brashkie/signalis-core/issues"},"dist":{"shasum":"1d7916739b1244c587f07f45c36cd756f6c68793","tarball":"https://registry.npmjs.org/@brashkie/signalis-core/-/signalis-core-0.4.2.tgz","fileCount":15,"integrity":"sha512-BqY2eYbIPlL0iZoyjvddT9LtXXtU3PlvsyWw9CDy/JmdufmP3t2/Cr5p3oX4WWv0PZkET0NujTYcV4uBcA2iBQ==","signatures":[{"sig":"MEUCIHthc+k+pxRHcSsQZjbOXhRdSBO/YoIcIFdd+n7Y07+fAiEAna5/+qBdXNg0ebq/i14/qeVmvJbSCjUmJx1Qadne66I=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":482618},"main":"./dist/index.cjs","napi":{"name":"signalis-core","triples":{"defaults":true,"additional":["x86_64-unknown-linux-musl","aarch64-unknown-linux-gnu","aarch64-apple-darwin","aarch64-pc-windows-msvc","aarch64-linux-android","armv7-linux-androideabi","x86_64-linux-android"]}},"type":"commonjs","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">= 18"},"exports":{".":{"types":{"import":"./dist/index.d.mts","require":"./dist/index.d.cts"},"import":"./dist/index.mjs","default":"./dist/index.cjs","require":"./dist/index.cjs"},"./package.json":"./package.json"},"gitHead":"cd52a90c8b8b5e6ebc5991eb11025fd072c315db","scripts":{"lint":"eslint \"src/**/*.ts\" \"__tests__/**/*.ts\"","test":"npm run test:rust && npm run test:vitest && npm run test:dual","build":"npm run build:native && npm run build:ts","clean":"node -e \"const fs=require('fs');['dist','target','index.js','index.d.ts'].forEach(p=>fs.rmSync(p,{recursive:true,force:true}));fs.readdirSync('.').filter(f=>f.endsWith('.node')).forEach(f=>fs.rmSync(f,{force:true}));console.log('✓ Cleaned')\"","clippy":"cargo clippy --workspace --all-targets -- -D warnings","format":"prettier --write \"src/**/*.{ts,js}\" \"__tests__/**/*.ts\"","version":"napi version","build:ts":"tsup","examples":"npm run example:cjs && npm run example:esm && npm run example:ts && npm run example:signing && npm run example:aad && npm run example:e2e","artifacts":"napi artifacts","test:dual":"node __tests__/cjs.test.cjs && node __tests__/esm.test.mjs","test:rust":"cargo test --workspace --exclude sc-node","typecheck":"tsc --noEmit","example:ts":"tsx examples/ts-example.ts","test:watch":"cross-env VITE_CJS_IGNORE_WARNING=true vitest","build:debug":"npm run build:native:debug && npm run build:ts","example:aad":"node examples/aad.mjs","example:cjs":"node examples/cjs-example.cjs","example:e2e":"node examples/e2e-channel.mjs","example:esm":"node examples/esm-example.mjs","format:rust":"cargo fmt --all","test:vitest":"cross-env VITE_CJS_IGNORE_WARNING=true vitest run","build:native":"napi build --platform --release --cargo-cwd crates/sc-node --js index.js --dts index.d.ts","preartifacts":"node scripts/create-npm-dirs.js","coverage:open":"node -e \"require('child_process').exec(process.platform==='win32'?'start coverage/index.html':process.platform==='darwin'?'open coverage/index.html':'xdg-open coverage/index.html')\"","test:coverage":"cross-env VITE_CJS_IGNORE_WARNING=true vitest run --coverage","example:signing":"node examples/signing.mjs","test:coverage:ui":"cross-env VITE_CJS_IGNORE_WARNING=true vitest --coverage --ui","build:native:debug":"napi build --platform --cargo-cwd crates/sc-node --js index.js --dts index.d.ts"},"_npmUser":{"name":"brashkie","email":"fabianoarjunken@gmail.com"},"repository":{"url":"git+https://github.com/Brashkie/signalis-core.git","type":"git"},"_npmVersion":"10.8.2","description":"Cryptographic primitives for Signal Protocol — Rust-powered Node.js library with Ed25519, XEd25519, Curve25519, HKDF, AES-GCM (with AAD), AES-CBC, ChaCha20-Poly1305, HMAC, SHA-256 (ESM + CJS + TypeScript). Android arm64/armv7 support.","directories":{},"_nodeVersion":"20.20.2","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","tsup":"^8.5.0","eslint":"^9.0.0","vitest":"^3.0.0","prettier":"^3.3.0","cross-env":"^7.0.3","@vitest/ui":"^3.0.0","typescript":"^6.0.3","@types/node":"^22.0.0","@napi-rs/cli":"^2.18.4","@vitest/coverage-v8":"^3.0.0","@typescript-eslint/parser":"^8.0.0","@typescript-eslint/eslint-plugin":"^8.0.0"},"optionalDependencies":{"@brashkie/signalis-core-darwin-x64":"0.4.2","@brashkie/signalis-core-android-x64":"0.4.2","@brashkie/signalis-core-darwin-arm64":"0.4.2","@brashkie/signalis-core-android-arm64":"0.4.2","@brashkie/signalis-core-linux-x64-gnu":"0.4.2","@brashkie/signalis-core-linux-x64-musl":"0.4.2","@brashkie/signalis-core-win32-x64-msvc":"0.4.2","@brashkie/signalis-core-linux-arm64-gnu":"0.4.2","@brashkie/signalis-core-android-arm-eabi":"0.4.2","@brashkie/signalis-core-win32-arm64-msvc":"0.4.2"},"_npmOperationalInternal":{"tmp":"tmp/signalis-core_0.4.2_1786495624948_0.29198285451547323","host":"s3://npm-registry-packages-npm-production"}},"0.4.3":{"name":"@brashkie/signalis-core","version":"0.4.3","keywords":["signal-protocol","e2e-encryption","cryptography","curve25519","ed25519","xed25519","x25519","ecdh","diffie-hellman","hkdf","aes-gcm","aes-cbc","aead","hmac","sha256","digital-signature","rust","napi","native","esm","commonjs","dual-package","hepein"],"author":{"url":"Hepein","name":"Brashkie"},"license":"Apache-2.0","_id":"@brashkie/signalis-core@0.4.3","maintainers":[{"name":"brashkie","email":"fabianoarjunken@gmail.com"}],"homepage":"https://github.com/Brashkie/signalis-core#readme","bugs":{"url":"https://github.com/Brashkie/signalis-core/issues"},"dist":{"shasum":"5ca272207ebd73dc3df8441ac6ee8232664d5795","tarball":"https://registry.npmjs.org/@brashkie/signalis-core/-/signalis-core-0.4.3.tgz","fileCount":15,"integrity":"sha512-ldJs7zmMU+3Xy1yQ79SlGF2TV00p8Ns5vvJ8BpAMAsxNVNCqc/LShzAUrYNVfpMN4ebW44oM+enJtyEIcpVPmA==","signatures":[{"sig":"MEQCIEtOIPw/n0eW0DdkUsiGcl4ANPMQYhs57zx45O8KCHFUAiBtbZ3soD2DfyOlC/FgQ3kA1Png3i1boKGL7ZdWYTDIwA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":509781},"main":"./dist/index.cjs","napi":{"name":"signalis-core","triples":{"defaults":true,"additional":["x86_64-unknown-linux-musl","aarch64-unknown-linux-gnu","aarch64-apple-darwin","aarch64-pc-windows-msvc","aarch64-linux-android","armv7-linux-androideabi","x86_64-linux-android"]}},"type":"commonjs","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">= 18"},"exports":{".":{"types":{"import":"./dist/index.d.mts","require":"./dist/index.d.cts"},"import":"./dist/index.mjs","default":"./dist/index.cjs","require":"./dist/index.cjs"},"./package.json":"./package.json"},"gitHead":"c0c3f0bf5763d435a0c4e08a9d2229c4b8c2d918","scripts":{"lint":"eslint \"src/**/*.ts\" \"__tests__/**/*.ts\"","test":"npm run test:rust && npm run test:vitest && npm run test:dual","build":"npm run build:native && npm run build:ts","clean":"node -e \"const fs=require('fs');['dist','target','index.js','index.d.ts'].forEach(p=>fs.rmSync(p,{recursive:true,force:true}));fs.readdirSync('.').filter(f=>f.endsWith('.node')).forEach(f=>fs.rmSync(f,{force:true}));console.log('✓ Cleaned')\"","clippy":"cargo clippy --workspace --all-targets -- -D warnings","format":"prettier --write \"src/**/*.{ts,js}\" \"__tests__/**/*.ts\"","version":"napi version","build:ts":"tsup","examples":"npm run example:cjs && npm run example:esm && npm run example:ts && npm run example:signing && npm run example:aad && npm run example:e2e","artifacts":"napi artifacts","test:dual":"node __tests__/cjs.test.cjs && node __tests__/esm.test.mjs","test:rust":"cargo test --workspace --exclude sc-node","typecheck":"tsc --noEmit","example:ts":"tsx examples/ts-example.ts","test:watch":"cross-env VITE_CJS_IGNORE_WARNING=true vitest","build:debug":"npm run build:native:debug && npm run build:ts","example:aad":"node examples/aad.mjs","example:cjs":"node examples/cjs-example.cjs","example:e2e":"node examples/e2e-channel.mjs","example:esm":"node examples/esm-example.mjs","format:rust":"cargo fmt --all","test:vitest":"cross-env VITE_CJS_IGNORE_WARNING=true vitest run","build:native":"napi build --platform --release --cargo-cwd crates/sc-node --js index.js --dts index.d.ts","preartifacts":"node scripts/create-npm-dirs.js","coverage:open":"node -e \"require('child_process').exec(process.platform==='win32'?'start coverage/index.html':process.platform==='darwin'?'open coverage/index.html':'xdg-open coverage/index.html')\"","test:coverage":"cross-env VITE_CJS_IGNORE_WARNING=true vitest run --coverage","example:signing":"node examples/signing.mjs","test:coverage:ui":"cross-env VITE_CJS_IGNORE_WARNING=true vitest --coverage --ui","build:native:debug":"napi build --platform --cargo-cwd crates/sc-node --js index.js --dts index.d.ts"},"_npmUser":{"name":"brashkie","email":"fabianoarjunken@gmail.com"},"repository":{"url":"git+https://github.com/Brashkie/signalis-core.git","type":"git"},"_npmVersion":"10.8.2","description":"Cryptographic primitives for Signal Protocol — Rust-powered Node.js library with Ed25519, XEd25519, Curve25519, HKDF, AES-GCM (with AAD), AES-CBC, ChaCha20-Poly1305, HMAC, SHA-256 (ESM + CJS + TypeScript). Android arm64/armv7 support.","directories":{},"_nodeVersion":"20.20.2","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","tsup":"^8.5.0","eslint":"^9.0.0","vitest":"^3.0.0","prettier":"^3.3.0","cross-env":"^7.0.3","@vitest/ui":"^3.0.0","typescript":"^6.0.3","@types/node":"^22.0.0","@napi-rs/cli":"^2.18.4","@vitest/coverage-v8":"^3.0.0","@typescript-eslint/parser":"^8.0.0","@typescript-eslint/eslint-plugin":"^8.0.0"},"optionalDependencies":{"@brashkie/signalis-core-darwin-x64":"0.4.3","@brashkie/signalis-core-android-x64":"0.4.3","@brashkie/signalis-core-darwin-arm64":"0.4.3","@brashkie/signalis-core-android-arm64":"0.4.3","@brashkie/signalis-core-linux-x64-gnu":"0.4.3","@brashkie/signalis-core-linux-x64-musl":"0.4.3","@brashkie/signalis-core-win32-x64-msvc":"0.4.3","@brashkie/signalis-core-linux-arm64-gnu":"0.4.3","@brashkie/signalis-core-android-arm-eabi":"0.4.3","@brashkie/signalis-core-win32-arm64-msvc":"0.4.3"},"_npmOperationalInternal":{"tmp":"tmp/signalis-core_0.4.3_1786550327631_0.9056811311584381","host":"s3://npm-registry-packages-npm-production"}},"0.4.4":{"name":"@brashkie/signalis-core","version":"0.4.4","keywords":["signal-protocol","e2e-encryption","cryptography","curve25519","ed25519","xed25519","x25519","ecdh","diffie-hellman","hkdf","aes-gcm","aes-cbc","aead","hmac","sha256","digital-signature","rust","napi","native","esm","commonjs","dual-package","hepein"],"author":{"url":"Hepein","name":"Brashkie"},"license":"Apache-2.0","_id":"@brashkie/signalis-core@0.4.4","maintainers":[{"name":"brashkie","email":"fabianoarjunken@gmail.com"}],"homepage":"https://github.com/Brashkie/signalis-core#readme","bugs":{"url":"https://github.com/Brashkie/signalis-core/issues"},"dist":{"shasum":"e85de0ba3d4c4dc8e1951a61dfa9cbe099d07ae5","tarball":"https://registry.npmjs.org/@brashkie/signalis-core/-/signalis-core-0.4.4.tgz","fileCount":15,"integrity":"sha512-CVP2vW4NvMw4fRMxqGLN7PPByWce9cMnSg8F0Pi2/RAax441lERVEPKlBnoNlrj0w7ofK6/R8ZmBhnM3fT5/Iw==","signatures":[{"sig":"MEYCIQDsnp3/ac+PP+VA75cT74e0T+SLR2+5IFjqZNVcWcFGKQIhALEnpHxV0sRrYyY4yg8mdPhOEHs/grMyW9q+2+YTcmH/","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":520047},"main":"./dist/index.cjs","napi":{"name":"signalis-core","triples":{"defaults":true,"additional":["x86_64-unknown-linux-musl","aarch64-unknown-linux-gnu","aarch64-apple-darwin","aarch64-pc-windows-msvc","aarch64-linux-android","armv7-linux-androideabi","x86_64-linux-android"]}},"type":"commonjs","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">= 18"},"exports":{".":{"types":{"import":"./dist/index.d.mts","require":"./dist/index.d.cts"},"import":"./dist/index.mjs","default":"./dist/index.cjs","require":"./dist/index.cjs"},"./package.json":"./package.json"},"gitHead":"120594eb2c28a90d8ef5c3afb16a8b96babf67a9","scripts":{"lint":"eslint \"src/**/*.ts\" \"__tests__/**/*.ts\"","test":"npm run test:rust && npm run test:vitest && npm run test:dual","build":"npm run build:native && npm run build:ts","clean":"node -e \"const fs=require('fs');['dist','target','index.js','index.d.ts'].forEach(p=>fs.rmSync(p,{recursive:true,force:true}));fs.readdirSync('.').filter(f=>f.endsWith('.node')).forEach(f=>fs.rmSync(f,{force:true}));console.log('✓ Cleaned')\"","clippy":"cargo clippy --workspace --all-targets -- -D warnings","format":"prettier --write \"src/**/*.{ts,js}\" \"__tests__/**/*.ts\"","version":"napi version","build:ts":"tsup","examples":"npm run example:cjs && npm run example:esm && npm run example:ts && npm run example:signing && npm run example:aad && npm run example:e2e","artifacts":"napi artifacts","test:dual":"node __tests__/cjs.test.cjs && node __tests__/esm.test.mjs","test:rust":"cargo test --workspace --exclude sc-node","typecheck":"tsc --noEmit","example:ts":"tsx examples/ts-example.ts","test:watch":"cross-env VITE_CJS_IGNORE_WARNING=true vitest","build:debug":"npm run build:native:debug && npm run build:ts","example:aad":"node examples/aad.mjs","example:cjs":"node examples/cjs-example.cjs","example:e2e":"node examples/e2e-channel.mjs","example:esm":"node examples/esm-example.mjs","format:rust":"cargo fmt --all","test:vitest":"cross-env VITE_CJS_IGNORE_WARNING=true vitest run","build:native":"napi build --platform --release --cargo-cwd crates/sc-node --js index.js --dts index.d.ts","preartifacts":"node scripts/create-npm-dirs.js","coverage:open":"node -e \"require('child_process').exec(process.platform==='win32'?'start coverage/index.html':process.platform==='darwin'?'open coverage/index.html':'xdg-open coverage/index.html')\"","test:coverage":"cross-env VITE_CJS_IGNORE_WARNING=true vitest run --coverage","example:signing":"node examples/signing.mjs","test:coverage:ui":"cross-env VITE_CJS_IGNORE_WARNING=true vitest --coverage --ui","build:native:debug":"napi build --platform --cargo-cwd crates/sc-node --js index.js --dts index.d.ts"},"_npmUser":{"name":"brashkie","email":"fabianoarjunken@gmail.com"},"repository":{"url":"git+https://github.com/Brashkie/signalis-core.git","type":"git"},"_npmVersion":"10.8.2","description":"Cryptographic primitives for Signal Protocol — Rust-powered Node.js library with Ed25519, XEd25519, Curve25519, HKDF, AES-GCM (with AAD), AES-CBC, ChaCha20-Poly1305, HMAC, SHA-256 (ESM + CJS + TypeScript). Android arm64/armv7 support.","directories":{},"_nodeVersion":"20.20.2","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","tsup":"^8.5.0","eslint":"^9.0.0","vitest":"^3.0.0","prettier":"^3.3.0","cross-env":"^7.0.3","@vitest/ui":"^3.0.0","typescript":"^6.0.3","@types/node":"^22.0.0","@napi-rs/cli":"^2.18.4","@vitest/coverage-v8":"^3.0.0","@typescript-eslint/parser":"^8.0.0","@typescript-eslint/eslint-plugin":"^8.0.0"},"optionalDependencies":{"@brashkie/signalis-core-darwin-x64":"0.4.4","@brashkie/signalis-core-android-x64":"0.4.4","@brashkie/signalis-core-darwin-arm64":"0.4.4","@brashkie/signalis-core-android-arm64":"0.4.4","@brashkie/signalis-core-linux-x64-gnu":"0.4.4","@brashkie/signalis-core-linux-x64-musl":"0.4.4","@brashkie/signalis-core-win32-x64-msvc":"0.4.4","@brashkie/signalis-core-linux-arm64-gnu":"0.4.4","@brashkie/signalis-core-android-arm-eabi":"0.4.4","@brashkie/signalis-core-win32-arm64-msvc":"0.4.4"},"_npmOperationalInternal":{"tmp":"tmp/signalis-core_0.4.4_1786574887032_0.27147784419509624","host":"s3://npm-registry-packages-npm-production"}},"0.4.5":{"name":"@brashkie/signalis-core","version":"0.4.5","keywords":["signal-protocol","e2e-encryption","cryptography","curve25519","ed25519","xed25519","x25519","ecdh","diffie-hellman","hkdf","aes-gcm","aes-cbc","aead","hmac","sha256","digital-signature","rust","napi","native","esm","commonjs","dual-package","hepein"],"author":{"url":"Hepein","name":"Brashkie"},"license":"Apache-2.0","_id":"@brashkie/signalis-core@0.4.5","maintainers":[{"name":"brashkie","email":"fabianoarjunken@gmail.com"}],"homepage":"https://github.com/Brashkie/signalis-core#readme","bugs":{"url":"https://github.com/Brashkie/signalis-core/issues"},"dist":{"shasum":"f40aad2b2ce5225bde39c439a527f427051e8451","tarball":"https://registry.npmjs.org/@brashkie/signalis-core/-/signalis-core-0.4.5.tgz","fileCount":15,"integrity":"sha512-Exa1W59g65XLhg+ArrxF07/k/5bE6i/3EfnHjlEh1VTddtghN8Ty4jjBKhg8sV2Hb9M2JN5CK4+dzfhucIldVg==","signatures":[{"sig":"MEQCICF9UrIskXHkwSQtWtx5SAQjBobh13aHQEUzpfyM8DxDAiBTMhGCilfXW4jy19DNL0eczpkgBBgmPBDDI95ie+MH9g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":528459},"main":"./dist/index.cjs","napi":{"name":"signalis-core","triples":{"defaults":true,"additional":["x86_64-unknown-linux-musl","aarch64-unknown-linux-gnu","aarch64-apple-darwin","aarch64-pc-windows-msvc","aarch64-linux-android","armv7-linux-androideabi","x86_64-linux-android"]}},"type":"commonjs","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">= 18"},"exports":{".":{"types":{"import":"./dist/index.d.mts","require":"./dist/index.d.cts"},"import":"./dist/index.mjs","default":"./dist/index.cjs","require":"./dist/index.cjs"},"./package.json":"./package.json"},"gitHead":"955fe84144b8dbe20728ae4e38b4a5b5e9e3b7d2","scripts":{"lint":"eslint \"src/**/*.ts\" \"__tests__/**/*.ts\"","test":"npm run test:rust && npm run test:vitest && npm run test:dual","build":"npm run build:native && npm run build:ts","clean":"node -e \"const fs=require('fs');['dist','target','index.js','index.d.ts'].forEach(p=>fs.rmSync(p,{recursive:true,force:true}));fs.readdirSync('.').filter(f=>f.endsWith('.node')).forEach(f=>fs.rmSync(f,{force:true}));console.log('✓ Cleaned')\"","clippy":"cargo clippy --workspace --all-targets -- -D warnings","format":"prettier --write \"src/**/*.{ts,js}\" \"__tests__/**/*.ts\"","version":"napi version","build:ts":"tsup","examples":"npm run example:cjs && npm run example:esm && npm run example:ts && npm run example:signing && npm run example:aad && npm run example:e2e","artifacts":"napi artifacts","test:dual":"node __tests__/cjs.test.cjs && node __tests__/esm.test.mjs","test:rust":"cargo test --workspace --exclude sc-node","typecheck":"tsc --noEmit","example:ts":"tsx examples/ts-example.ts","test:watch":"cross-env VITE_CJS_IGNORE_WARNING=true vitest","build:debug":"npm run build:native:debug && npm run build:ts","example:aad":"node examples/aad.mjs","example:cjs":"node examples/cjs-example.cjs","example:e2e":"node examples/e2e-channel.mjs","example:esm":"node examples/esm-example.mjs","format:rust":"cargo fmt --all","test:vitest":"cross-env VITE_CJS_IGNORE_WARNING=true vitest run","build:native":"napi build --platform --release --cargo-cwd crates/sc-node --js index.js --dts index.d.ts","preartifacts":"node scripts/create-npm-dirs.js","coverage:open":"node -e \"require('child_process').exec(process.platform==='win32'?'start coverage/index.html':process.platform==='darwin'?'open coverage/index.html':'xdg-open coverage/index.html')\"","test:coverage":"cross-env VITE_CJS_IGNORE_WARNING=true vitest run --coverage","example:signing":"node examples/signing.mjs","test:coverage:ui":"cross-env VITE_CJS_IGNORE_WARNING=true vitest --coverage --ui","build:native:debug":"napi build --platform --cargo-cwd crates/sc-node --js index.js --dts index.d.ts"},"_npmUser":{"name":"brashkie","email":"fabianoarjunken@gmail.com"},"repository":{"url":"git+https://github.com/Brashkie/signalis-core.git","type":"git"},"_npmVersion":"10.8.2","description":"Cryptographic primitives for Signal Protocol — Rust-powered Node.js library with Ed25519, XEd25519, Curve25519, HKDF, AES-GCM (with AAD), AES-CBC, ChaCha20-Poly1305, HMAC, SHA-256 (ESM + CJS + TypeScript). Android arm64/armv7 support.","directories":{},"_nodeVersion":"20.20.2","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","tsup":"^8.5.0","eslint":"^9.0.0","vitest":"^3.0.0","prettier":"^3.3.0","cross-env":"^7.0.3","@vitest/ui":"^3.0.0","typescript":"^6.0.3","@types/node":"^22.0.0","@napi-rs/cli":"^2.18.4","@vitest/coverage-v8":"^3.0.0","@typescript-eslint/parser":"^8.0.0","@typescript-eslint/eslint-plugin":"^8.0.0"},"optionalDependencies":{"@brashkie/signalis-core-darwin-x64":"0.4.5","@brashkie/signalis-core-android-x64":"0.4.5","@brashkie/signalis-core-darwin-arm64":"0.4.5","@brashkie/signalis-core-android-arm64":"0.4.5","@brashkie/signalis-core-linux-x64-gnu":"0.4.5","@brashkie/signalis-core-linux-x64-musl":"0.4.5","@brashkie/signalis-core-win32-x64-msvc":"0.4.5","@brashkie/signalis-core-linux-arm64-gnu":"0.4.5","@brashkie/signalis-core-android-arm-eabi":"0.4.5","@brashkie/signalis-core-win32-arm64-msvc":"0.4.5"},"_npmOperationalInternal":{"tmp":"tmp/signalis-core_0.4.5_1786656212283_0.5183876199647663","host":"s3://npm-registry-packages-npm-production"}},"0.4.6":{"name":"@brashkie/signalis-core","version":"0.4.6","keywords":["signal-protocol","e2e-encryption","cryptography","curve25519","ed25519","xed25519","x25519","ecdh","diffie-hellman","hkdf","aes-gcm","aes-cbc","aead","hmac","sha256","digital-signature","rust","napi","native","esm","commonjs","dual-package","hepein"],"author":{"url":"Hepein","name":"Brashkie"},"license":"Apache-2.0","_id":"@brashkie/signalis-core@0.4.6","maintainers":[{"name":"brashkie","email":"fabianoarjunken@gmail.com"}],"homepage":"https://github.com/Brashkie/signalis-core#readme","bugs":{"url":"https://github.com/Brashkie/signalis-core/issues"},"dist":{"shasum":"504f3454551740df8d358250ddb035c3a1969fdf","tarball":"https://registry.npmjs.org/@brashkie/signalis-core/-/signalis-core-0.4.6.tgz","fileCount":15,"integrity":"sha512-o7kSktfJSV8FUflzUcUCRqtEjY3SbNo4vZv7qRF7yB2we6d7xPfA5iP78JQfmzmg/vxU6Shgaw+303gjYCEN2A==","signatures":[{"sig":"MEUCIQCFRntPf9Q4tsNhWAEEQA7JjpgmW4MHzZRIXqPM0gGUXAIgRHGfZ2vN91UP8sE03C5OaQx17KyGwtSLRcpITSvW2WA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":542807},"main":"./dist/index.cjs","napi":{"name":"signalis-core","triples":{"defaults":true,"additional":["x86_64-unknown-linux-musl","aarch64-unknown-linux-gnu","aarch64-apple-darwin","aarch64-pc-windows-msvc","aarch64-linux-android","armv7-linux-androideabi","x86_64-linux-android"]}},"type":"commonjs","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">= 18"},"exports":{".":{"types":{"import":"./dist/index.d.mts","require":"./dist/index.d.cts"},"import":"./dist/index.mjs","default":"./dist/index.cjs","require":"./dist/index.cjs"},"./package.json":"./package.json"},"gitHead":"8b5806a223f47e9f069b1f4be8484855a86407bc","scripts":{"lint":"eslint \"src/**/*.ts\" \"__tests__/**/*.ts\"","test":"npm run test:rust && npm run test:vitest && npm run test:dual","build":"npm run build:native && npm run build:ts","clean":"node -e \"const fs=require('fs');['dist','target','index.js','index.d.ts'].forEach(p=>fs.rmSync(p,{recursive:true,force:true}));fs.readdirSync('.').filter(f=>f.endsWith('.node')).forEach(f=>fs.rmSync(f,{force:true}));console.log('✓ Cleaned')\"","clippy":"cargo clippy --workspace --all-targets -- -D warnings","format":"prettier --write \"src/**/*.{ts,js}\" \"__tests__/**/*.ts\"","version":"napi version","build:ts":"tsup","examples":"npm run example:cjs && npm run example:esm && npm run example:ts && npm run example:signing && npm run example:aad && npm run example:e2e","artifacts":"napi artifacts","test:dual":"node __tests__/cjs.test.cjs && node __tests__/esm.test.mjs","test:rust":"cargo test --workspace --exclude sc-node","typecheck":"tsc --noEmit","example:ts":"tsx examples/ts-example.ts","test:watch":"cross-env VITE_CJS_IGNORE_WARNING=true vitest","build:debug":"npm run build:native:debug && npm run build:ts","example:aad":"node examples/aad.mjs","example:cjs":"node examples/cjs-example.cjs","example:e2e":"node examples/e2e-channel.mjs","example:esm":"node examples/esm-example.mjs","format:rust":"cargo fmt --all","test:vitest":"cross-env VITE_CJS_IGNORE_WARNING=true vitest run","build:native":"napi build --platform --release --cargo-cwd crates/sc-node --js index.js --dts index.d.ts","preartifacts":"node scripts/create-npm-dirs.js","coverage:open":"node -e \"require('child_process').exec(process.platform==='win32'?'start coverage/index.html':process.platform==='darwin'?'open coverage/index.html':'xdg-open coverage/index.html')\"","test:coverage":"cross-env VITE_CJS_IGNORE_WARNING=true vitest run --coverage","example:signing":"node examples/signing.mjs","test:coverage:ui":"cross-env VITE_CJS_IGNORE_WARNING=true vitest --coverage --ui","build:native:debug":"napi build --platform --cargo-cwd crates/sc-node --js index.js --dts index.d.ts"},"_npmUser":{"name":"brashkie","email":"fabianoarjunken@gmail.com"},"repository":{"url":"git+https://github.com/Brashkie/signalis-core.git","type":"git"},"_npmVersion":"10.8.2","description":"Cryptographic primitives for Signal Protocol — Rust-powered Node.js library with Ed25519, XEd25519, Curve25519, HKDF, AES-GCM (with AAD), AES-CBC, ChaCha20-Poly1305, HMAC, SHA-256 (ESM + CJS + TypeScript). Android arm64/armv7 support.","directories":{},"_nodeVersion":"20.20.2","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","tsup":"^8.5.0","eslint":"^9.0.0","vitest":"^3.0.0","prettier":"^3.3.0","cross-env":"^7.0.3","@vitest/ui":"^3.0.0","typescript":"^6.0.3","@types/node":"^22.0.0","@napi-rs/cli":"^2.18.4","@vitest/coverage-v8":"^3.0.0","@typescript-eslint/parser":"^8.0.0","@typescript-eslint/eslint-plugin":"^8.0.0"},"optionalDependencies":{"@brashkie/signalis-core-darwin-x64":"0.4.6","@brashkie/signalis-core-android-x64":"0.4.6","@brashkie/signalis-core-darwin-arm64":"0.4.6","@brashkie/signalis-core-android-arm64":"0.4.6","@brashkie/signalis-core-linux-x64-gnu":"0.4.6","@brashkie/signalis-core-linux-x64-musl":"0.4.6","@brashkie/signalis-core-win32-x64-msvc":"0.4.6","@brashkie/signalis-core-linux-arm64-gnu":"0.4.6","@brashkie/signalis-core-android-arm-eabi":"0.4.6","@brashkie/signalis-core-win32-arm64-msvc":"0.4.6"},"_npmOperationalInternal":{"tmp":"tmp/signalis-core_0.4.6_1786672705001_0.3370694542475585","host":"s3://npm-registry-packages-npm-production"}},"0.4.7":{"name":"@brashkie/signalis-core","version":"0.4.7","keywords":["signal-protocol","e2e-encryption","cryptography","curve25519","ed25519","xed25519","x25519","ecdh","diffie-hellman","hkdf","aes-gcm","aes-cbc","aead","hmac","sha256","digital-signature","rust","napi","native","esm","commonjs","dual-package","hepein"],"author":{"url":"Hepein","name":"Brashkie"},"license":"Apache-2.0","_id":"@brashkie/signalis-core@0.4.7","maintainers":[{"name":"brashkie","email":"fabianoarjunken@gmail.com"}],"homepage":"https://github.com/Brashkie/signalis-core#readme","bugs":{"url":"https://github.com/Brashkie/signalis-core/issues"},"dist":{"shasum":"6d59ae46dcabf15bea21fe8a1eafc589233cb01f","tarball":"https://registry.npmjs.org/@brashkie/signalis-core/-/signalis-core-0.4.7.tgz","fileCount":15,"integrity":"sha512-aEp+LPV/WNit6DuBWanZzzZGYTkF5A512zKcmLEQg6yY40yqAFXS13BHu4F3HP8OHfTWkL8S5b/sluwybV8Gxg==","signatures":[{"sig":"MEUCIDhBwfUnXTScfAQF3HY7+h7cF+h9+Rg3N8kdFEcZGibTAiEAzrvZDo6rLyZD/FtPuFtvcHCNPApV2IveHvK7rNeY+d4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":545694},"main":"./dist/index.cjs","napi":{"name":"signalis-core","triples":{"defaults":true,"additional":["x86_64-unknown-linux-musl","aarch64-unknown-linux-gnu","aarch64-apple-darwin","aarch64-pc-windows-msvc","aarch64-linux-android","armv7-linux-androideabi","x86_64-linux-android"]}},"type":"commonjs","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">= 18"},"exports":{".":{"types":{"import":"./dist/index.d.mts","require":"./dist/index.d.cts"},"import":"./dist/index.mjs","default":"./dist/index.cjs","require":"./dist/index.cjs"},"./package.json":"./package.json"},"gitHead":"59b992d89b199f6ad9759a490988f89d59b82d63","scripts":{"lint":"eslint \"src/**/*.ts\" \"__tests__/**/*.ts\"","test":"npm run test:rust && npm run test:vitest && npm run test:dual","build":"npm run build:native && npm run build:ts","clean":"node -e \"const fs=require('fs');['dist','target','index.js','index.d.ts'].forEach(p=>fs.rmSync(p,{recursive:true,force:true}));fs.readdirSync('.').filter(f=>f.endsWith('.node')).forEach(f=>fs.rmSync(f,{force:true}));console.log('✓ Cleaned')\"","clippy":"cargo clippy --workspace --all-targets -- -D warnings","format":"prettier --write \"src/**/*.{ts,js}\" \"__tests__/**/*.ts\"","version":"napi version","build:ts":"tsup","examples":"npm run example:cjs && npm run example:esm && npm run example:ts && npm run example:signing && npm run example:aad && npm run example:e2e","artifacts":"napi artifacts","test:dual":"node __tests__/cjs.test.cjs && node __tests__/esm.test.mjs","test:rust":"cargo test --workspace --exclude sc-node","typecheck":"tsc --noEmit","example:ts":"tsx examples/ts-example.ts","test:watch":"cross-env VITE_CJS_IGNORE_WARNING=true vitest","build:debug":"npm run build:native:debug && npm run build:ts","example:aad":"node examples/aad.mjs","example:cjs":"node examples/cjs-example.cjs","example:e2e":"node examples/e2e-channel.mjs","example:esm":"node examples/esm-example.mjs","format:rust":"cargo fmt --all","test:vitest":"cross-env VITE_CJS_IGNORE_WARNING=true vitest run","build:native":"napi build --platform --release --cargo-cwd crates/sc-node --js index.js --dts index.d.ts","preartifacts":"node scripts/create-npm-dirs.js","coverage:open":"node -e \"require('child_process').exec(process.platform==='win32'?'start coverage/index.html':process.platform==='darwin'?'open coverage/index.html':'xdg-open coverage/index.html')\"","test:coverage":"cross-env VITE_CJS_IGNORE_WARNING=true vitest run --coverage","example:signing":"node examples/signing.mjs","test:coverage:ui":"cross-env VITE_CJS_IGNORE_WARNING=true vitest --coverage --ui","build:native:debug":"napi build --platform --cargo-cwd crates/sc-node --js index.js --dts index.d.ts"},"_npmUser":{"name":"brashkie","email":"fabianoarjunken@gmail.com"},"repository":{"url":"git+https://github.com/Brashkie/signalis-core.git","type":"git"},"_npmVersion":"10.8.2","description":"Cryptographic primitives for Signal Protocol — Rust-powered Node.js library with Ed25519, XEd25519, Curve25519, HKDF, AES-GCM (with AAD), AES-CBC, ChaCha20-Poly1305, HMAC, SHA-256 (ESM + CJS + TypeScript). Android arm64/armv7 support.","directories":{},"_nodeVersion":"20.20.2","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","tsup":"^8.5.0","eslint":"^9.0.0","vitest":"^3.0.0","prettier":"^3.3.0","cross-env":"^7.0.3","@vitest/ui":"^3.0.0","typescript":"^6.0.3","@types/node":"^22.0.0","@napi-rs/cli":"^2.18.4","@vitest/coverage-v8":"^3.0.0","@typescript-eslint/parser":"^8.0.0","@typescript-eslint/eslint-plugin":"^8.0.0"},"optionalDependencies":{"@brashkie/signalis-core-darwin-x64":"0.4.7","@brashkie/signalis-core-android-x64":"0.4.7","@brashkie/signalis-core-darwin-arm64":"0.4.7","@brashkie/signalis-core-android-arm64":"0.4.7","@brashkie/signalis-core-linux-x64-gnu":"0.4.7","@brashkie/signalis-core-linux-x64-musl":"0.4.7","@brashkie/signalis-core-win32-x64-msvc":"0.4.7","@brashkie/signalis-core-linux-arm64-gnu":"0.4.7","@brashkie/signalis-core-android-arm-eabi":"0.4.7","@brashkie/signalis-core-win32-arm64-msvc":"0.4.7"},"_npmOperationalInternal":{"tmp":"tmp/signalis-core_0.4.7_1786840831984_0.3878150432691383","host":"s3://npm-registry-packages-npm-production"}},"0.4.8":{"name":"@brashkie/signalis-core","version":"0.4.8","keywords":["signal-protocol","e2e-encryption","cryptography","curve25519","ed25519","xed25519","x25519","ecdh","diffie-hellman","hkdf","aes-gcm","aes-cbc","aead","hmac","sha256","digital-signature","rust","napi","native","esm","commonjs","dual-package","hepein"],"author":{"url":"Hepein","name":"Brashkie"},"license":"Apache-2.0","_id":"@brashkie/signalis-core@0.4.8","maintainers":[{"name":"brashkie","email":"fabianoarjunken@gmail.com"}],"homepage":"https://github.com/Brashkie/signalis-core#readme","bugs":{"url":"https://github.com/Brashkie/signalis-core/issues"},"dist":{"shasum":"abdefb45d6e0b3698965a04be0a5f7fdb3877ed2","tarball":"https://registry.npmjs.org/@brashkie/signalis-core/-/signalis-core-0.4.8.tgz","fileCount":15,"integrity":"sha512-1Ow92dJ9cN31FtwCR3nlMrqSXMs7YiruLTfC6VmqV/ZqXikECy2ZKLq+MQ9x7n1VBA/nQHNjbSMrNhOz0U542A==","signatures":[{"sig":"MEYCIQDywwqKP3q2scMuHcL/f8pYlOgyCAShaapQfPjtkEP1MwIhAKr0U3wSMBM7/gf0tyx63qVg+fg7IFboldfCUAXunGOz","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":548393},"main":"./dist/index.cjs","napi":{"name":"signalis-core","triples":{"defaults":true,"additional":["x86_64-unknown-linux-musl","aarch64-unknown-linux-gnu","aarch64-apple-darwin","aarch64-pc-windows-msvc","aarch64-linux-android","armv7-linux-androideabi","x86_64-linux-android"]}},"type":"commonjs","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">= 18"},"exports":{".":{"types":{"import":"./dist/index.d.mts","require":"./dist/index.d.cts"},"import":"./dist/index.mjs","default":"./dist/index.cjs","require":"./dist/index.cjs"},"./package.json":"./package.json"},"gitHead":"645b08f2a7fc9522abf0c45b183fc81ed42e5025","scripts":{"lint":"eslint \"src/**/*.ts\" \"__tests__/**/*.ts\"","test":"npm run test:rust && npm run test:vitest && npm run test:dual","build":"npm run build:native && npm run build:ts","clean":"node -e \"const fs=require('fs');['dist','target','index.js','index.d.ts'].forEach(p=>fs.rmSync(p,{recursive:true,force:true}));fs.readdirSync('.').filter(f=>f.endsWith('.node')).forEach(f=>fs.rmSync(f,{force:true}));console.log('✓ Cleaned')\"","clippy":"cargo clippy --workspace --all-targets -- -D warnings","format":"prettier --write \"src/**/*.{ts,js}\" \"__tests__/**/*.ts\"","version":"napi version","build:ts":"tsup","examples":"npm run example:cjs && npm run example:esm && npm run example:ts && npm run example:signing && npm run example:aad && npm run example:e2e","artifacts":"napi artifacts","test:dual":"node __tests__/cjs.test.cjs && node __tests__/esm.test.mjs","test:rust":"cargo test --workspace --exclude sc-node","typecheck":"tsc --noEmit","example:ts":"tsx examples/ts-example.ts","test:watch":"cross-env VITE_CJS_IGNORE_WARNING=true vitest","build:debug":"npm run build:native:debug && npm run build:ts","example:aad":"node examples/aad.mjs","example:cjs":"node examples/cjs-example.cjs","example:e2e":"node examples/e2e-channel.mjs","example:esm":"node examples/esm-example.mjs","format:rust":"cargo fmt --all","test:vitest":"cross-env VITE_CJS_IGNORE_WARNING=true vitest run","build:native":"napi build --platform --release --cargo-cwd crates/sc-node --js index.js --dts index.d.ts","preartifacts":"node scripts/create-npm-dirs.js","coverage:open":"node -e \"require('child_process').exec(process.platform==='win32'?'start coverage/index.html':process.platform==='darwin'?'open coverage/index.html':'xdg-open coverage/index.html')\"","test:coverage":"cross-env VITE_CJS_IGNORE_WARNING=true vitest run --coverage","example:signing":"node examples/signing.mjs","test:coverage:ui":"cross-env VITE_CJS_IGNORE_WARNING=true vitest --coverage --ui","build:native:debug":"napi build --platform --cargo-cwd crates/sc-node --js index.js --dts index.d.ts"},"_npmUser":{"name":"brashkie","email":"fabianoarjunken@gmail.com"},"repository":{"url":"git+https://github.com/Brashkie/signalis-core.git","type":"git"},"_npmVersion":"10.8.2","description":"Cryptographic primitives for Signal Protocol — Rust-powered Node.js library with Ed25519, XEd25519, Curve25519, HKDF, AES-GCM (with AAD), AES-CBC, ChaCha20-Poly1305, HMAC, SHA-256 (ESM + CJS + TypeScript). Android arm64/armv7 support.","directories":{},"_nodeVersion":"20.20.2","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","tsup":"^8.5.0","eslint":"^9.0.0","vitest":"^3.0.0","prettier":"^3.3.0","cross-env":"^7.0.3","@vitest/ui":"^3.0.0","typescript":"^6.0.3","@types/node":"^22.0.0","@napi-rs/cli":"^2.18.4","@vitest/coverage-v8":"^3.0.0","@typescript-eslint/parser":"^8.0.0","@typescript-eslint/eslint-plugin":"^8.0.0"},"optionalDependencies":{"@brashkie/signalis-core-darwin-x64":"0.4.8","@brashkie/signalis-core-android-x64":"0.4.8","@brashkie/signalis-core-darwin-arm64":"0.4.8","@brashkie/signalis-core-android-arm64":"0.4.8","@brashkie/signalis-core-linux-x64-gnu":"0.4.8","@brashkie/signalis-core-linux-x64-musl":"0.4.8","@brashkie/signalis-core-win32-x64-msvc":"0.4.8","@brashkie/signalis-core-linux-arm64-gnu":"0.4.8","@brashkie/signalis-core-android-arm-eabi":"0.4.8","@brashkie/signalis-core-win32-arm64-msvc":"0.4.8"},"_npmOperationalInternal":{"tmp":"tmp/signalis-core_0.4.8_1787027470800_0.8358725735916381","host":"s3://npm-registry-packages-npm-production"}},"0.4.9":{"name":"@brashkie/signalis-core","version":"0.4.9","keywords":["signal-protocol","e2e-encryption","cryptography","curve25519","ed25519","xed25519","x25519","ecdh","diffie-hellman","hkdf","aes-gcm","aes-cbc","aead","hmac","sha256","digital-signature","rust","napi","native","esm","commonjs","dual-package","hepein"],"author":{"url":"Hepein","name":"Brashkie"},"license":"Apache-2.0","_id":"@brashkie/signalis-core@0.4.9","maintainers":[{"name":"brashkie","email":"fabianoarjunken@gmail.com"}],"homepage":"https://github.com/Brashkie/signalis-core#readme","bugs":{"url":"https://github.com/Brashkie/signalis-core/issues"},"dist":{"shasum":"716adbad122515696e60b07cae7bc0bbe186d2fc","tarball":"https://registry.npmjs.org/@brashkie/signalis-core/-/signalis-core-0.4.9.tgz","fileCount":15,"integrity":"sha512-PgCJjr62QyXYBjsXtWxGHHCTAjaPCPkqfW1oqH9v3cGTLPd32l0IfRr8rIzcqa08w8nd48jl27NkRQbT1WhmTA==","signatures":[{"sig":"MEQCID8WxMfGZYJB6hFz+n7CVrjNEPe5TgDDiu3HjxUjuODHAiAWrLBq/8fY4HjQzhGtmrRbPoBIC21l+RF2Id06ZojM1g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":562275},"main":"./dist/index.cjs","napi":{"name":"signalis-core","triples":{"defaults":true,"additional":["x86_64-unknown-linux-musl","aarch64-unknown-linux-gnu","aarch64-apple-darwin","aarch64-pc-windows-msvc","aarch64-linux-android","armv7-linux-androideabi","x86_64-linux-android"]}},"type":"commonjs","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">= 18"},"exports":{".":{"types":{"import":"./dist/index.d.mts","require":"./dist/index.d.cts"},"import":"./dist/index.mjs","default":"./dist/index.cjs","require":"./dist/index.cjs"},"./package.json":"./package.json"},"gitHead":"a3754423de1afa622f069b3a2773698f0e672e8c","scripts":{"lint":"eslint \"src/**/*.ts\" \"__tests__/**/*.ts\"","test":"npm run test:rust && npm run test:vitest && npm run test:dual","build":"npm run build:native && npm run build:ts","clean":"node -e \"const fs=require('fs');['dist','target','index.js','index.d.ts'].forEach(p=>fs.rmSync(p,{recursive:true,force:true}));fs.readdirSync('.').filter(f=>f.endsWith('.node')).forEach(f=>fs.rmSync(f,{force:true}));console.log('✓ Cleaned')\"","clippy":"cargo clippy --workspace --all-targets -- -D warnings","format":"prettier --write \"src/**/*.{ts,js}\" \"__tests__/**/*.ts\"","version":"napi version","build:ts":"tsup","examples":"npm run example:cjs && npm run example:esm && npm run example:ts && npm run example:signing && npm run example:aad && npm run example:e2e","artifacts":"napi artifacts","test:dual":"node __tests__/cjs.test.cjs && node __tests__/esm.test.mjs","test:rust":"cargo test --workspace --exclude sc-node","typecheck":"tsc --noEmit","example:ts":"tsx examples/ts-example.ts","test:watch":"cross-env VITE_CJS_IGNORE_WARNING=true vitest","build:debug":"npm run build:native:debug && npm run build:ts","example:aad":"node examples/aad.mjs","example:cjs":"node examples/cjs-example.cjs","example:e2e":"node examples/e2e-channel.mjs","example:esm":"node examples/esm-example.mjs","format:rust":"cargo fmt --all","test:vitest":"cross-env VITE_CJS_IGNORE_WARNING=true vitest run","build:native":"napi build --platform --release --cargo-cwd crates/sc-node --js index.js --dts index.d.ts","preartifacts":"node scripts/create-npm-dirs.js","coverage:open":"node -e \"require('child_process').exec(process.platform==='win32'?'start coverage/index.html':process.platform==='darwin'?'open coverage/index.html':'xdg-open coverage/index.html')\"","test:coverage":"cross-env VITE_CJS_IGNORE_WARNING=true vitest run --coverage","example:signing":"node examples/signing.mjs","test:coverage:ui":"cross-env VITE_CJS_IGNORE_WARNING=true vitest --coverage --ui","build:native:debug":"napi build --platform --cargo-cwd crates/sc-node --js index.js --dts index.d.ts"},"_npmUser":{"name":"brashkie","email":"fabianoarjunken@gmail.com"},"repository":{"url":"git+https://github.com/Brashkie/signalis-core.git","type":"git"},"_npmVersion":"10.8.2","description":"Cryptographic primitives for Signal Protocol — Rust-powered Node.js library with Ed25519, XEd25519, Curve25519, HKDF, AES-GCM (with AAD), AES-CBC, ChaCha20-Poly1305, HMAC, SHA-256 (ESM + CJS + TypeScript). Android arm64/armv7 support.","directories":{},"_nodeVersion":"20.20.2","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","tsup":"^8.5.0","eslint":"^9.0.0","vitest":"^3.0.0","prettier":"^3.3.0","cross-env":"^7.0.3","@vitest/ui":"^3.0.0","typescript":"^6.0.3","@types/node":"^22.0.0","@napi-rs/cli":"^2.18.4","@vitest/coverage-v8":"^3.0.0","@typescript-eslint/parser":"^8.0.0","@typescript-eslint/eslint-plugin":"^8.0.0"},"optionalDependencies":{"@brashkie/signalis-core-darwin-x64":"0.4.9","@brashkie/signalis-core-android-x64":"0.4.9","@brashkie/signalis-core-darwin-arm64":"0.4.9","@brashkie/signalis-core-android-arm64":"0.4.9","@brashkie/signalis-core-linux-x64-gnu":"0.4.9","@brashkie/signalis-core-linux-x64-musl":"0.4.9","@brashkie/signalis-core-win32-x64-msvc":"0.4.9","@brashkie/signalis-core-linux-arm64-gnu":"0.4.9","@brashkie/signalis-core-android-arm-eabi":"0.4.9","@brashkie/signalis-core-win32-arm64-msvc":"0.4.9"},"_npmOperationalInternal":{"tmp":"tmp/signalis-core_0.4.9_1787193044488_0.13719990856946995","host":"s3://npm-registry-packages-npm-production"}},"0.4.10":{"name":"@brashkie/signalis-core","version":"0.4.10","keywords":["signal-protocol","e2e-encryption","cryptography","curve25519","ed25519","xed25519","x25519","ecdh","diffie-hellman","hkdf","aes-gcm","aes-cbc","aead","hmac","sha256","digital-signature","rust","napi","native","esm","commonjs","dual-package","hepein"],"author":{"url":"Hepein","name":"Brashkie"},"license":"Apache-2.0","_id":"@brashkie/signalis-core@0.4.10","maintainers":[{"name":"brashkie","email":"fabianoarjunken@gmail.com"}],"homepage":"https://github.com/Brashkie/signalis-core#readme","bugs":{"url":"https://github.com/Brashkie/signalis-core/issues"},"dist":{"shasum":"55396c27048e96109e7bcae130d688b410b11b76","tarball":"https://registry.npmjs.org/@brashkie/signalis-core/-/signalis-core-0.4.10.tgz","fileCount":15,"integrity":"sha512-BscodUFYuI0ENQgEINGC0hiVL9X3bWB5aJ0lzNi+YYpgPwcnPGPJyc9r1q7hzl/Au9fz4E6IGHC/x7QEnssZpQ==","signatures":[{"sig":"MEYCIQCHUAoZuH3s3rXwTHkbsrmuvrfhpHM7U/WRRtV+BM0OmAIhAPcYVOIuIyOjHvxxss4he9P4euufSNUsi8u9M8Q8KOHL","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":574131},"main":"./dist/index.cjs","napi":{"name":"signalis-core","triples":{"defaults":true,"additional":["x86_64-unknown-linux-musl","aarch64-unknown-linux-gnu","aarch64-apple-darwin","aarch64-pc-windows-msvc","aarch64-linux-android","armv7-linux-androideabi","x86_64-linux-android"]}},"type":"commonjs","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">= 18"},"exports":{".":{"types":{"import":"./dist/index.d.mts","require":"./dist/index.d.cts"},"import":"./dist/index.mjs","default":"./dist/index.cjs","require":"./dist/index.cjs"},"./package.json":"./package.json"},"gitHead":"bdfc1376457967814100b54121a7db91888669cc","scripts":{"lint":"eslint \"src/**/*.ts\" \"__tests__/**/*.ts\"","test":"npm run test:rust && npm run test:vitest && npm run test:dual","build":"npm run build:native && npm run build:ts","clean":"node -e \"const fs=require('fs');['dist','target','index.js','index.d.ts'].forEach(p=>fs.rmSync(p,{recursive:true,force:true}));fs.readdirSync('.').filter(f=>f.endsWith('.node')).forEach(f=>fs.rmSync(f,{force:true}));console.log('✓ Cleaned')\"","clippy":"cargo clippy --workspace --all-targets -- -D warnings","format":"prettier --write \"src/**/*.{ts,js}\" \"__tests__/**/*.ts\"","version":"napi version","build:ts":"tsup","examples":"npm run example:cjs && npm run example:esm && npm run example:ts && npm run example:signing && npm run example:aad && npm run example:e2e","artifacts":"napi artifacts","test:dual":"node __tests__/cjs.test.cjs && node __tests__/esm.test.mjs","test:rust":"cargo test --workspace --exclude sc-node","typecheck":"tsc --noEmit","example:ts":"tsx examples/ts-example.ts","test:watch":"cross-env VITE_CJS_IGNORE_WARNING=true vitest","build:debug":"npm run build:native:debug && npm run build:ts","example:aad":"node examples/aad.mjs","example:cjs":"node examples/cjs-example.cjs","example:e2e":"node examples/e2e-channel.mjs","example:esm":"node examples/esm-example.mjs","format:rust":"cargo fmt --all","test:vitest":"cross-env VITE_CJS_IGNORE_WARNING=true vitest run","build:native":"napi build --platform --release --cargo-cwd crates/sc-node --js index.js --dts index.d.ts","preartifacts":"node scripts/create-npm-dirs.js","coverage:open":"node -e \"require('child_process').exec(process.platform==='win32'?'start coverage/index.html':process.platform==='darwin'?'open coverage/index.html':'xdg-open coverage/index.html')\"","test:coverage":"cross-env VITE_CJS_IGNORE_WARNING=true vitest run --coverage","example:signing":"node examples/signing.mjs","test:coverage:ui":"cross-env VITE_CJS_IGNORE_WARNING=true vitest --coverage --ui","build:native:debug":"napi build --platform --cargo-cwd crates/sc-node --js index.js --dts index.d.ts"},"_npmUser":{"name":"brashkie","email":"fabianoarjunken@gmail.com"},"repository":{"url":"git+https://github.com/Brashkie/signalis-core.git","type":"git"},"_npmVersion":"10.8.2","description":"Cryptographic primitives for Signal Protocol — Rust-powered Node.js library with Ed25519, XEd25519, Curve25519, HKDF, AES-GCM (with AAD), AES-CBC, ChaCha20-Poly1305, HMAC, SHA-256 (ESM + CJS + TypeScript). Android arm64/armv7 support.","directories":{},"_nodeVersion":"20.20.2","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","tsup":"^8.5.0","eslint":"^9.0.0","vitest":"^3.0.0","prettier":"^3.3.0","cross-env":"^7.0.3","@vitest/ui":"^3.0.0","typescript":"^6.0.3","@types/node":"^22.0.0","@napi-rs/cli":"^2.18.4","@vitest/coverage-v8":"^3.0.0","@typescript-eslint/parser":"^8.0.0","@typescript-eslint/eslint-plugin":"^8.0.0"},"optionalDependencies":{"@brashkie/signalis-core-darwin-x64":"0.4.10","@brashkie/signalis-core-android-x64":"0.4.10","@brashkie/signalis-core-darwin-arm64":"0.4.10","@brashkie/signalis-core-android-arm64":"0.4.10","@brashkie/signalis-core-linux-x64-gnu":"0.4.10","@brashkie/signalis-core-linux-x64-musl":"0.4.10","@brashkie/signalis-core-win32-x64-msvc":"0.4.10","@brashkie/signalis-core-linux-arm64-gnu":"0.4.10","@brashkie/signalis-core-android-arm-eabi":"0.4.10","@brashkie/signalis-core-win32-arm64-msvc":"0.4.10"},"_npmOperationalInternal":{"tmp":"tmp/signalis-core_0.4.10_1787594083197_0.2784431265309437","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@brashkie/signalis-core","version":"0.5.0","keywords":["signal-protocol","e2e-encryption","cryptography","curve25519","ed25519","xed25519","x25519","ecdh","diffie-hellman","hkdf","aes-gcm","aes-cbc","aead","hmac","sha256","digital-signature","rust","napi","native","esm","commonjs","dual-package","hepein"],"author":{"url":"Hepein","name":"Brashkie"},"license":"Apache-2.0","_id":"@brashkie/signalis-core@0.5.0","maintainers":[{"name":"brashkie","email":"fabianoarjunken@gmail.com"}],"homepage":"https://github.com/Brashkie/signalis-core#readme","bugs":{"url":"https://github.com/Brashkie/signalis-core/issues"},"dist":{"shasum":"71d141984e2dd2ff858d9febf1d97b77f5f5185c","tarball":"https://registry.npmjs.org/@brashkie/signalis-core/-/signalis-core-0.5.0.tgz","fileCount":15,"integrity":"sha512-skN/g0Vw3jnZ8j4R3P/zURslCaQkktzN8aq1VEHL4LM0t2GgNKb2OgKd4268BVZBnmkClc+kVZr67DvyQVI+RQ==","signatures":[{"sig":"MEYCIQC2SDLB4VmFXE5udd5tf/y58Qrpx2IKLZrtVDLD4Mj1JwIhAPglgrdYboJEXogxxz2mGvXQv4obxXrvuE7gDVcBWKHx","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":596178},"main":"./dist/index.cjs","napi":{"name":"signalis-core","triples":{"defaults":true,"additional":["x86_64-unknown-linux-musl","aarch64-unknown-linux-gnu","aarch64-apple-darwin","aarch64-pc-windows-msvc","aarch64-linux-android","armv7-linux-androideabi","x86_64-linux-android"]}},"type":"commonjs","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">= 18"},"exports":{".":{"types":{"import":"./dist/index.d.mts","require":"./dist/index.d.cts"},"import":"./dist/index.mjs","default":"./dist/index.cjs","require":"./dist/index.cjs"},"./package.json":"./package.json"},"gitHead":"403571b43c95c755416b57debcc81311c8d75798","scripts":{"lint":"eslint \"src/**/*.ts\" \"__tests__/**/*.ts\"","test":"npm run test:rust && npm run test:vitest && npm run test:dual","build":"npm run build:native && npm run build:ts","clean":"node -e \"const fs=require('fs');['dist','target','index.js','index.d.ts'].forEach(p=>fs.rmSync(p,{recursive:true,force:true}));fs.readdirSync('.').filter(f=>f.endsWith('.node')).forEach(f=>fs.rmSync(f,{force:true}));console.log('✓ Cleaned')\"","clippy":"cargo clippy --workspace --all-targets -- -D warnings","format":"prettier --write \"src/**/*.{ts,js}\" \"__tests__/**/*.ts\"","version":"napi version","build:ts":"tsup","examples":"npm run example:cjs && npm run example:esm && npm run example:ts && npm run example:signing && npm run example:aad && npm run example:e2e","artifacts":"napi artifacts","test:dual":"node __tests__/cjs.test.cjs && node __tests__/esm.test.mjs","test:rust":"cargo test --workspace --exclude sc-node","typecheck":"tsc --noEmit","example:ts":"tsx examples/ts-example.ts","test:watch":"cross-env VITE_CJS_IGNORE_WARNING=true vitest","build:debug":"npm run build:native:debug && npm run build:ts","example:aad":"node examples/aad.mjs","example:cjs":"node examples/cjs-example.cjs","example:e2e":"node examples/e2e-channel.mjs","example:esm":"node examples/esm-example.mjs","format:rust":"cargo fmt --all","test:vitest":"cross-env VITE_CJS_IGNORE_WARNING=true vitest run","build:native":"napi build --platform --release --cargo-cwd crates/sc-node --js index.js --dts index.d.ts","preartifacts":"node scripts/create-npm-dirs.js","coverage:open":"node -e \"require('child_process').exec(process.platform==='win32'?'start coverage/index.html':process.platform==='darwin'?'open coverage/index.html':'xdg-open coverage/index.html')\"","test:coverage":"cross-env VITE_CJS_IGNORE_WARNING=true vitest run --coverage","example:signing":"node examples/signing.mjs","test:coverage:ui":"cross-env VITE_CJS_IGNORE_WARNING=true vitest --coverage --ui","build:native:debug":"napi build --platform --cargo-cwd crates/sc-node --js index.js --dts index.d.ts"},"_npmUser":{"name":"brashkie","email":"fabianoarjunken@gmail.com"},"repository":{"url":"git+https://github.com/Brashkie/signalis-core.git","type":"git"},"_npmVersion":"10.8.2","description":"Cryptographic primitives for Signal Protocol — Rust-powered Node.js library with Ed25519, XEd25519, Curve25519, HKDF, AES-GCM (with AAD), AES-CBC, ChaCha20-Poly1305, HMAC, SHA-256 (ESM + CJS + TypeScript). Android arm64/armv7 support.","directories":{},"_nodeVersion":"20.20.2","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","tsup":"^8.5.0","eslint":"^9.0.0","vitest":"^3.0.0","prettier":"^3.3.0","cross-env":"^7.0.3","@vitest/ui":"^3.0.0","typescript":"^6.0.3","@types/node":"^22.0.0","@napi-rs/cli":"^2.18.4","@vitest/coverage-v8":"^3.0.0","@typescript-eslint/parser":"^8.0.0","@typescript-eslint/eslint-plugin":"^8.0.0"},"optionalDependencies":{"@brashkie/signalis-core-darwin-x64":"0.5.0","@brashkie/signalis-core-android-x64":"0.5.0","@brashkie/signalis-core-darwin-arm64":"0.5.0","@brashkie/signalis-core-android-arm64":"0.5.0","@brashkie/signalis-core-linux-x64-gnu":"0.5.0","@brashkie/signalis-core-linux-x64-musl":"0.5.0","@brashkie/signalis-core-win32-x64-msvc":"0.5.0","@brashkie/signalis-core-linux-arm64-gnu":"0.5.0","@brashkie/signalis-core-android-arm-eabi":"0.5.0","@brashkie/signalis-core-win32-arm64-msvc":"0.5.0"},"_npmOperationalInternal":{"tmp":"tmp/signalis-core_0.5.0_1787691444952_0.5302758409929955","host":"s3://npm-registry-packages-npm-production"}},"0.5.1":{"name":"@brashkie/signalis-core","version":"0.5.1","keywords":["signal-protocol","e2e-encryption","cryptography","curve25519","ed25519","xed25519","x25519","ecdh","diffie-hellman","hkdf","aes-gcm","aes-cbc","aead","hmac","sha256","digital-signature","rust","napi","native","esm","commonjs","dual-package","hepein"],"author":{"url":"Hepein","name":"Brashkie"},"license":"Apache-2.0","_id":"@brashkie/signalis-core@0.5.1","maintainers":[{"name":"brashkie","email":"fabianoarjunken@gmail.com"}],"homepage":"https://github.com/Brashkie/signalis-core#readme","bugs":{"url":"https://github.com/Brashkie/signalis-core/issues"},"dist":{"shasum":"129932acb338a15c28a8c54cadb3e1c02faf3ab6","tarball":"https://registry.npmjs.org/@brashkie/signalis-core/-/signalis-core-0.5.1.tgz","fileCount":15,"integrity":"sha512-uejQVKD8cjT5zoU9Nb6t0YdrbWhZK0EFNe/B3Tf3JqIZ+VXpFsnSLnW5hxODJvHMOjE1hvlOMkiKjeS/FV4oWw==","signatures":[{"sig":"MEYCIQCBqy48VT6x0BTfR05ujCrbUBpx6igzOTWlYFrOim1k/wIhAOoxREz44u1GAk0X1TSJIbv6Hzy/iYU59FbiNX/cKMg5","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":597403},"main":"./dist/index.cjs","napi":{"name":"signalis-core","triples":{"defaults":true,"additional":["x86_64-unknown-linux-musl","aarch64-unknown-linux-gnu","aarch64-apple-darwin","aarch64-pc-windows-msvc","aarch64-linux-android","armv7-linux-androideabi","x86_64-linux-android"]}},"type":"commonjs","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">= 18"},"exports":{".":{"types":{"import":"./dist/index.d.mts","require":"./dist/index.d.cts"},"import":"./dist/index.mjs","default":"./dist/index.cjs","require":"./dist/index.cjs"},"./package.json":"./package.json"},"gitHead":"a25d77522c1bf89c3d00b05466b9f4ae94272077","scripts":{"lint":"eslint \"src/**/*.ts\" \"__tests__/**/*.ts\"","test":"npm run test:rust && npm run test:vitest && npm run test:dual","build":"npm run build:native && npm run build:ts","clean":"node -e \"const fs=require('fs');['dist','target','index.js','index.d.ts'].forEach(p=>fs.rmSync(p,{recursive:true,force:true}));fs.readdirSync('.').filter(f=>f.endsWith('.node')).forEach(f=>fs.rmSync(f,{force:true}));console.log('✓ Cleaned')\"","clippy":"cargo clippy --workspace --all-targets -- -D warnings","format":"prettier --write \"src/**/*.{ts,js}\" \"__tests__/**/*.ts\"","version":"napi version","build:ts":"tsup","examples":"npm run example:cjs && npm run example:esm && npm run example:ts && npm run example:signing && npm run example:aad && npm run example:e2e","artifacts":"napi artifacts","test:dual":"node __tests__/cjs.test.cjs && node __tests__/esm.test.mjs","test:rust":"cargo test --workspace --exclude sc-node","typecheck":"tsc --noEmit","example:ts":"tsx examples/ts-example.ts","test:watch":"cross-env VITE_CJS_IGNORE_WARNING=true vitest","build:debug":"npm run build:native:debug && npm run build:ts","example:aad":"node examples/aad.mjs","example:cjs":"node examples/cjs-example.cjs","example:e2e":"node examples/e2e-channel.mjs","example:esm":"node examples/esm-example.mjs","format:rust":"cargo fmt --all","test:vitest":"cross-env VITE_CJS_IGNORE_WARNING=true vitest run","build:native":"napi build --platform --release --cargo-cwd crates/sc-node --js index.js --dts index.d.ts","preartifacts":"node scripts/create-npm-dirs.js","coverage:open":"node -e \"require('child_process').exec(process.platform==='win32'?'start coverage/index.html':process.platform==='darwin'?'open coverage/index.html':'xdg-open coverage/index.html')\"","test:coverage":"cross-env VITE_CJS_IGNORE_WARNING=true vitest run --coverage","example:signing":"node examples/signing.mjs","test:coverage:ui":"cross-env VITE_CJS_IGNORE_WARNING=true vitest --coverage --ui","build:native:debug":"napi build --platform --cargo-cwd crates/sc-node --js index.js --dts index.d.ts"},"_npmUser":{"name":"brashkie","email":"fabianoarjunken@gmail.com"},"repository":{"url":"git+https://github.com/Brashkie/signalis-core.git","type":"git"},"_npmVersion":"10.8.2","description":"Cryptographic primitives for Signal Protocol — Rust-powered Node.js library with Ed25519, XEd25519, Curve25519, HKDF, AES-GCM (with AAD), AES-CBC, ChaCha20-Poly1305, HMAC, SHA-256 (ESM + CJS + TypeScript). Android arm64/armv7 support.","directories":{},"_nodeVersion":"20.20.2","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","tsup":"^8.5.0","eslint":"^9.0.0","vitest":"^3.0.0","prettier":"^3.3.0","cross-env":"^7.0.3","@vitest/ui":"^3.0.0","typescript":"^6.0.3","@types/node":"^22.0.0","@napi-rs/cli":"^2.18.4","@vitest/coverage-v8":"^3.0.0","@typescript-eslint/parser":"^8.0.0","@typescript-eslint/eslint-plugin":"^8.0.0"},"optionalDependencies":{"@brashkie/signalis-core-darwin-x64":"0.5.1","@brashkie/signalis-core-android-x64":"0.5.1","@brashkie/signalis-core-darwin-arm64":"0.5.1","@brashkie/signalis-core-android-arm64":"0.5.1","@brashkie/signalis-core-linux-x64-gnu":"0.5.1","@brashkie/signalis-core-linux-x64-musl":"0.5.1","@brashkie/signalis-core-win32-x64-msvc":"0.5.1","@brashkie/signalis-core-linux-arm64-gnu":"0.5.1","@brashkie/signalis-core-android-arm-eabi":"0.5.1","@brashkie/signalis-core-win32-arm64-msvc":"0.5.1"},"_npmOperationalInternal":{"tmp":"tmp/signalis-core_0.5.1_1788015354889_0.20897572777438977","host":"s3://npm-registry-packages-npm-production"}},"0.5.2":{"name":"@brashkie/signalis-core","version":"0.5.2","description":"Cryptographic primitives for Signal Protocol — Rust-powered Node.js library with Ed25519, XEd25519, Curve25519, HKDF, AES-GCM (with AAD), AES-CBC, ChaCha20-Poly1305, HMAC, SHA-256 (ESM + CJS + TypeScript). Android arm64/armv7 support.","type":"commonjs","main":"./dist/index.cjs","module":"./dist/index.mjs","types":"./dist/index.d.ts","exports":{".":{"types":{"import":"./dist/index.d.mts","require":"./dist/index.d.cts"},"import":"./dist/index.mjs","require":"./dist/index.cjs","default":"./dist/index.cjs"},"./package.json":"./package.json"},"scripts":{"preartifacts":"node scripts/create-npm-dirs.js","artifacts":"napi artifacts","build:native":"napi build --platform --release --cargo-cwd crates/sc-node --js index.js --dts index.d.ts","build:native:debug":"napi build --platform --cargo-cwd crates/sc-node --js index.js --dts index.d.ts","build:ts":"tsup","build":"npm run build:native && npm run build:ts","build:debug":"npm run build:native:debug && npm run build:ts","test":"npm run test:rust && npm run test:vitest && npm run test:dual","test:vitest":"cross-env VITE_CJS_IGNORE_WARNING=true vitest run","test:watch":"cross-env VITE_CJS_IGNORE_WARNING=true vitest","test:rust":"cargo test --workspace --exclude sc-node","test:dual":"node __tests__/cjs.test.cjs && node __tests__/esm.test.mjs","test:coverage":"cross-env VITE_CJS_IGNORE_WARNING=true vitest run --coverage","test:coverage:ui":"cross-env VITE_CJS_IGNORE_WARNING=true vitest --coverage --ui","coverage:open":"node -e \"require('child_process').exec(process.platform==='win32'?'start coverage/index.html':process.platform==='darwin'?'open coverage/index.html':'xdg-open coverage/index.html')\"","example:cjs":"node examples/cjs-example.cjs","example:esm":"node examples/esm-example.mjs","example:ts":"tsx examples/ts-example.ts","example:signing":"node examples/signing.mjs","example:aad":"node examples/aad.mjs","example:e2e":"node examples/e2e-channel.mjs","examples":"npm run example:cjs && npm run example:esm && npm run example:ts && npm run example:signing && npm run example:aad && npm run example:e2e","lint":"eslint \"src/**/*.ts\" \"__tests__/**/*.ts\"","typecheck":"tsc --noEmit","format":"prettier --write \"src/**/*.{ts,js}\" \"__tests__/**/*.ts\"","format:rust":"cargo fmt --all","clippy":"cargo clippy --workspace --all-targets -- -D warnings","clean":"node -e \"const fs=require('fs');['dist','target','index.js','index.d.ts'].forEach(p=>fs.rmSync(p,{recursive:true,force:true}));fs.readdirSync('.').filter(f=>f.endsWith('.node')).forEach(f=>fs.rmSync(f,{force:true}));console.log('✓ Cleaned')\"","version":"napi version"},"keywords":["signal-protocol","e2e-encryption","cryptography","curve25519","ed25519","xed25519","x25519","ecdh","diffie-hellman","hkdf","aes-gcm","aes-cbc","aead","hmac","sha256","digital-signature","rust","napi","native","esm","commonjs","dual-package","hepein"],"author":{"name":"Brashkie","url":"Hepein"},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/Brashkie/signalis-core.git"},"bugs":{"url":"https://github.com/Brashkie/signalis-core/issues"},"homepage":"https://github.com/Brashkie/signalis-core#readme","engines":{"node":">= 18"},"napi":{"name":"signalis-core","triples":{"defaults":true,"additional":["x86_64-unknown-linux-musl","aarch64-unknown-linux-gnu","aarch64-apple-darwin","aarch64-pc-windows-msvc","aarch64-linux-android","armv7-linux-androideabi","x86_64-linux-android"]}},"optionalDependencies":{"@brashkie/signalis-core-win32-x64-msvc":"0.5.2","@brashkie/signalis-core-win32-arm64-msvc":"0.5.2","@brashkie/signalis-core-darwin-x64":"0.5.2","@brashkie/signalis-core-darwin-arm64":"0.5.2","@brashkie/signalis-core-linux-x64-gnu":"0.5.2","@brashkie/signalis-core-linux-x64-musl":"0.5.2","@brashkie/signalis-core-linux-arm64-gnu":"0.5.2","@brashkie/signalis-core-android-arm64":"0.5.2","@brashkie/signalis-core-android-arm-eabi":"0.5.2","@brashkie/signalis-core-android-x64":"0.5.2"},"devDependencies":{"@napi-rs/cli":"^2.18.4","@types/node":"^22.0.0","@typescript-eslint/eslint-plugin":"^8.0.0","@typescript-eslint/parser":"^8.0.0","@vitest/coverage-v8":"^3.0.0","@vitest/ui":"^3.0.0","cross-env":"^7.0.3","eslint":"^9.0.0","prettier":"^3.3.0","tsup":"^8.5.0","tsx":"^4.19.0","typescript":"^6.0.3","vitest":"^3.0.0"},"_id":"@brashkie/signalis-core@0.5.2","gitHead":"e4f15652076a5fcddbb684466e0b6102dc492594","_nodeVersion":"20.20.2","_npmVersion":"10.8.2","dist":{"integrity":"sha512-5IldX9ihmWF0qUI6hQR+yGewEk3vd8Q3HY/blxtpRL9wGdx/nXhNI9f/d4JuCdX4b2hDXFh1Lkte0vftNQugjQ==","shasum":"52615016a324b48436f8b39f0fcb1bd95efeac0b","tarball":"https://registry.npmjs.org/@brashkie/signalis-core/-/signalis-core-0.5.2.tgz","fileCount":15,"unpackedSize":598958,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCs3PA7hi6ViRtaECrNWuNOE6tlUOP5GHArMiPJvy4SoQIhAKinwMOnnqxeHO/MXaCoJB5oxe96QSyB0ULU3AbVlAHM"}]},"_npmUser":{"name":"brashkie","email":"fabianoarjunken@gmail.com"},"directories":{},"maintainers":[{"name":"brashkie","email":"fabianoarjunken@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/signalis-core_0.5.2_1788913810996_0.03440864088593254"},"_hasShrinkwrap":false}},"time":{"created":"2026-05-17T04:16:29.167Z","modified":"2026-09-09T00:30:11.276Z","0.1.0":"2026-05-17T04:16:29.413Z","0.2.0":"2026-05-23T22:55:54.533Z","0.3.0":"2026-06-19T14:52:38.067Z","0.3.1":"2026-06-24T01:55:42.187Z","0.4.0":"2026-07-11T05:13:08.676Z","0.4.1":"2026-08-10T23:23:33.238Z","0.4.2":"2026-08-12T00:47:05.094Z","0.4.3":"2026-08-12T15:58:47.794Z","0.4.4":"2026-08-12T22:48:07.238Z","0.4.5":"2026-08-13T21:23:32.416Z","0.4.6":"2026-08-14T01:58:25.154Z","0.4.7":"2026-08-16T00:40:32.138Z","0.4.8":"2026-08-18T04:31:10.925Z","0.4.9":"2026-08-20T02:30:44.635Z","0.4.10":"2026-08-24T17:54:43.419Z","0.5.0":"2026-08-25T20:57:25.094Z","0.5.1":"2026-08-29T14:55:55.025Z","0.5.2":"2026-09-09T00:30:11.144Z"},"bugs":{"url":"https://github.com/Brashkie/signalis-core/issues"},"author":{"name":"Brashkie","url":"Hepein"},"license":"Apache-2.0","homepage":"https://github.com/Brashkie/signalis-core#readme","keywords":["signal-protocol","e2e-encryption","cryptography","curve25519","ed25519","xed25519","x25519","ecdh","diffie-hellman","hkdf","aes-gcm","aes-cbc","aead","hmac","sha256","digital-signature","rust","napi","native","esm","commonjs","dual-package","hepein"],"repository":{"type":"git","url":"git+https://github.com/Brashkie/signalis-core.git"},"description":"Cryptographic primitives for Signal Protocol — Rust-powered Node.js library with Ed25519, XEd25519, Curve25519, HKDF, AES-GCM (with AAD), AES-CBC, ChaCha20-Poly1305, HMAC, SHA-256 (ESM + CJS + TypeScript). Android arm64/armv7 support.","maintainers":[{"name":"brashkie","email":"fabianoarjunken@gmail.com"}],"readme":"<div align=\"center\">\n\n<img src=\"media/logo.png\" alt=\"Signalis Core\" width=\"200\" />\n\n# 🔐 Signalis Core\n\n**Cryptographic primitives for the Signal Protocol — Rust-powered, blazing fast.**\n\n[![CI](https://github.com/Brashkie/signalis-core/actions/workflows/ci.yml/badge.svg)](https://github.com/Brashkie/signalis-core/actions/workflows/ci.yml)\n[![npm version](https://img.shields.io/npm/v/@brashkie/signalis-core.svg?style=flat&color=cb3837)](https://www.npmjs.com/package/@brashkie/signalis-core)\n[![npm downloads](https://img.shields.io/npm/dm/@brashkie/signalis-core.svg?style=flat&color=blue)](https://www.npmjs.com/package/@brashkie/signalis-core)\n[![License: Apache 2.0](https://img.shields.io/badge/License-Apache_2.0-blue.svg)](https://opensource.org/licenses/Apache-2.0)\n[![Rust](https://img.shields.io/badge/rust-1.80%2B-orange.svg)](https://www.rust-lang.org/)\n[![Node](https://img.shields.io/badge/node-%E2%89%A518-339933.svg)](https://nodejs.org/)\n[![Coverage](https://img.shields.io/badge/coverage-99%25-brightgreen.svg)](#testing)\n[![Tests](https://img.shields.io/badge/tests-269%2B%20passing-success.svg)](#testing)\n\n[**English**](./README.md) · [**Español**](./README.es.md) · [Docs](./docs) · [Roadmap](./ROADMAP.md) · [Changelog](./CHANGELOG.md)\n\n</div>\n\n---\n\n## ✨ What is Signalis Core?\n\n`@brashkie/signalis-core` is a **high-performance, audited cryptographic library** providing the foundational primitives for implementing the **Signal Protocol** in Node.js applications.\n\nBuilt with **Rust** for safety and speed, exposed to Node.js via [napi-rs](https://napi.rs), it provides a clean TypeScript API that works seamlessly in both CommonJS and ESM environments.\n\n> **Part of the [Hepein](https://github.com/Brashkie) ecosystem.**\n> The foundation for `@brashkie/signalis` (Signal Protocol), `@brashkie/waproto` (WhatsApp Protocol), and ultimately a from-scratch alternative to Baileys.\n\n---\n\n## 🎉 What's New in v0.5.0\n\n**Recent releases add two modern primitives and harden the AEAD suite — all fully backwards compatible.**\n\n| New | Description |\n|-----|-------------|\n| 🆕 **`XChaCha20Poly1305`** (v0.4.3) | Extended-nonce (24-byte) AEAD — safe to randomize nonces per message. Verified vs libsodium KAT |\n| 🆕 **`PBKDF2`** (v0.4.4) | PBKDF2-HMAC-SHA256 password KDF (RFC 8018). Verified vs RFC 6070-style KATs |\n| 🆕 **`Argon2id`** (v0.4.6) | Memory-hard password KDF (RFC 9106). Verified vs libargon2 reference KATs |\n| 🔒 **Strict Ed25519** (v0.4.7) | Verification now rejects signature malleability & non-canonical encodings (`verify_strict`) |\n| 🔒 **Wycheproof asymmetric** (v0.4.7) | 669 adversarial vectors for X25519 + Ed25519 (low-order points, malleability) |\n| 🛡️ **Hardening** (v0.4.8) | Supply-chain gate (`cargo-deny`), fuzzing (`cargo-fuzz`), and property-based tests — no API changes |\n| 🆕 **SHA-512 variants** (v0.4.9) | `HMAC.sha512` / `HMAC.verifySha512` (RFC 4231) and `HKDF.deriveSha512` (RFC 5869) |\n| 🆕 **SHA-3** (v0.4.10) | `SHA3.hash256` / `SHA3.hash512` (FIPS 202, Keccak) — verified vs NIST KATs |\n| 🎉 **BLAKE3** (v0.5.0) | `BLAKE3.hash` / `keyedHash` / `deriveKey` — **completes Phase 4** (modern primitives) |\n| 🧰 **Benchmarks + hygiene** (v0.5.1) | Criterion benches expanded to all primitives; internal deps switched to path-only — no API changes |\n| 🧪 **Property tests** (v0.5.2) | proptest invariants extended to SHA-3, BLAKE3, HMAC, PBKDF2, Argon2id, HKDF-SHA512 — no API changes |\n| 🔒 **Wycheproof vectors** (v0.4.5) | 382 adversarial AEAD test vectors (tampered tags, Poly1305 edge cases) for AES-GCM + ChaCha20-Poly1305 |\n| 🧰 **Utilities** (v0.4.1) | `split`, `concatBytes`, `splitBytes`, `bytesEqual` helpers |\n| 📊 **Criterion benchmarks** (v0.4.2) | Native benchmark suite for all primitives |\n\nSee the [CHANGELOG](./CHANGELOG.md) for full details.\n\n## 🎉 What's New in v0.4.0\n\n**v0.4.0 ships native encoding helpers (Base64, Hex, UTF-8) + Android x86_64 target — fully backwards compatible with v0.3.x.**\n\n| New | Description |\n|-----|-------------|\n| 🆕 **`Base64` namespace** | RFC 4648 standard + URL-safe variant (no padding), Rust-side implementation |\n| 🆕 **`Hex` namespace** | Lowercase/uppercase encode, case-insensitive decode, `isValid()` cheap check |\n| 🆕 **`Utf8` namespace** | **Strict** UTF-8 validation — throws on malformed bytes (unlike `Buffer.toString('utf-8')` which silently substitutes U+FFFD) |\n| 🆕 **Android x86_64** | Native binary for the Android Emulator + Chromebooks + x86 tablets |\n| 🆕 **`sc-encoding` crate** | Dedicated Rust crate — separates encoding logic from crypto for easier audit |\n\n### Quick Example: Base64 / Hex / Utf8\n\n```ts\nimport { Base64, Hex, Utf8 } from '@brashkie/signalis-core';\n\n// UTF-8 with strict validation\nconst bytes = Utf8.encode('Hola 🦀');           // Buffer <48 6f 6c 61 20 f0 9f a6 80>\nconst roundTrip = Utf8.decode(bytes);            // \"Hola 🦀\"\n\n// Base64 standard (with padding)\nconst b64 = Base64.encode(bytes);                // \"SG9sYSDwn6aA\"\nconst decoded = Base64.decode(b64);              // matches original\n\n// Base64 URL-safe (no padding, no + or /)\nconst urlSafe = Base64.encodeUrlSafe(bytes);     // safe in URLs, filenames, JWTs\n\n// Hex\nconst hex = Hex.encode(bytes);                   // \"486f6c6120f09fa680\"\nconst hexUpper = Hex.encodeUpper(bytes);         // \"486F6C6120F09FA680\"\nconst back = Hex.decode('DEADBEEF');             // case-insensitive\nHex.isValid('deadbeef');                          // true\nHex.isValid('nope!');                             // false\n\n// UTF-8 validation (cheap, no allocation)\nUtf8.isValid(Buffer.from([0xff]));                // false (0xff is never valid UTF-8)\n```\n\n### Why Strict UTF-8 Validation Matters\n\nNode's built-in `Buffer.toString('utf-8')` **silently substitutes U+FFFD** (the replacement character) when it encounters invalid bytes. For most app code that's fine. But when you're processing signed messages, verifying MACs, or handling attacker-supplied input, **you want to know** if bytes are malformed rather than continue with silently-corrupted data.\n\n```ts\nconst badBytes = Buffer.from([0xff, 0xfe]);\n\n// Node's built-in: no error, produces \"\\uFFFD\\uFFFD\"\nbadBytes.toString('utf-8');\n\n// signalis-core: throws\nUtf8.decode(badBytes);  // → RangeError\n```\n\n### Android x86_64 Use Cases\n\n- **Android Emulator** (Android Studio) — emulator runs x86_64, so devs testing apps now get native binaries automatically\n- **Termux on Chromebooks / x86 tablets** — `pkg install nodejs && npm install @brashkie/signalis-core`\n- **NodeJS-on-Android** with x86 device farms\n\n**Total platforms supported now: 10** (was 9 in v0.3.1).\n\nSee [CHANGELOG.md](./CHANGELOG.md) for full details.\n\n---\n\n## 🎉 What's New in v0.3.0\n\n**v0.3.0 ships Android support + ChaCha20-Poly1305 — fully backwards compatible with v0.2.0.**\n\n| New | Description |\n|-----|-------------|\n| 🆕 **Android arm64-v8a** | Native binary for modern Android phones (React Native, Termux) |\n| 🆕 **Android armv7** | Native binary for older Android devices (Android 4.4+) |\n| 🆕 **ChaCha20-Poly1305** | RFC 8439 AEAD — 2-3× faster than AES-GCM on ARM without AES-NI |\n| 🆕 **`constantTimeEq()`** | Timing-safe Buffer comparison (for MAC/signature checking) |\n| 🆕 **`nativeSecureRandom()`** | OS-backed CSPRNG via Rust side (alternative to JS `secureRandom`) |\n| 🆕 **`sc-utils` crate** | Public utility helpers (random, constant_time_eq, secure_zeroize) |\n| 🆕 **CI: cargo-audit gate** | Vulnerable transitive dependencies now fail PRs automatically |\n\n### Quick Example: ChaCha20-Poly1305\n\n```ts\nimport { ChaCha20Poly1305, secureRandom } from '@brashkie/signalis-core';\n\nconst key = secureRandom(32);\nconst nonce = secureRandom(12);\n\nconst ct = ChaCha20Poly1305.encrypt(key, nonce, Buffer.from('Hello!'));\nconst pt = ChaCha20Poly1305.decrypt(key, nonce, ct);  // → \"Hello!\"\n\n// With Additional Authenticated Data\nconst aad = Buffer.from('header metadata');\nconst ct2 = ChaCha20Poly1305.encryptWithAad(key, nonce, plaintext, aad);\nconst pt2 = ChaCha20Poly1305.decryptWithAad(key, nonce, ct2, aad);\n```\n\n### Why Should I Use ChaCha20-Poly1305 Instead of AES-GCM?\n\nUse **AES-GCM** on:\n- x86_64 servers (Intel/AMD with AES-NI hardware)\n- Modern desktops\n- Newer ARM CPUs with ARMv8 Crypto Extensions\n\nUse **ChaCha20-Poly1305** on:\n- Android phones (most don't have AES-NI)\n- Embedded / IoT devices\n- Anything without hardware AES support\n\nBoth have **identical security guarantees**. The difference is purely performance, depending on whether your target has AES-NI hardware.\n\nSee [MIGRATION.md](./MIGRATION.md) for upgrade details (it's a drop-in replacement).\n\n---\n\n## 🌍 Supported Platforms\n\n`@brashkie/signalis-core` ships prebuilt native binaries for **10 platforms** via npm `optionalDependencies`. The right binary downloads automatically based on your host OS + arch.\n\n| OS | Architecture | Sub-package | Status |\n|----|--------------|-------------|--------|\n| 🐧 Linux | x64 (glibc) | `signalis-core-linux-x64-gnu` | ✅ |\n| 🐧 Linux | x64 (musl) | `signalis-core-linux-x64-musl` | ✅ |\n| 🐧 Linux | arm64 (glibc) | `signalis-core-linux-arm64-gnu` | ✅ |\n| 🍎 macOS | x64 (Intel) | `signalis-core-darwin-x64` | ✅ |\n| 🍎 macOS | arm64 (Apple Silicon) | `signalis-core-darwin-arm64` | ✅ |\n| 🪟 Windows | x64 | `signalis-core-win32-x64-msvc` | ✅ |\n| 🪟 Windows | arm64 | `signalis-core-win32-arm64-msvc` | ✅ |\n| 🤖 Android | arm64-v8a | `signalis-core-android-arm64` | 🆕 v0.3.0 |\n| 🤖 Android | armv7 | `signalis-core-android-arm-eabi` | 🆕 v0.3.0 |\n| 🤖 Android | x86_64 | `signalis-core-android-x64` | 🆕 v0.4.0 |\n\nComing in future releases: **WASM (browsers)**, **iOS arm64**, **FreeBSD x64**, **RISC-V**.\n\n### Android Installation\n\nSame `npm install` works in any Node.js environment running on Android, including:\n- **Termux** on Android phones (`pkg install nodejs`)\n- **Termux on Chromebooks / x86 tablets** → uses `android-x64` binary automatically\n- **Android Emulator** (Android Studio) → x86_64 host, uses `android-x64` binary\n- **React Native** with Android target\n- **NodeJS-Mobile** apps\n- Custom embedded Node builds for IoT\n\n```bash\n# On Android (Termux for example):\npkg install nodejs\nnpm install @brashkie/signalis-core\n# → npm automatically downloads the right sub-package for your arch\n```\n\n---\n\n## 📋 Table of Contents\n\n- [🔐 Signalis Core](#-signalis-core)\n  - [✨ What is Signalis Core?](#-what-is-signalis-core)\n  - [🎉 What's New in v0.4.0](#-whats-new-in-v040)\n  - [🎉 What's New in v0.3.0](#-whats-new-in-v030)\n  - [🌍 Supported Platforms](#-supported-platforms)\n  - [📋 Table of Contents](#-table-of-contents)\n  - [🚀 Features](#-features)\n  - [🤔 Why Signalis Core?](#-why-signalis-core)\n    - [vs. Node's built-in `crypto`](#vs-nodes-built-in-crypto)\n    - [vs. Pure JavaScript libraries (`tweetnacl`, `libsodium-js`)](#vs-pure-javascript-libraries-tweetnacl-libsodium-js)\n    - [vs. Browser Web Crypto API](#vs-browser-web-crypto-api)\n  - [📥 Installation](#-installation)\n  - [⚡ Quick Start](#-quick-start)\n    - [Establish an end-to-end encrypted channel](#establish-an-end-to-end-encrypted-channel)\n    - [CommonJS](#commonjs)\n    - [Default Import](#default-import)\n  - [📚 API Reference](#-api-reference)\n    - [Curve25519 / X25519](#curve25519--x25519)\n    - [Ed25519](#ed25519)\n    - [XEd25519](#xed25519)\n    - [HKDF-SHA256](#hkdf-sha256)\n    - [PBKDF2-HMAC-SHA256](#pbkdf2-hmac-sha256-)\n    - [Argon2id](#argon2id-)\n    - [AES-256-GCM](#aes-256-gcm)\n    - [AES-256-CBC](#aes-256-cbc)\n    - [XChaCha20-Poly1305](#xchacha20-poly1305-)\n    - [HMAC-SHA256](#hmac-sha256)\n    - [SHA-256](#sha-256)\n    - [Utilities](#utilities)\n    - [Errors](#errors)\n  - [💡 Examples](#-examples)\n    - [Example: Secure file encryption](#example-secure-file-encryption)\n    - [Example: Signal-style \"Triple DH\"](#example-signal-style-triple-dh)\n    - [Example: Signing identity assertions (NEW v0.2.0)](#example-signing-identity-assertions-new-v020)\n    - [Example: Encrypted messages with authenticated headers (NEW v0.2.0)](#example-encrypted-messages-with-authenticated-headers-new-v020)\n  - [🏗️ Architecture](#️-architecture)\n    - [Build Output](#build-output)\n  - [🛡️ Security](#️-security)\n    - [Cryptographic Primitives](#cryptographic-primitives)\n    - [Security Properties](#security-properties)\n    - [Reporting a Vulnerability](#reporting-a-vulnerability)\n  - [⚡ Performance](#-performance)\n  - [🧪 Testing](#-testing)\n    - [Coverage](#coverage)\n    - [What's Tested](#whats-tested)\n  - [🔨 Building from Source](#-building-from-source)\n  - [🗺️ Roadmap](#️-roadmap)\n  - [🤝 Contributing](#-contributing)\n  - [🙏 Acknowledgments](#-acknowledgments)\n  - [📄 License](#-license)\n\n---\n\n## 🚀 Features\n\n| Feature | Description |\n|---------|-------------|\n| 🔥 **Blazing Fast** | Native Rust implementation via napi-rs (10-100x faster than pure JS) |\n| 🛡️ **Audited Crypto** | Built on `curve25519-dalek`, `ed25519-dalek`, RustCrypto suite — battle-tested libraries |\n| ✍️ **Digital Signatures** | Ed25519 (RFC 8032) and XEd25519 (Signal-style) — **NEW v0.2.0** |\n| 🔐 **AEAD with AAD** | AES-256-GCM with Additional Authenticated Data — **NEW v0.2.0** |\n| 🔑 **Extended-nonce AEAD** | XChaCha20-Poly1305 (24-byte nonce) — **NEW v0.4.3** |\n| 🔓 **Password KDF** | PBKDF2-HMAC-SHA256 (RFC 8018) — **NEW v0.4.4** |\n| 🧠 **Memory-hard KDF** | Argon2id (RFC 9106) — **NEW v0.4.6** |\n| 📦 **Dual Package** | Works in CommonJS, ESM, and TypeScript projects |\n| 🎯 **Type-Safe** | Full TypeScript definitions with branded types and rich error classes |\n| ✅ **Test Vectors** | Validated against RFC 5869, RFC 7748, RFC 8032, RFC 4231, NIST, and **Google Wycheproof** adversarial vectors |\n| 🌍 **Cross-Platform** | Prebuilt binaries for Windows, macOS, Linux (x64, ARM) + **Android arm64/armv7/x86_64** |\n| 🔒 **Constant-Time** | Side-channel resistant comparisons via `subtle` crate |\n| 🧹 **Auto-Zeroization** | Secrets are wiped from memory automatically |\n| 📊 **99%+ Coverage** | Comprehensive test suite with 269+ assertions |\n| 📖 **Well Documented** | Complete JSDoc + inline examples for every function |\n\n---\n\n## 🤔 Why Signalis Core?\n\n### vs. Node's built-in `crypto`\n\n```javascript\n// ❌ Node's crypto — verbose, error-prone, no Curve25519 native\nconst { createDiffieHellman, createCipheriv, randomBytes } = require('crypto');\n// ... 20+ lines of boilerplate per operation\n\n// ✅ Signalis Core — clean, type-safe, audited\nconst shared = Curve25519.diffieHellman(myPriv, theirPub);\nconst ct = AES_GCM.encrypt(key, nonce, plaintext);\n```\n\n### vs. Pure JavaScript libraries (`tweetnacl`, `libsodium-js`)\n\n| | Signalis Core | tweetnacl-js | libsodium-js |\n|---|---|---|---|\n| **Speed** | 🟢 Native Rust | 🟡 Pure JS | 🟡 WASM |\n| **Bundle Size** | 🟢 ~80KB native | 🟢 ~50KB | 🔴 ~800KB |\n| **TypeScript** | 🟢 First-class | 🟡 Types via @types | 🟡 Types via @types |\n| **Modern API** | 🟢 Promise/async-ready | 🔴 Callbacks | 🟡 Sync only |\n| **Tree-Shakeable** | 🟢 Yes | 🟢 Yes | 🔴 No |\n\n### vs. Browser Web Crypto API\n\nThe Web Crypto API requires Promises everywhere and has clunky `CryptoKey` objects. Signalis Core uses synchronous Buffers — a much more ergonomic API for server-side code.\n\n---\n\n## 📥 Installation\n\n```bash\n# npm\nnpm install @brashkie/signalis-core\n\n# pnpm\npnpm add @brashkie/signalis-core\n\n# yarn\nyarn add @brashkie/signalis-core\n\n# bun\nbun add @brashkie/signalis-core\n```\n\n**Requirements:**\n- Node.js ≥ 18\n- One of: Windows (x64), macOS (x64/arm64), or Linux (x64/arm64) with prebuilt binaries\n- Or: Rust 1.80+ to build from source\n\n---\n\n## ⚡ Quick Start\n\n### Establish an end-to-end encrypted channel\n\n```typescript\nimport {\n  Curve25519,\n  HKDF,\n  AES_GCM,\n  randomNonce,\n} from '@brashkie/signalis-core';\n\n// 1. Both parties generate keypairs\nconst alice = Curve25519.generateKeyPair();\nconst bob = Curve25519.generateKeyPair();\n\n// 2. ECDH key agreement (X25519)\nconst sharedSecret = Curve25519.diffieHellman(\n  alice.privateKey,\n  bob.publicKey,\n);\n\n// 3. Derive a session key through HKDF\nconst sessionKey = HKDF.derive(\n  Buffer.from('my-app-v1'),           // salt\n  sharedSecret,                       // IKM\n  Buffer.from('encryption-key'),      // info\n  32,                                 // length\n);\n\n// 4. Encrypt a message\nconst nonce = randomNonce();          // 12 random bytes\nconst plaintext = Buffer.from('Hello, World!');\nconst ciphertext = AES_GCM.encrypt(sessionKey, nonce, plaintext);\n\n// 5. Decrypt\nconst decrypted = AES_GCM.decrypt(sessionKey, nonce, ciphertext);\nconsole.log(decrypted.toString()); // → \"Hello, World!\"\n```\n\n### CommonJS\n\n```javascript\nconst sc = require('@brashkie/signalis-core');\n\nconst alice = sc.Curve25519.generateKeyPair();\nconst bob = sc.Curve25519.generateKeyPair();\nconst shared = sc.Curve25519.diffieHellman(alice.privateKey, bob.publicKey);\n```\n\n### Default Import\n\n```typescript\nimport sc from '@brashkie/signalis-core';\n\nconst keypair = sc.Curve25519.generateKeyPair();\nconst nonce = sc.randomNonce();\n```\n\n---\n\n## 📚 API Reference\n\n### Curve25519 / X25519\n\nElliptic curve operations for key agreement.\n\n```typescript\nimport { Curve25519, type KeyPair } from '@brashkie/signalis-core';\n\n// Generate a new keypair (uses OS CSPRNG)\nconst kp: KeyPair = Curve25519.generateKeyPair();\n// → { privateKey: Buffer(32), publicKey: Buffer(32) }\n\n// Derive public key from private\nconst pub = Curve25519.publicFromPrivate(privateKey);\n\n// X25519 ECDH key agreement\nconst shared = Curve25519.diffieHellman(myPriv, theirPub);\n// ⚠️ ALWAYS pass through HKDF before use!\n\n// Constants\nCurve25519.PRIVATE_KEY_SIZE;      // 32\nCurve25519.PUBLIC_KEY_SIZE;       // 32\nCurve25519.SHARED_SECRET_SIZE;    // 32\n```\n\n### Ed25519\n\n**NEW in v0.2.0.** Standard Ed25519 digital signatures (RFC 8032). Deterministic — same input always produces the same signature.\n\n```typescript\nimport { Ed25519, type KeyPair, type Signature } from '@brashkie/signalis-core';\n\n// Generate a new signing keypair\nconst keys: KeyPair = Ed25519.generateKeyPair();\n// → { privateKey: Buffer(32), publicKey: Buffer(32) }\n\n// Deterministic from a 32-byte seed\nconst fromSeed = Ed25519.keyPairFromSeed(seed);\n\n// Derive public from private\nconst pub = Ed25519.publicFromPrivate(privateKey);\n\n// Sign a message → 64-byte signature\nconst sig: Signature = Ed25519.sign(privateKey, message);\n\n// Verify (throws SignatureError on failure)\nEd25519.verify(publicKey, message, sig);\n\n// Verify (returns boolean, no throw)\nconst ok = Ed25519.verifyBool(publicKey, message, sig);\n\n// Verification is STRICT (v0.4.7+): malleable signatures (non-canonical S),\n// non-canonical point encodings, and small-order keys are rejected, matching\n// RFC 8032 strict verification. Legitimate signatures are unaffected.\n\n// Constants\nEd25519.PRIVATE_KEY_SIZE;    // 32\nEd25519.PUBLIC_KEY_SIZE;     // 32\nEd25519.SIGNATURE_SIZE;      // 64\nEd25519.SEED_SIZE;           // 32\n```\n\n### XEd25519\n\n**NEW in v0.2.0.** Sign with the **SAME** Curve25519 keypair used for ECDH. This is what the Signal Protocol uses for identity keys.\n\n```typescript\nimport { Curve25519, XEd25519 } from '@brashkie/signalis-core';\n\n// ONE keypair for both ECDH and signing\nconst identity = Curve25519.generateKeyPair();\n\n// Use for ECDH:\nconst shared = Curve25519.diffieHellman(identity.privateKey, peerPublic);\n\n// Use the SAME key to sign:\nconst sig = XEd25519.sign(identity.privateKey, message);\n\n// Verify with the SAME Curve25519 public key\nXEd25519.verify(identity.publicKey, message, sig);\n\n// XEd25519 signatures are NOT deterministic (use OS RNG)\nconst sig1 = XEd25519.sign(identity.privateKey, message);\nconst sig2 = XEd25519.sign(identity.privateKey, message);\n// sig1.equals(sig2) → false (intentionally probabilistic)\n\n// For deterministic signing (testing), provide explicit 64-byte random:\nconst random = secureRandom(64);\nconst detSig = XEd25519.signWithRandom(identity.privateKey, message, random);\n\n// Verify (boolean, no throw)\nconst ok = XEd25519.verifyBool(identity.publicKey, message, sig);\n\n// Constants\nXEd25519.PRIVATE_KEY_SIZE;   // 32 (same as Curve25519)\nXEd25519.PUBLIC_KEY_SIZE;    // 32 (same as Curve25519)\nXEd25519.SIGNATURE_SIZE;     // 64\nXEd25519.RANDOM_SIZE;        // 64\n```\n\n**When to use Ed25519 vs XEd25519:**\n\n| Need | Use |\n|------|-----|\n| Standard Ed25519, deterministic, RFC 8032 compliant | **Ed25519** |\n| Single identity key for ECDH + signing (Signal style) | **XEd25519** |\n| Reproducible signatures from seed | **Ed25519** |\n| Compatibility with Signal Protocol semantics | **XEd25519** |\n\n### HKDF-SHA256\n\nKey derivation per RFC 5869.\n\n```typescript\nimport { HKDF } from '@brashkie/signalis-core';\n\n// One-shot (recommended)\nconst okm = HKDF.derive(salt, ikm, info, length);\n\n// Two-step\nconst prk = HKDF.extract(salt, ikm);     // → 32 bytes\nconst okm = HKDF.expand(prk, info, 64);  // → 64 bytes\n\n// Derive multiple keys at once\nconst [encKey, macKey, ivKey] = HKDF.deriveMultiple(\n  salt,\n  ikm,\n  info,\n  [32, 32, 16],\n);\n\n// Object-based API\nconst okm = HKDF.deriveFromParams({\n  salt: Buffer.from('salt'),\n  ikm: sharedSecret,\n  info: Buffer.from('aes-key'),\n  length: 32,\n});\n```\n\n### AES-256-GCM\n\nAuthenticated encryption (recommended for most use cases).\n\n```typescript\nimport { AES_GCM, randomNonce } from '@brashkie/signalis-core';\n\nconst key = randomKey();              // 32 bytes\nconst nonce = randomNonce();          // 12 bytes (MUST be unique per message)\n\n// Encrypt → ciphertext || 16-byte tag\nconst ct = AES_GCM.encrypt(key, nonce, plaintext);\n\n// Decrypt + verify tag\nconst pt = AES_GCM.decrypt(key, nonce, ct);\n// Throws AuthenticationError if tampered\n```\n\n**With Additional Authenticated Data (AAD) — NEW in v0.2.0:**\n\n```typescript\nimport { AES_GCM } from '@brashkie/signalis-core';\n\n// AAD is authenticated but NOT encrypted — useful for headers/metadata\nconst header = Buffer.from('msg_id=42|sender=alice');\nconst body = Buffer.from('encrypted body content');\n\nconst ct = AES_GCM.encryptWithAad(key, nonce, body, header);\n\n// Decrypt — MUST pass same AAD, or AuthenticationError\nconst pt = AES_GCM.decryptWithAad(key, nonce, ct, header);\n\n// Tampering with header (AAD) → fails\nconst tampered = Buffer.from(header);\ntampered[0] ^= 0xff;\nAES_GCM.decryptWithAad(key, nonce, ct, tampered);  // throws AuthenticationError\n```\n\n> **⚠️ CRITICAL:** Never reuse a `(key, nonce)` pair. Use `randomNonce()` for every message, or use a deterministic counter under the same key (max 2³² messages).\n\n### AES-256-CBC\n\nBlock cipher (pair with HMAC for integrity).\n\n```typescript\nimport { AES_CBC, HMAC, randomIv, concat } from '@brashkie/signalis-core';\n\n// Encrypt-then-MAC pattern (the only safe way to use CBC)\nconst iv = randomIv();\nconst ct = AES_CBC.encrypt(encKey, iv, plaintext);\nconst tag = HMAC.sha256(macKey, concat([iv, ct]));\n\n// To decrypt: verify MAC first, then decrypt\nif (HMAC.verifySha256(macKey, concat([iv, ct]), tag)) {\n  const pt = AES_CBC.decrypt(encKey, iv, ct);\n}\n```\n\n### ChaCha20-Poly1305 🆕\n\nRFC 8439 authenticated encryption. Alternative to AES-GCM, faster on ARM without AES-NI.\n\n```typescript\nimport { ChaCha20Poly1305, secureRandom } from '@brashkie/signalis-core';\n\nconst key = secureRandom(32);     // ChaCha20Poly1305.KEY_SIZE\nconst nonce = secureRandom(12);   // ChaCha20Poly1305.NONCE_SIZE\n\n// Basic encrypt/decrypt (no AAD)\nconst ct = ChaCha20Poly1305.encrypt(key, nonce, plaintext);\nconst pt = ChaCha20Poly1305.decrypt(key, nonce, ct);\n\n// With Additional Authenticated Data\nconst aad = Buffer.from('public header');\nconst ct2 = ChaCha20Poly1305.encryptWithAad(key, nonce, plaintext, aad);\nconst pt2 = ChaCha20Poly1305.decryptWithAad(key, nonce, ct2, aad);\n\n// Constants\nChaCha20Poly1305.KEY_SIZE;     // 32\nChaCha20Poly1305.NONCE_SIZE;   // 12\nChaCha20Poly1305.TAG_SIZE;     // 16 (appended to ciphertext)\n```\n\n**Performance vs AES-GCM:**\n\n| Target | Winner | Why |\n|--------|--------|-----|\n| Server x86_64 (AES-NI) | AES-GCM | Hardware acceleration |\n| Modern desktop (AES-NI) | AES-GCM | Hardware acceleration |\n| Android arm64 (no ARMv8 crypto) | **ChaCha20-Poly1305** | Pure CPU, ChaCha is faster |\n| IoT / embedded | **ChaCha20-Poly1305** | No AES hardware needed |\n| Apple Silicon (M-series) | Either (close) | Both well-optimized |\n\n**Security:** ChaCha20-Poly1305 and AES-GCM have equivalent security properties. The choice is purely about performance on your target.\n\n### XChaCha20-Poly1305 🆕\n\nExtended-nonce (24-byte) variant of ChaCha20-Poly1305 — **NEW v0.4.3**. Same key and security; the larger nonce makes it safe to generate nonces randomly per message without tracking uniqueness.\n\n```typescript\nimport { XChaCha20Poly1305, secureRandom } from '@brashkie/signalis-core';\n\nconst key = secureRandom(32);     // XChaCha20Poly1305.KEY_SIZE\nconst nonce = secureRandom(24);   // 24 bytes — safe to randomize per message\n\nconst ct = XChaCha20Poly1305.encrypt(key, nonce, plaintext);\nconst pt = XChaCha20Poly1305.decrypt(key, nonce, ct);\n\n// With Additional Authenticated Data\nconst aad = Buffer.from('public header');\nconst ct2 = XChaCha20Poly1305.encryptWithAad(key, nonce, plaintext, aad);\nconst pt2 = XChaCha20Poly1305.decryptWithAad(key, nonce, ct2, aad);\n\n// Constants\nXChaCha20Poly1305.KEY_SIZE;    // 32\nXChaCha20Poly1305.NONCE_SIZE;  // 24\nXChaCha20Poly1305.TAG_SIZE;    // 16 (appended to ciphertext)\n```\n\n**When to prefer XChaCha20-Poly1305:** with a 12-byte nonce (ChaCha20-Poly1305 / AES-GCM) you must guarantee nonces never repeat under the same key — usually with a counter. The 24-byte nonce here has enough space that random per-message nonces are safe, which simplifies designs where coordinating a counter is hard. Verified against a libsodium known-answer vector for interoperability.\n\n### PBKDF2-HMAC-SHA256 🆕\n\nPassword-based key derivation per RFC 8018 — **NEW v0.4.4**. Where HKDF expands a high-entropy secret, PBKDF2 is built for **low-entropy passwords**: it applies HMAC-SHA256 many times to make brute-forcing expensive.\n\n```typescript\nimport { PBKDF2, secureRandom } from '@brashkie/signalis-core';\n\nconst salt = secureRandom(16);    // unique, random, per password\nconst iterations = 600_000;       // work factor (OWASP guidance for PBKDF2-SHA256)\n\nconst key = PBKDF2.derive(Buffer.from(password), salt, iterations, 32);\n```\n\n- **salt**: must be non-empty; use a unique, random salt (≥16 bytes) per password.\n- **iterations**: the tunable work factor (≥1; use hundreds of thousands in production).\n- **length**: desired key length in bytes (≥1).\n\nVerified against RFC 6070-style known-answer tests (cross-checked with OpenSSL / Node's `crypto.pbkdf2`).\n\n**HKDF vs PBKDF2:** use HKDF to derive keys from an already-random secret (e.g. a Diffie-Hellman result); use PBKDF2 (or Argon2 in future) to derive a key from a human password.\n\n### Argon2id 🆕\n\nMemory-hard password hashing per RFC 9106 — **NEW v0.4.6**. The current recommended password KDF. Unlike PBKDF2 (iteration-only), Argon2id forces an attacker to spend large amounts of RAM per guess, defeating GPU/ASIC parallelism.\n\n```typescript\nimport { Argon2id, secureRandom } from '@brashkie/signalis-core';\n\nconst salt = secureRandom(16);\n// OWASP starting point for interactive logins: 19 MiB, 2 passes, 1 lane\nconst key = Argon2id.derive(Buffer.from(password), salt, 19456, 2, 1, 32);\n```\n\n- **mCost**: memory cost in **KiB** (e.g. `19456` = 19 MiB, `65536` = 64 MiB).\n- **tCost**: iterations / time cost (≥1).\n- **pCost**: parallelism / lanes (≥1).\n- **length**: desired key length in bytes.\n\nAlgorithm is fixed to Argon2id, version 0x13. Verified against the Argon2 reference implementation (libargon2) across multiple parameter sets.\n\n**PBKDF2 vs Argon2id:** prefer Argon2id for new code when you can afford the memory; PBKDF2 remains for constrained/FIPS-oriented environments.\n\n### Base64 / Hex / UTF-8 🆕\n\nNative (Rust-side) encoding helpers introduced in v0.4.0. Backed by the `sc-encoding` crate, which uses the audited RustCrypto ecosystem (`base64` and `hex` crates) plus Rust's built-in strict UTF-8 validation.\n\n**Why not just use Node's `Buffer.toString('base64')`?**\n- `Buffer.toString('utf-8')` silently substitutes `U+FFFD` for invalid bytes. Ours throws — better for signature verification, forensic parsing, adversarial input.\n- Consistent error surface across the whole library (same `RangeError` shape as the crypto primitives).\n- Same audit surface — one crate to review, not \"whatever Node happens to ship\".\n\n```typescript\nimport { Base64, Hex, Utf8 } from '@brashkie/signalis-core';\n\n// ─── Base64 (standard, RFC 4648) ───────────────────────────────────\nBase64.encode(Buffer.from('hello'));          // \"aGVsbG8=\"\nBase64.decode('aGVsbG8=');                     // <Buffer 68 65 6c 6c 6f>\n\n// ─── Base64 URL-safe (no padding, no + or /) ───────────────────────\nBase64.encodeUrlSafe(Buffer.from('hello'));    // \"aGVsbG8\"\nBase64.decodeUrlSafe('aGVsbG8');\n\n// ─── Hex ────────────────────────────────────────────────────────────\nHex.encode(Buffer.from([0xde, 0xad]));         // \"dead\"\nHex.encodeUpper(Buffer.from([0xde, 0xad]));    // \"DEAD\"\nHex.decode('DEADBEEF');                        // case-insensitive\nHex.isValid('deadbeef');                        // true\nHex.isValid('nope');                            // false — invalid chars\n\n// ─── UTF-8 (strict) ─────────────────────────────────────────────────\nUtf8.encode('Hola 🦀');                        // Buffer with 9 bytes\nUtf8.decode(Buffer.from([0xc3, 0xb1]));        // \"ñ\"\nUtf8.decode(Buffer.from([0xff]));              // → throws RangeError\nUtf8.isValid(Buffer.from([0xff]));             // false (no throw)\n```\n\n**Errors:** Every decode operation throws `RangeError` (subclass of `Error`) with a descriptive message. Invalid characters, wrong lengths, malformed padding, and invalid UTF-8 sequences all follow the same pattern.\n\n**Performance:** These functions have one NAPI hop each. For small strings the overhead is negligible; for hot loops (millions of ops/sec on tiny inputs) prefer `Buffer.toString()` from Node's built-in and only reach for `Utf8.decode` when you need strict validation.\n\n### HMAC-SHA256\n\nMessage authentication.\n\n```typescript\nimport { HMAC } from '@brashkie/signalis-core';\n\nconst tag = HMAC.sha256(key, data);                    // 32 bytes\nconst valid = HMAC.verifySha256(key, data, tag);       // constant-time\n\n// SHA-512 variant (v0.4.9) — 64-byte tag\nconst tag512 = HMAC.sha512(key, data);                 // 64 bytes\nconst valid512 = HMAC.verifySha512(key, data, tag512); // constant-time\n\n// HKDF also has a SHA-512 one-shot (v0.4.9):\n// HKDF.deriveSha512(salt, ikm, info, length)\n```\n\n### SHA-256\n\nCryptographic hashing.\n\n```typescript\nimport { SHA256 } from '@brashkie/signalis-core';\n\nconst hash = SHA256.hash(data);                        // 32 bytes\nconst hash2 = SHA256.hashAll([buf1, buf2, buf3]);      // hash concatenated\n```\n\n### SHA-3 🆕\n\nKeccak-based hashing (FIPS 202) — **NEW v0.4.10**. Structurally different from SHA-2; use it when a protocol requires SHA-3 or for diversity from the SHA-2 family.\n\n```typescript\nimport { SHA3 } from '@brashkie/signalis-core';\n\nconst d256 = SHA3.hash256(data);   // SHA3-256 → 32 bytes\nconst d512 = SHA3.hash512(data);   // SHA3-512 → 64 bytes\nconst d = SHA3.hash256All([a, b]); // hash concatenated buffers\n```\n\nVerified against NIST FIPS 202 known-answer tests.\n\n### BLAKE3 🆕\n\nFast, modern hashing with three modes (FIPS-free, public-domain) — **NEW v0.5.0**. One primitive covers hashing, MAC, and KDF.\n\n```typescript\nimport { BLAKE3, secureRandom } from '@brashkie/signalis-core';\n\n// 1. Hash\nconst digest = BLAKE3.hash(data);                       // 32 bytes\n\n// 2. Keyed hash (MAC — an HMAC alternative)\nconst key = secureRandom(32);\nconst mac = BLAKE3.keyedHash(key, data);\nconst ok = BLAKE3.keyedHashVerify(key, data, mac);      // constant-time\n\n// 3. Key derivation (an HKDF alternative)\nconst subkey = BLAKE3.deriveKey('myapp 2026-01-01 session key', ikm);\n```\n\n- **keyedHash**: the key must be exactly 32 bytes. Great as a fast MAC.\n- **deriveKey**: the context string should be hardcoded, globally unique, and application-specific (it provides domain separation — not a salt, not secret).\n\nVerified against the official BLAKE3 test vectors.\n\n**BLAKE3 vs the others:** BLAKE3 is extremely fast and versatile (hash + MAC + KDF in one). For *password* hashing, still use {@link Argon2id} — BLAKE3 is intentionally fast, which is the opposite of what password hashing needs.\n\n### Utilities\n\n```typescript\nimport {\n  // Secure random\n  secureRandom,    // (length) → Buffer\n  randomNonce,     // → 12-byte Buffer (for GCM)\n  randomIv,        // → 16-byte Buffer (for CBC)\n  randomKey,       // → 32-byte Buffer\n\n  // Encoding\n  toHex,           // Buffer → string\n  fromHex,         // string → Buffer\n  toBase64,        // Buffer → string\n  fromBase64,      // string → Buffer\n  toBase64Url,     // Buffer → URL-safe string (no padding)\n  fromBase64Url,\n\n  // Security\n  constantTimeEqual,    // (a, b) → boolean (timing-safe, JS-side)\n  constantTimeEq,       // 🆕 v0.3.0 — same but routed via Rust side\n  nativeSecureRandom,   // 🆕 v0.3.0 — OS CSPRNG via Rust (vs node:crypto)\n\n  // Buffer ops\n  concat,          // (buffers[]) → Buffer\n  xor,             // (a, b) → Buffer\n  zeroize,         // (buf) → void (wipes in-place)\n} from '@brashkie/signalis-core';\n```\n\n#### When to use `constantTimeEq` vs `constantTimeEqual`?\n\nBoth compare in constant time. `constantTimeEqual` uses JavaScript's `Buffer.compare` semantics (the JS-side implementation). `constantTimeEq` (v0.3.0) routes through Rust's audited `subtle::ConstantTimeEq` crate. Either is safe — use `constantTimeEq` if you want to ensure your timing-safe code path matches what the rest of the library uses internally.\n\n#### When to use `nativeSecureRandom` vs `secureRandom`?\n\n`secureRandom(n)` uses Node's `crypto.randomBytes()`. `nativeSecureRandom(n)` (v0.3.0) routes through Rust's `OsRng` (which calls `getrandom`/`BCryptGenRandom`/`SecRandomCopyBytes` directly). Both are cryptographically secure. Use `nativeSecureRandom` if you want a single audit surface for entropy across your whole stack.\n\n### Errors\n\nAll errors extend `SignalisError`:\n\n```typescript\nimport {\n  SignalisError,            // Base class\n  ValidationError,          // Bad input (wrong size, wrong type)\n  CryptoError,              // Crypto op failed\n  AuthenticationError,      // Tag/MAC verification failed (extends CryptoError)\n  KeyDerivationError,       // HKDF or similar failed (extends CryptoError)\n  SignatureError,           // Ed25519/XEd25519 verify failed (extends CryptoError) — NEW v0.2.0\n  LengthError,              // Output length out of bounds (extends ValidationError)\n} from '@brashkie/signalis-core';\n\ntry {\n  AES_GCM.decrypt(key, nonce, tamperedCiphertext);\n} catch (e) {\n  if (e instanceof AuthenticationError) {\n    console.error('Tampering detected!');\n  } else if (e instanceof ValidationError) {\n    console.error(`Invalid parameter: ${e.parameter}`);\n  } else if (e instanceof SignatureError) {\n    console.error('Invalid signature!');\n  }\n}\n```\n\n---\n\n## 💡 Examples\n\nThe `examples/` directory contains complete working demos:\n\n```bash\nnpm run example:cjs        # CommonJS (10 demos)\nnpm run example:esm        # ESM (Alice ↔ Bob channel)\nnpm run example:ts         # TypeScript (type-safe patterns)\nnpm run example:signing    # Ed25519 + XEd25519 — NEW v0.2.0\nnpm run example:aad        # AES-GCM with AAD — NEW v0.2.0\nnpm run example:e2e        # Complete E2E channel — NEW v0.2.0\nnpm run examples           # Run all\n```\n\n### Example: Secure file encryption\n\n```typescript\nimport { AES_GCM, HKDF, randomKey, randomNonce } from '@brashkie/signalis-core';\nimport { readFile, writeFile } from 'fs/promises';\n\nasync function encryptFile(inputPath: string, outputPath: string, password: string) {\n  const masterKey = randomKey();\n  const fileKey = HKDF.derive(\n    Buffer.from('file-encryption-v1'),\n    Buffer.from(password),\n    Buffer.from(inputPath),\n    32,\n  );\n\n  const plaintext = await readFile(inputPath);\n  const nonce = randomNonce();\n  const ciphertext = AES_GCM.encrypt(fileKey, nonce, plaintext);\n\n  // Output: [12-byte nonce][ciphertext + 16-byte tag]\n  await writeFile(outputPath, Buffer.concat([nonce, ciphertext]));\n}\n```\n\n### Example: Signal-style \"Triple DH\"\n\n```typescript\nimport { Curve25519, HKDF, concat } from '@brashkie/signalis-core';\n\n// Alice has: identity key (IK_A), ephemeral key (EK_A)\n// Bob has:   identity key (IK_B), signed pre-key (SPK_B)\n\nfunction tripleDH(IK_A_priv: Buffer, EK_A_priv: Buffer,\n                  IK_B_pub: Buffer, SPK_B_pub: Buffer): Buffer {\n  const dh1 = Curve25519.diffieHellman(IK_A_priv, SPK_B_pub);   // Alice identity × Bob signed prekey\n  const dh2 = Curve25519.diffieHellman(EK_A_priv, IK_B_pub);    // Alice ephemeral × Bob identity\n  const dh3 = Curve25519.diffieHellman(EK_A_priv, SPK_B_pub);   // Alice ephemeral × Bob signed prekey\n\n  return HKDF.derive(\n    Buffer.alloc(32),                          // empty salt\n    concat([dh1, dh2, dh3]),                   // concatenated DHs as IKM\n    Buffer.from('Signal_X3DH_v1'),             // info\n    64,                                        // root_key (32) + chain_key (32)\n  );\n}\n```\n\n### Example: Signing identity assertions (NEW v0.2.0)\n\n```typescript\nimport { Curve25519, XEd25519 } from '@brashkie/signalis-core';\n\n// Alice's long-term identity key (Curve25519/XEd25519)\nconst aliceIdentity = Curve25519.generateKeyPair();\n\n// Alice generates an ephemeral session key\nconst aliceEphemeral = Curve25519.generateKeyPair();\n\n// Alice signs her ephemeral with her identity — proves \"this ephemeral is mine\"\nconst authProof = XEd25519.sign(\n  aliceIdentity.privateKey,\n  aliceEphemeral.publicKey,\n);\n\n// Bob verifies the authorization:\n// 1. Got Alice's identity public key from a trusted source\n// 2. Receives ephemeral + signature\ntry {\n  XEd25519.verify(aliceIdentity.publicKey, aliceEphemeral.publicKey, authProof);\n  // ✅ Bob now trusts the ephemeral key belongs to Alice\n} catch {\n  // ❌ Mallory tried to MITM with her own ephemeral\n}\n```\n\n### Example: Encrypted messages with authenticated headers (NEW v0.2.0)\n\n```typescript\nimport { AES_GCM, secureRandom } from '@brashkie/signalis-core';\n\nconst sessionKey = derivedFromECDHandHKDF;\n\nfunction sendMessage(body: Buffer, msgId: number) {\n  const nonce = secureRandom(12);\n  const header = Buffer.from(JSON.stringify({\n    msg_id: msgId,\n    timestamp: Date.now(),\n    sender: 'alice',\n  }));\n\n  // Header is authenticated but NOT encrypted (receiver needs it as plaintext)\n  const ciphertext = AES_GCM.encryptWithAad(sessionKey, nonce, body, header);\n\n  return { header, nonce, ciphertext };\n}\n\nfunction receiveMessage(packet: { header: Buffer; nonce: Buffer; ciphertext: Buffer }) {\n  // Decryption fails if EITHER ciphertext OR header was tampered\n  return AES_GCM.decryptWithAad(\n    sessionKey,\n    packet.nonce,\n    packet.ciphertext,\n    packet.header,\n  );\n}\n```\n\n---\n\n## 🏗️ Architecture\n\n```\n@brashkie/signalis-core\n│\n├── 🦀 Rust Workspace (8 crates)\n│   ├── sc-curve25519    →  X25519 ECDH operations\n│   ├── sc-ed25519       →  Ed25519 signatures (RFC 8032) — NEW v0.2.0\n│   ├── sc-xed25519      →  XEd25519 Signal-style signatures — NEW v0.2.0\n│   ├── sc-hkdf          →  HKDF-SHA256 derivation\n│   ├── sc-aes           →  AES-256-GCM (with AAD) & CBC\n│   ├── sc-hmac          →  HMAC-SHA256 with constant-time verify\n│   ├── sc-sha256        →  SHA-256 hashing\n│   └── sc-node          →  NAPI-RS bindings (cdylib)\n│\n└── 📦 TypeScript Layer\n    ├── core.ts          →  Crypto wrappers with validation\n    ├── types.ts         →  Type definitions (KeyPair, Signature, etc.)\n    ├── errors.ts        →  Typed error classes (incl. SignatureError)\n    ├── validators.ts    →  Input assertions\n    ├── utils.ts         →  Encoding + random + buffer helpers\n    ├── constants.ts     →  Public constants (sizes, limits)\n    └── index.ts         →  Public API surface\n```\n\n### Build Output\n\n```\ndist/\n├── index.cjs           ← CommonJS bundle\n├── index.mjs           ← ESM bundle\n├── index.d.ts          ← TypeScript types (ESM)\n└── index.d.cts         ← TypeScript types (CJS)\n\n(root)\n├── index.js            ← NAPI loader (platform-dispatch)\n├── index.d.ts          ← NAPI types\n└── *.node              ← Native binary per platform\n```\n\n---\n\n## 🛡️ Security\n\n### Cryptographic Primitives\n\n| Primitive | Spec | Implementation |\n|-----------|------|----------------|\n| X25519 | [RFC 7748](https://datatracker.ietf.org/doc/html/rfc7748) | [`curve25519-dalek`](https://github.com/dalek-cryptography/curve25519-dalek) (audited by NCC Group) |\n| Ed25519 | [RFC 8032](https://datatracker.ietf.org/doc/html/rfc8032) | [`ed25519-dalek`](https://github.com/dalek-cryptography/ed25519-dalek) (audited) — **NEW v0.2.0** |\n| XEd25519 | [Signal Spec](https://signal.org/docs/specifications/xeddsa/) | Custom impl over `curve25519-dalek` — **NEW v0.2.0** |\n| HKDF-SHA256 | [RFC 5869](https://datatracker.ietf.org/doc/html/rfc5869) | [`hkdf`](https://github.com/RustCrypto/KDFs) (RustCrypto) |\n| AES-256-GCM | [NIST SP 800-38D](https://csrc.nist.gov/publications/detail/sp/800-38d/final) | [`aes-gcm`](https://github.com/RustCrypto/AEADs) (RustCrypto, AAD support) |\n| AES-256-CBC | [NIST SP 800-38A](https://csrc.nist.gov/publications/detail/sp/800-38a/final) | [`aes`](https://github.com/RustCrypto/block-ciphers) (RustCrypto) |\n| HMAC-SHA256 | [RFC 2104](https://datatracker.ietf.org/doc/html/rfc2104) | [`hmac`](https://github.com/RustCrypto/MACs) (RustCrypto) |\n| SHA-256 | [FIPS 180-4](https://csrc.nist.gov/publications/detail/fips/180/4/final) | [`sha2`](https://github.com/RustCrypto/hashes) (RustCrypto) |\n\n### Security Properties\n\n- ✅ **No `unsafe` Rust code** in our wrappers (deny-listed via `#![deny(unsafe_code)]`)\n- ✅ **Constant-time** comparisons via the `subtle` crate\n- ✅ **Automatic zeroization** of private keys (via the `zeroize` crate)\n- ✅ **OS-level CSPRNG** for all random generation\n- ✅ **Test vectors from official RFCs/NIST** for every primitive\n- ✅ **CI on every PR**: tests + clippy + `cargo audit`\n- ✅ **No transitive vulnerabilities** (verified by `cargo audit`)\n\n### Reporting a Vulnerability\n\n**Please do NOT open a public GitHub issue.**\n\nUse GitHub's [private vulnerability reporting](https://github.com/Brashkie/signalis-core/security/advisories/new).\n\nSee [SECURITY.md](./SECURITY.md) for our full policy and response timeline.\n\n---\n\n## ⚡ Performance\n\nBenchmarks (Node 22, x86_64):\n\n| Operation | Throughput | vs. Pure JS |\n|-----------|------------|-------------|\n| Curve25519 keygen | ~50,000 ops/sec | **15×** faster than tweetnacl |\n| X25519 ECDH | ~25,000 ops/sec | **20×** faster |\n| Ed25519 sign | ~25,000 ops/sec | **20×** faster — NEW v0.2.0 |\n| Ed25519 verify | ~10,000 ops/sec | **15×** faster — NEW v0.2.0 |\n| XEd25519 sign | ~20,000 ops/sec | — — NEW v0.2.0 |\n| XEd25519 verify | ~10,000 ops/sec | — — NEW v0.2.0 |\n| HKDF derive (32 bytes) | ~500,000 ops/sec | **30×** faster |\n| AES-256-GCM encrypt (1 KB) | ~2 GB/sec | **80×** faster |\n| AES-GCM with AAD | <5% overhead vs no AAD | — NEW v0.2.0 |\n| SHA-256 (1 KB) | ~3 GB/sec | **50×** faster |\n| HMAC-SHA256 (1 KB) | ~2.5 GB/sec | **40×** faster |\n\n*Run `npm run bench` to benchmark on your machine (coming in v0.3).*\n\n---\n\n## 🧪 Testing\n\n```bash\n# Full test suite (Rust + Vitest + Dual ESM/CJS)\nnpm test\n\n# Coverage report\nnpm run test:coverage\n\n# Open coverage HTML\nnpm run coverage:open\n\n# Watch mode\nnpm run test:watch\n\n# Coverage UI\nnpm run test:coverage:ui\n```\n\n### Coverage\n\n| File | Statements | Branches | Functions | Lines |\n|------|-----------|----------|-----------|-------|\n| `core.ts` | 99% | 97% | 100% | 99% |\n| `constants.ts` | 100% | 100% | 100% | 100% |\n| `errors.ts` | 100% | 100% | 100% | 100% |\n| `utils.ts` | 100% | 100% | 100% | 100% |\n| `validators.ts` | 100% | 100% | 100% | 100% |\n| **Total** | **~99%** | **~97%** | **100%** | **~99%** |\n\n### What's Tested\n\n- ✅ All RFC test vectors (RFC 5869, 7748, 8032, 4231)\n- ✅ All NIST test vectors (AES, SHA-256)\n- ✅ Ed25519 RFC 8032 vector 1 (empty message) — NEW v0.2.0\n- ✅ XEd25519 round-trips with deterministic + probabilistic signing — NEW v0.2.0\n- ✅ AES-GCM AAD authentication (tampered AAD fails decryption) — NEW v0.2.0\n- ✅ Input validation for every public function\n- ✅ Error handling for every code path\n- ✅ Round-trip encryption / decryption\n- ✅ Tampering detection (AES-GCM tag failures, signature failures)\n- ✅ Both CommonJS and ESM consumption paths\n- ✅ Default export and named exports\n- ✅ **Google Wycheproof adversarial vectors** — AEAD (v0.4.5) + X25519/Ed25519 (v0.4.7), ~1,051 cases\n- ✅ **Property-based tests** (`proptest`, v0.4.8 + v0.5.2) — invariants across all primitives: DH commutativity, sign→verify round-trips, KDF/hash determinism, MAC verify round-trips, encoding round-trips, BLAKE3 context separation\n- ✅ **Fuzzing** (`cargo-fuzz`, v0.4.8) — \"never panic on arbitrary input\" for verify / DH / decoders (weekly)\n- ✅ **Supply-chain gate** (`cargo-deny` + `cargo-audit`) — licenses, banned crates, advisories\n\n**Test count: 269+ assertions across Rust (48) + Vitest (172) + CJS (12) + ESM (15) + new v0.2.0 tests (49).**\n\n---\n\n## 🔨 Building from Source\n\n```bash\n# Clone\ngit clone https://github.com/Brashkie/signalis-core.git\ncd signalis-core\n\n# Install dependencies\nnpm install\n\n# Build (release)\nnpm run build\n\n# Build (debug)\nnpm run build:debug\n\n# Run tests\nnpm test\n\n# Run examples\nnpm run examples\n```\n\n**Prerequisites:**\n- Rust 1.80+ (`rustup install stable`)\n- Node.js 18+\n- C/C++ build tools:\n  - Windows: [Visual Studio Build Tools](https://visualstudio.microsoft.com/visual-cpp-build-tools/)\n  - macOS: `xcode-select --install`\n  - Linux: `apt install build-essential` (or equivalent)\n\n---\n\n## 🗺️ Roadmap\n\nSee [ROADMAP.md](./ROADMAP.md) for detailed plans.\n\n**TL;DR:**\n- **v0.1** ✅ — Cryptographic primitives (Curve25519, HKDF, AES, HMAC, SHA-256)\n- **v0.2** ✅ — Ed25519, XEd25519, AES-GCM with AAD (current release)\n- **v0.3** — Benchmarks, X448 support, more test vectors\n- **v1.0** — Stable API, external audit\n- **Then:** [@brashkie/signalis](https://github.com/Brashkie/signalis) (X3DH + Double Ratchet)\n- **Then:** [@brashkie/waproto](https://github.com/Brashkie/waproto) (WhatsApp Protocol)\n- **Then:** HepeinBaileys 2.0 (full WhatsApp client from scratch)\n\n---\n\n## 🤝 Contributing\n\nContributions are welcome! See [CONTRIBUTING.md](./CONTRIBUTING.md) for guidelines.\n\n**Crypto code requires extra care.** All PRs touching cryptography must:\n- Pass all RFC/NIST test vectors\n- Include security-relevant tests\n- Be reviewed before merge\n\nPlease also read our [Code of Conduct](./CODE_OF_CONDUCT.md).\n\n---\n\n## 🙏 Acknowledgments\n\nBuilt on the shoulders of giants:\n\n- **[curve25519-dalek](https://github.com/dalek-cryptography/curve25519-dalek)** — Curve25519 in pure Rust\n- **[ed25519-dalek](https://github.com/dalek-cryptography/ed25519-dalek)** — Ed25519 in pure Rust (added in v0.2.0)\n- **[RustCrypto](https://github.com/RustCrypto)** — `aes`, `hkdf`, `hmac`, `sha2`\n- **[napi-rs](https://napi.rs)** — Rust ↔ Node bindings\n- **Signal Foundation** — [Protocol specifications](https://signal.org/docs/) (including [XEd25519](https://signal.org/docs/specifications/xeddsa/))\n- **[tsup](https://tsup.egoist.dev/)** — Dual ESM/CJS bundler\n- **[Vitest](https://vitest.dev/)** — Modern test runner\n\nSpecial thanks to the broader cryptography community for decades of research and open-source contributions.\n\n---\n\n## 📄 License\n\n**Apache License 2.0** © [Brashkie](https://github.com/Brashkie)\n\nSee [LICENSE](./LICENSE) and [NOTICE](./NOTICE) for full details.\n\n---\n\n<div align=\"center\">\n\n**Built with 🦀 by [Hepein](https://github.com/Brashkie)**\n\n[GitHub](https://github.com/Brashkie) · [npm](https://www.npmjs.com/~brashkie)\n\n</div>","readmeFilename":"README.md"}