{"_id":"@alessiofrittoli/crypto-cipher","_rev":"11-fc9999252b2d0ebb10ecbd8143f774df","name":"@alessiofrittoli/crypto-cipher","dist-tags":{"alpha":"3.0.0-alpha.4","latest":"3.1.0"},"versions":{"1.0.0":{"name":"@alessiofrittoli/crypto-cipher","version":"1.0.0","keywords":["nodejs-crypto","cryptography","cipher","aes","hybrid-encryption","stream-encrypt","stream-decrypt"],"author":{"url":"https://alessiofrittoli.it","name":"Alessio Frittoli","email":"info@alessiofrittoli.it"},"license":"MIT","_id":"@alessiofrittoli/crypto-cipher@1.0.0","maintainers":[{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"}],"homepage":"https://github.com/alessiofrittoli/crypto-cipher#readme","bugs":{"url":"https://github.com/alessiofrittoli/crypto-cipher/issues","email":"info@alessiofrittoli.it"},"dist":{"shasum":"407113591d7109429366c972ef70d7bdf8f072a7","tarball":"https://registry.npmjs.org/@alessiofrittoli/crypto-cipher/-/crypto-cipher-1.0.0.tgz","fileCount":11,"integrity":"sha512-Sx80nrFSqHHcWJIDKYl1T8J8LrJDwpWaiMYomongYJLHohP/LxJyEdirBZlVm7qjubK8TkUebW44V+/zRM8GAg==","signatures":[{"sig":"MEUCIFP62jN9N7uThQFvH0LDcXgAs/shBMcOqvB24sa8FCZpAiEA5VNujXGQN+KQYEhXmziQhh7Z9/nvQyHRafphRlCBfMw=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":68019},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./types":{"types":"./dist/types.d.ts","import":"./dist/types.mjs","require":"./dist/types.js"}},"gitHead":"e0898738024f5a67d7022be32f113d34c996628d","scripts":{"lint":"eslint","test":"jest","build":"pnpm lint && pnpm test:ci && tsup","release":"node scripts/publish.js --verbose --npm","test:ci":"jest --ci --verbose","test:jest":"pnpm test:watch jest.test.ts","test:misc":"pnpm test:watch misc.test.ts","test:watch":"jest --watchAll --verbose","build:watch":"tsup --watch","test:coverage":"pnpm test:watch --coverage","test:jest:jsdom":"JSDOM=true pnpm test:jest","test:ci:coverage":"pnpm test:ci --coverage","test:file-hybrid":"pnpm test:watch file-hybrid.test.ts","test:stream-hybrid":"pnpm test:watch stream-hybrid.test.ts","test:coverage:serve":"concurrently --prefix none --kill-others \"pnpm test:coverage\" \"pnpm test:serve-coverage\"","test:file-symmetric":"pnpm test:watch file-symmetric.test.ts","test:serve-coverage":"http-server ./coverage/lcov-report --gzip true -p 0 -o --silent","test:buffer-in-memory":"pnpm test:watch buffer-in-memory.test.ts","test:stream-symmetric":"pnpm test:watch stream-symmetric.test.ts"},"_npmUser":{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"},"repository":{"url":"git+https://github.com/alessiofrittoli/crypto-cipher.git","type":"git"},"_npmVersion":"10.9.0","description":"Node.js Cipher cryptograph utility library","directories":{},"sideEffects":false,"_nodeVersion":"22.12.0","dependencies":{"@alessiofrittoli/crypto-buffer":"^3.2.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","tsup":"^8.3.5","dotenv":"^16.4.7","eslint":"^9.18.0","globals":"^15.14.0","ts-jest":"^29.2.5","ts-node":"^10.9.2","@eslint/js":"^9.18.0","typescript":"^5.7.3","@types/jest":"^29.5.14","@types/node":"^22.10.6","http-server":"^14.1.1","concurrently":"^9.1.2","@jest/globals":"^29.7.0","typescript-eslint":"^8.20.0","jest-environment-jsdom":"^29.7.0","@alessiofrittoli/node-scripts":"^2.2.1"},"_npmOperationalInternal":{"tmp":"tmp/crypto-cipher_1.0.0_1737055729215_0.9202229150355683","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@alessiofrittoli/crypto-cipher","version":"1.1.0","keywords":["nodejs-crypto","cryptography","cipher","aes","hybrid-encryption","stream-encrypt","stream-decrypt"],"author":{"url":"https://alessiofrittoli.it","name":"Alessio Frittoli","email":"info@alessiofrittoli.it"},"license":"MIT","_id":"@alessiofrittoli/crypto-cipher@1.1.0","maintainers":[{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"}],"homepage":"https://github.com/alessiofrittoli/crypto-cipher#readme","bugs":{"url":"https://github.com/alessiofrittoli/crypto-cipher/issues","email":"info@alessiofrittoli.it"},"dist":{"shasum":"f8c5f82d12ec0580b8fadcac864178bd432029d4","tarball":"https://registry.npmjs.org/@alessiofrittoli/crypto-cipher/-/crypto-cipher-1.1.0.tgz","fileCount":11,"integrity":"sha512-bgMVru00Yj78rWfIIK3hUlsyo5kfwy526vAmETZMfw46r5ZeHuKcjf1lB6H7uILQJRGcGbo3MuzsPNLagqZ9Aw==","signatures":[{"sig":"MEQCIHiP0LeNygI/Gj8kyYPunpPb8zWOR7G4upISGsZx9hMeAiAEuSlCKFTHovShT29hGkSayi83mf2xL+HlOJK0n6ViiA==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":68125},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./types":{"types":"./dist/types.d.ts","import":"./dist/types.mjs","require":"./dist/types.js"}},"gitHead":"a80fde144107d16ccf9365d896c4369196226d6e","scripts":{"lint":"eslint","test":"jest","build":"pnpm lint && pnpm test:ci && tsup","release":"node scripts/publish.js --verbose --npm","test:ci":"jest --ci --verbose","test:jest":"pnpm test:watch jest.test.ts","test:misc":"pnpm test:watch misc.test.ts","test:watch":"jest --watchAll --verbose","build:watch":"tsup --watch","test:coverage":"pnpm test:watch --coverage","test:jest:jsdom":"JSDOM=true pnpm test:jest","test:ci:coverage":"pnpm test:ci --coverage","test:file-hybrid":"pnpm test:watch file-hybrid.test.ts","test:stream-hybrid":"pnpm test:watch stream-hybrid.test.ts","test:coverage:serve":"concurrently --prefix none --kill-others \"pnpm test:coverage\" \"pnpm test:serve-coverage\"","test:file-symmetric":"pnpm test:watch file-symmetric.test.ts","test:serve-coverage":"http-server ./coverage/lcov-report --gzip true -p 0 -o --silent","test:buffer-in-memory":"pnpm test:watch buffer-in-memory.test.ts","test:stream-symmetric":"pnpm test:watch stream-symmetric.test.ts"},"_npmUser":{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"},"repository":{"url":"git+https://github.com/alessiofrittoli/crypto-cipher.git","type":"git"},"_npmVersion":"10.9.0","description":"Node.js Cipher cryptograph utility library","directories":{},"sideEffects":false,"_nodeVersion":"22.12.0","dependencies":{"@alessiofrittoli/crypto-buffer":"^3.2.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","tsup":"^8.3.5","dotenv":"^16.4.7","eslint":"^9.18.0","globals":"^15.14.0","ts-jest":"^29.2.5","ts-node":"^10.9.2","@eslint/js":"^9.18.0","typescript":"^5.7.3","@types/jest":"^29.5.14","@types/node":"^22.10.7","http-server":"^14.1.1","concurrently":"^9.1.2","@jest/globals":"^29.7.0","typescript-eslint":"^8.20.0","jest-environment-jsdom":"^29.7.0","@alessiofrittoli/node-scripts":"^2.2.1"},"_npmOperationalInternal":{"tmp":"tmp/crypto-cipher_1.1.0_1737057091177_0.9044403081289552","host":"s3://npm-registry-packages-npm-production"}},"2.0.0":{"name":"@alessiofrittoli/crypto-cipher","version":"2.0.0","keywords":["nodejs-crypto","cryptography","cipher","aes","hybrid-encryption","stream-encrypt","stream-decrypt"],"author":{"url":"https://alessiofrittoli.it","name":"Alessio Frittoli","email":"info@alessiofrittoli.it"},"license":"MIT","_id":"@alessiofrittoli/crypto-cipher@2.0.0","maintainers":[{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"}],"homepage":"https://github.com/alessiofrittoli/crypto-cipher#readme","bugs":{"url":"https://github.com/alessiofrittoli/crypto-cipher/issues","email":"info@alessiofrittoli.it"},"dist":{"shasum":"97e2cee6bccbc17ea457012b20ac8575a53eb63b","tarball":"https://registry.npmjs.org/@alessiofrittoli/crypto-cipher/-/crypto-cipher-2.0.0.tgz","fileCount":15,"integrity":"sha512-NVLmTtUL6iutMaI6Jb8/EsEjIH5DV1/JnEhwfotdw3qM2h6fmCZc6Hw0BYH9KKecg3/J37lZuuaGv5IKssIU1Q==","signatures":[{"sig":"MEUCIHxrk4NpEn06zFti9YGCBMlp7gl2dbaDjmyF1X0Y7R2iAiEAnJezdK57KoQyOFHNXxPYy/hf4B0j5ROf7hwdjZ7Xno8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":146468},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./types":{"types":"./dist/types.d.ts","import":"./dist/types.mjs","require":"./dist/types.js"}},"gitHead":"0fd2afb6324cdd058f678b0001e0e72ca2d02197","scripts":{"lint":"eslint","test":"jest","build":"pnpm lint && pnpm test:ci && tsup","release":"node scripts/publish.js --verbose --npm","test:ci":"jest --ci --verbose","test:jest":"pnpm test:watch jest.test.ts","test:misc":"pnpm test:watch misc.test.ts","test:watch":"jest --watchAll --verbose","build:watch":"tsup --watch","test:coverage":"pnpm test:watch --coverage","test:jest:jsdom":"JSDOM=true pnpm test:jest","test:ci:coverage":"pnpm test:ci --coverage","test:file-hybrid":"pnpm test:watch file-hybrid.test.ts","test:stream-hybrid":"pnpm test:watch stream-hybrid.test.ts","test:coverage:serve":"concurrently --prefix none --kill-others \"pnpm test:coverage\" \"pnpm test:serve-coverage\"","test:file-symmetric":"pnpm test:watch file-symmetric.test.ts","test:serve-coverage":"http-server ./coverage/lcov-report --gzip true -p 0 -o --silent","test:buffer-in-memory":"pnpm test:watch buffer-in-memory.test.ts","test:stream-symmetric":"pnpm test:watch stream-symmetric.test.ts"},"_npmUser":{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"},"repository":{"url":"git+https://github.com/alessiofrittoli/crypto-cipher.git","type":"git"},"_npmVersion":"10.9.0","description":"Node.js Cipher cryptograph utility library","directories":{},"sideEffects":false,"_nodeVersion":"22.12.0","dependencies":{"@alessiofrittoli/crypto-buffer":"^3.2.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","tsup":"^8.3.5","dotenv":"^16.4.7","eslint":"^9.18.0","globals":"^15.14.0","ts-jest":"^29.2.5","ts-node":"^10.9.2","@eslint/js":"^9.18.0","typescript":"^5.7.3","@types/jest":"^29.5.14","@types/node":"^22.10.7","http-server":"^14.1.1","concurrently":"^9.1.2","@jest/globals":"^29.7.0","typescript-eslint":"^8.20.0","jest-environment-jsdom":"^29.7.0","@alessiofrittoli/node-scripts":"^2.2.1"},"_npmOperationalInternal":{"tmp":"tmp/crypto-cipher_2.0.0_1737572000792_0.04575821907056965","host":"s3://npm-registry-packages-npm-production"}},"2.1.0":{"name":"@alessiofrittoli/crypto-cipher","version":"2.1.0","keywords":["nodejs-crypto","cryptography","cipher","aes","hybrid-encryption","stream-encrypt","stream-decrypt"],"author":{"url":"https://alessiofrittoli.it","name":"Alessio Frittoli","email":"info@alessiofrittoli.it"},"license":"MIT","_id":"@alessiofrittoli/crypto-cipher@2.1.0","maintainers":[{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"}],"homepage":"https://github.com/alessiofrittoli/crypto-cipher#readme","bugs":{"url":"https://github.com/alessiofrittoli/crypto-cipher/issues","email":"info@alessiofrittoli.it"},"dist":{"shasum":"26424f913d041fe73b49c5d7de74d0017aaae869","tarball":"https://registry.npmjs.org/@alessiofrittoli/crypto-cipher/-/crypto-cipher-2.1.0.tgz","fileCount":15,"integrity":"sha512-b2NgASIfU7GqMv6CK8mVdTL7sUVlvJCpVFOPx0PiDhewEthWp7ZiraRmSjQn81q7ny95ToXwwKDdxe7IlI2VUQ==","signatures":[{"sig":"MEUCIQDoA0eZW0RpNr/cCk/1EP0Hft3tjinhNIn+pv8RELkhAQIgUBRZuD0dvCHFc+fGnFrlOELIJLg4GA+I8OTm65JfhKk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":147822},"main":"./dist/index.js","pnpm":{"onlyBuiltDependencies":["esbuild"]},"types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./types":{"types":"./dist/types.d.ts","import":"./dist/types.mjs","require":"./dist/types.js"}},"funding":[{"url":"https://github.com/sponsors/alessiofrittoli","type":"github"}],"gitHead":"29a8c25614512bd20da84d19ef4090a28ce64821","scripts":{"//1a":"*********************************************************************","//1b":"*********************** BUILD - LINT - RELEASE **********************","//1c":"*********************************************************************","//2a":"*********************************************************************","//2b":"***************************** UNIT TESTS ****************************","//2c":"*********************************************************************","//3a":"*********************************************************************","//3b":"************************ UNIT TESTS COVERAGE ************************","//3c":"*********************************************************************","//4a":"*********************************************************************","//4b":"************************ TARGETED UNIT TESTS ************************","//4c":"*********************************************************************","lint":"eslint","test":"jest --verbose","build":"pnpm lint && pnpm test:ci && tsup","release":"node scripts/publish.js --verbose --npm","test:ci":"jest --ci --verbose","test:misc":"pnpm test:watch misc.test.ts","test:watch":"jest --watchAll --verbose","build:watch":"tsup --watch","test:coverage":"pnpm test:watch --coverage","test:ci:coverage":"pnpm test:ci --coverage","test:file-hybrid":"pnpm test:watch file-hybrid.test.ts","test:stream-hybrid":"pnpm test:watch stream-hybrid.test.ts","test:coverage:serve":"concurrently --prefix none --kill-others \"pnpm test:coverage\" \"pnpm test:serve-coverage\"","test:file-symmetric":"pnpm test:watch file-symmetric.test.ts","test:serve-coverage":"http-server ./coverage/lcov-report --gzip true -p 0 -o --silent","test:buffer-in-memory":"pnpm test:watch buffer-in-memory.test.ts","test:stream-symmetric":"pnpm test:watch stream-symmetric.test.ts"},"_npmUser":{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"},"repository":{"url":"git+https://github.com/alessiofrittoli/crypto-cipher.git","type":"git"},"_npmVersion":"10.9.0","description":"Node.js Cipher cryptograph utility library","directories":{},"sideEffects":false,"_nodeVersion":"22.12.0","dependencies":{"@alessiofrittoli/crypto-buffer":"^3.5.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","tsup":"^8.4.0","dotenv":"^16.4.7","eslint":"^9.23.0","globals":"^16.0.0","ts-jest":"^29.2.6","ts-node":"^10.9.2","@eslint/js":"^9.23.0","typescript":"^5.8.2","@types/jest":"^29.5.14","@types/node":"^22.13.11","http-server":"^14.1.1","concurrently":"^9.1.2","@jest/globals":"^29.7.0","typescript-eslint":"^8.27.0","@alessiofrittoli/node-scripts":"^2.4.0"},"_npmOperationalInternal":{"tmp":"tmp/crypto-cipher_2.1.0_1742658804879_0.19439271267152947","host":"s3://npm-registry-packages-npm-production"}},"2.2.0":{"name":"@alessiofrittoli/crypto-cipher","version":"2.2.0","keywords":["nodejs-crypto","cryptography","cipher","aes","hybrid-encryption","stream-encrypt","stream-decrypt"],"author":{"url":"https://alessiofrittoli.it","name":"Alessio Frittoli","email":"info@alessiofrittoli.it"},"license":"MIT","_id":"@alessiofrittoli/crypto-cipher@2.2.0","maintainers":[{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"}],"homepage":"https://github.com/alessiofrittoli/crypto-cipher#readme","bugs":{"url":"https://github.com/alessiofrittoli/crypto-cipher/issues","email":"info@alessiofrittoli.it"},"dist":{"shasum":"28ab6f9adfbdbac1f5fc1387966e27207c124677","tarball":"https://registry.npmjs.org/@alessiofrittoli/crypto-cipher/-/crypto-cipher-2.2.0.tgz","fileCount":11,"integrity":"sha512-j+hsGvtgZ7h7nvLNVls4EDB3+YW50qJI+hCjdRrQXo5TTOaJXMgytRqWjBM9uTXbAQDqPnTtHgcMeuYe19MdEw==","signatures":[{"sig":"MEUCIFlqE7vgtld2MunSzPu7PZyRJuz4XObemrYLHOVJl+b/AiEA+rjn6SouX2reoV1ufhcDk8Y418pCmAjQCnX/MgDUyYM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":76947},"main":"./dist/index.js","pnpm":{"onlyBuiltDependencies":["esbuild"]},"types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./types":{"types":"./dist/types.d.ts","import":"./dist/types.mjs","require":"./dist/types.js"}},"funding":[{"url":"https://github.com/sponsors/alessiofrittoli","type":"github"}],"gitHead":"56e05fc8a3f9da53b7484399920dc160ed36bdb4","scripts":{"dev":"NODE_ENV=development tsup --watch","//1a":"*********************************************************************","//1b":"******************** DEV - BUILD - LINT - RELEASE *******************","//1c":"*********************************************************************","//2a":"*********************************************************************","//2b":"***************************** UNIT TESTS ****************************","//2c":"*********************************************************************","//3a":"*********************************************************************","//3b":"************************ UNIT TESTS COVERAGE ************************","//3c":"*********************************************************************","//4a":"*********************************************************************","//4b":"************************ TARGETED UNIT TESTS ************************","//4c":"*********************************************************************","lint":"eslint","test":"jest --verbose","build":"pnpm lint && pnpm test:ci && pnpm build:prod","release":"node scripts/publish.js --verbose --npm","test:ci":"jest --ci --verbose","test:misc":"pnpm test:watch misc.test.ts","build:prod":"NODE_ENV=production tsup","test:watch":"jest --watchAll --verbose","test:coverage":"pnpm test:watch --coverage","test:coverage:ci":"pnpm test:ci --coverage","test:file-hybrid":"pnpm test:watch file-hybrid.test.ts","test:stream-hybrid":"pnpm test:watch stream-hybrid.test.ts","test:coverage:serve":"concurrently --prefix none --kill-others \"pnpm test:coverage\" \"pnpm test:serve-coverage\"","test:file-symmetric":"pnpm test:watch file-symmetric.test.ts","test:serve-coverage":"http-server ./coverage/lcov-report --gzip true -p 0 -o --silent","test:buffer-in-memory":"pnpm test:watch buffer-in-memory.test.ts","test:stream-symmetric":"pnpm test:watch stream-symmetric.test.ts"},"_npmUser":{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"},"repository":{"url":"git+https://github.com/alessiofrittoli/crypto-cipher.git","type":"git"},"_npmVersion":"11.0.0","description":"Node.js Cipher cryptograph utility library","directories":{},"sideEffects":false,"_nodeVersion":"22.12.0","dependencies":{"@alessiofrittoli/crypto-buffer":"^3.6.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","tsup":"^8.4.0","dotenv":"^16.5.0","eslint":"^9.26.0","globals":"^16.0.0","ts-jest":"^29.3.2","ts-node":"^10.9.2","@eslint/js":"^9.26.0","typescript":"^5.8.3","@types/jest":"^29.5.14","@types/node":"^22.15.3","http-server":"^14.1.1","concurrently":"^9.1.2","@jest/globals":"^29.7.0","typescript-eslint":"^8.31.1","@alessiofrittoli/node-scripts":"^2.5.0"},"_npmOperationalInternal":{"tmp":"tmp/crypto-cipher_2.2.0_1746286420221_0.39311436909079167","host":"s3://npm-registry-packages-npm-production"}},"3.0.0-alpha.1":{"name":"@alessiofrittoli/crypto-cipher","version":"3.0.0-alpha.1","keywords":["nodejs-crypto","cryptography","cipher","aes","hybrid-encryption","stream-encrypt","stream-decrypt"],"author":{"url":"https://alessiofrittoli.it","name":"Alessio Frittoli","email":"info@alessiofrittoli.it"},"license":"MIT","_id":"@alessiofrittoli/crypto-cipher@3.0.0-alpha.1","maintainers":[{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"}],"homepage":"https://github.com/alessiofrittoli/crypto-cipher#readme","bugs":{"url":"https://github.com/alessiofrittoli/crypto-cipher/issues","email":"info@alessiofrittoli.it"},"dist":{"shasum":"c2d9de46587b5b7d0232875eef9d890dc50b7019","tarball":"https://registry.npmjs.org/@alessiofrittoli/crypto-cipher/-/crypto-cipher-3.0.0-alpha.1.tgz","fileCount":11,"integrity":"sha512-D+iSV/6wBEWpBKzChyJrcOM+lW2lOAj64N9cCNDvOwPHQgFbiEzcbflEFR2ETSFLEdbzDiVkDtwG5CKFy1U/4w==","signatures":[{"sig":"MEYCIQDUACdKSvs0TgH2j7Q9aDYvcQnNC5epTiug08imLaIlgQIhAM5EridL2zMmH1ztvu5e0AlssVsxcp9ejSIrTRG+raIv","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":82821},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"./types":{"import":{"types":"./dist/types.d.mts"},"require":{"types":"./dist/types.d.ts"}}},"funding":[{"url":"https://github.com/sponsors/alessiofrittoli","type":"github"}],"gitHead":"cb84f254dc25bce276f40b7a5778f6c5d8dea16d","scripts":{"dev":"cross-env NODE_ENV=development tsup --watch","//1a":"*********************************************************************","//1b":"******************** DEV - BUILD - LINT - RELEASE *******************","//1c":"*********************************************************************","//2a":"*********************************************************************","//2b":"***************************** UNIT TESTS ****************************","//2c":"*********************************************************************","//3a":"*********************************************************************","//3b":"************************ UNIT TESTS COVERAGE ************************","//3c":"*********************************************************************","//4a":"*********************************************************************","//4b":"************************ TARGETED UNIT TESTS ************************","//4c":"*********************************************************************","lint":"eslint","test":"jest --verbose","build":"pnpm lint && pnpm test:ci && pnpm build:prod","release":"node scripts/release.js --verbose --npm","test:ci":"jest --ci --verbose","test:misc":"pnpm test:watch misc.test.ts","build:prod":"cross-env NODE_ENV=production tsup","test:watch":"jest --watchAll --verbose","test:coverage":"pnpm test:watch --coverage","test:coverage:ci":"pnpm test:ci --coverage","test:file-hybrid":"pnpm test:watch file-hybrid.test.ts","test:stream-hybrid":"pnpm test:watch stream-hybrid.test.ts","test:coverage:serve":"concurrently --prefix none --kill-others \"pnpm test:coverage\" \"pnpm test:serve-coverage\"","test:file-symmetric":"pnpm test:watch file-symmetric.test.ts","test:serve-coverage":"http-server ./coverage/lcov-report --gzip true -p 0 -o --silent","test:buffer-in-memory":"pnpm test:watch buffer-in-memory.test.ts","test:stream-symmetric":"pnpm test:watch stream-symmetric.test.ts"},"_npmUser":{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"},"repository":{"url":"git+https://github.com/alessiofrittoli/crypto-cipher.git","type":"git"},"_npmVersion":"11.5.2","description":"Node.js Cipher cryptograph utility library","directories":{},"sideEffects":false,"_nodeVersion":"22.15.0","dependencies":{"@alessiofrittoli/crypto-buffer":"^3.9.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jest":"^30.2.0","tsup":"^8.5.1","dotenv":"^17.2.3","eslint":"^9.39.2","globals":"^16.5.0","ts-jest":"^29.4.6","ts-node":"^10.9.2","cross-env":"^10.1.0","@eslint/js":"^9.39.2","typescript":"^5.9.3","@types/jest":"^30.0.0","@types/node":"^25.0.2","http-server":"^14.1.1","concurrently":"^9.2.1","@jest/globals":"^30.2.0","typescript-eslint":"^8.49.0","@alessiofrittoli/node-scripts":"^3.3.0"},"_npmOperationalInternal":{"tmp":"tmp/crypto-cipher_3.0.0-alpha.1_1765742298402_0.823672401695924","host":"s3://npm-registry-packages-npm-production"}},"3.0.0-alpha.2":{"name":"@alessiofrittoli/crypto-cipher","version":"3.0.0-alpha.2","keywords":["nodejs-crypto","cryptography","cipher","aes","hybrid-encryption","stream-encrypt","stream-decrypt"],"author":{"url":"https://alessiofrittoli.it","name":"Alessio Frittoli","email":"info@alessiofrittoli.it"},"license":"MIT","_id":"@alessiofrittoli/crypto-cipher@3.0.0-alpha.2","maintainers":[{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"}],"homepage":"https://github.com/alessiofrittoli/crypto-cipher#readme","bugs":{"url":"https://github.com/alessiofrittoli/crypto-cipher/issues","email":"info@alessiofrittoli.it"},"dist":{"shasum":"6e6ff31f6d38f2ca17307a22631f379561718a56","tarball":"https://registry.npmjs.org/@alessiofrittoli/crypto-cipher/-/crypto-cipher-3.0.0-alpha.2.tgz","fileCount":13,"integrity":"sha512-xHXeXH8nq/i0wCnIhCJTc0+L/NF7tXll9GJ526v0SrGKkLM/ZRZ3YuzX2RtqVfM6AHgzLZg0kA1i4hNDdfaRbw==","signatures":[{"sig":"MEQCICXlJCC+SSU7sbfd82KNms9JjuQH3FiG4oAJuqUkLbjAAiA3xucR6W0RrSnBHsBZKZgxMQK9KlUEVflq9U2B/X7NOw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":82031},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"./types":{"import":{"types":"./dist/types.d.mts"},"require":{"types":"./dist/types.d.ts"}}},"funding":[{"url":"https://github.com/sponsors/alessiofrittoli","type":"github"}],"gitHead":"f2d17d6abe5efa454c30dd190099d34f1755e5a0","scripts":{"dev":"cross-env NODE_ENV=development tsup --watch","//1a":"*********************************************************************","//1b":"******************** DEV - BUILD - LINT - RELEASE *******************","//1c":"*********************************************************************","//2a":"*********************************************************************","//2b":"***************************** UNIT TESTS ****************************","//2c":"*********************************************************************","//3a":"*********************************************************************","//3b":"************************ UNIT TESTS COVERAGE ************************","//3c":"*********************************************************************","//4a":"*********************************************************************","//4b":"************************ TARGETED UNIT TESTS ************************","//4c":"*********************************************************************","lint":"eslint","test":"jest --verbose","build":"pnpm lint && pnpm test:ci && pnpm build:prod","release":"node scripts/release.js --verbose --npm","test:ci":"jest --ci --verbose","test:misc":"pnpm test:watch misc.test.ts","build:prod":"cross-env NODE_ENV=production tsup","test:watch":"jest --watchAll --verbose","test:coverage":"pnpm test:watch --coverage","test:coverage:ci":"pnpm test:ci --coverage","test:file-hybrid":"pnpm test:watch file-hybrid.test.ts","test:stream-hybrid":"pnpm test:watch stream-hybrid.test.ts","test:coverage:serve":"concurrently --prefix none --kill-others \"pnpm test:coverage\" \"pnpm test:serve-coverage\"","test:file-symmetric":"pnpm test:watch file-symmetric.test.ts","test:serve-coverage":"http-server ./coverage/lcov-report --gzip true -p 0 -o --silent","test:buffer-in-memory":"pnpm test:watch buffer-in-memory.test.ts","test:stream-symmetric":"pnpm test:watch stream-symmetric.test.ts"},"_npmUser":{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"},"repository":{"url":"git+https://github.com/alessiofrittoli/crypto-cipher.git","type":"git"},"_npmVersion":"11.7.0","description":"Node.js Cipher cryptograph utility library","directories":{},"sideEffects":false,"_nodeVersion":"22.15.0","dependencies":{"@alessiofrittoli/math-utils":"^1.17.0","@alessiofrittoli/crypto-buffer":"^3.10.0","@alessiofrittoli/stream-reader":"2.7.0-alpha.1"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jest":"^30.2.0","tsup":"^8.5.1","dotenv":"^17.2.3","eslint":"^9.39.2","globals":"^16.5.0","ts-jest":"^29.4.6","ts-node":"^10.9.2","cross-env":"^10.1.0","@eslint/js":"^9.39.2","typescript":"^5.9.3","@types/jest":"^30.0.0","@types/node":"^25.0.3","http-server":"^14.1.1","concurrently":"^9.2.1","@jest/globals":"^30.2.0","typescript-eslint":"^8.50.1","@alessiofrittoli/node-scripts":"^3.3.0"},"_npmOperationalInternal":{"tmp":"tmp/crypto-cipher_3.0.0-alpha.2_1766947517859_0.3154276787195893","host":"s3://npm-registry-packages-npm-production"}},"3.0.0-alpha.3":{"name":"@alessiofrittoli/crypto-cipher","version":"3.0.0-alpha.3","keywords":["nodejs-crypto","cryptography","cipher","aes","hybrid-encryption","stream-encrypt","stream-decrypt"],"author":{"url":"https://alessiofrittoli.it","name":"Alessio Frittoli","email":"info@alessiofrittoli.it"},"license":"MIT","_id":"@alessiofrittoli/crypto-cipher@3.0.0-alpha.3","maintainers":[{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"}],"homepage":"https://github.com/alessiofrittoli/crypto-cipher#readme","bugs":{"url":"https://github.com/alessiofrittoli/crypto-cipher/issues","email":"info@alessiofrittoli.it"},"dist":{"shasum":"ee2f36df61b10a0a84036d1777786a493c65a343","tarball":"https://registry.npmjs.org/@alessiofrittoli/crypto-cipher/-/crypto-cipher-3.0.0-alpha.3.tgz","fileCount":13,"integrity":"sha512-QRzG8H2fXkbHyy3Mg+TSoMdGwnLvtOhwhsJvamR8SsNHSMIWVc1nhyeZjV1ovJHCIMeutQIOX2Xwb6m63z6G4A==","signatures":[{"sig":"MEUCIQCidIq7lA9oRZcYk8jSvp/slucnLMyCAm1Yrb8+EUQ3kAIgCz+CqgCQhO6x31NDAHDpHUrrEWzYGEOFE92WwHlMQCU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":82031},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"./types":{"import":{"types":"./dist/types.d.mts"},"require":{"types":"./dist/types.d.ts"}}},"funding":[{"url":"https://github.com/sponsors/alessiofrittoli","type":"github"}],"gitHead":"3673caed5a7e866425346ee0774c1e4af75e52c2","scripts":{"dev":"cross-env NODE_ENV=development tsup --watch","//1a":"*********************************************************************","//1b":"******************** DEV - BUILD - LINT - RELEASE *******************","//1c":"*********************************************************************","//2a":"*********************************************************************","//2b":"***************************** UNIT TESTS ****************************","//2c":"*********************************************************************","//3a":"*********************************************************************","//3b":"************************ UNIT TESTS COVERAGE ************************","//3c":"*********************************************************************","//4a":"*********************************************************************","//4b":"************************ TARGETED UNIT TESTS ************************","//4c":"*********************************************************************","lint":"eslint","test":"jest --verbose","build":"pnpm lint && pnpm test:ci && pnpm build:prod","release":"node scripts/release.js --verbose --npm","test:ci":"jest --ci --verbose","test:misc":"pnpm test:watch misc.test.ts","build:prod":"cross-env NODE_ENV=production tsup","test:watch":"jest --watchAll --verbose","test:coverage":"pnpm test:watch --coverage","test:coverage:ci":"pnpm test:ci --coverage","test:file-hybrid":"pnpm test:watch file-hybrid.test.ts","test:stream-hybrid":"pnpm test:watch stream-hybrid.test.ts","test:coverage:serve":"concurrently --prefix none --kill-others \"pnpm test:coverage\" \"pnpm test:serve-coverage\"","test:file-symmetric":"pnpm test:watch file-symmetric.test.ts","test:serve-coverage":"http-server ./coverage/lcov-report --gzip true -p 0 -o --silent","test:buffer-in-memory":"pnpm test:watch buffer-in-memory.test.ts","test:stream-symmetric":"pnpm test:watch stream-symmetric.test.ts"},"_npmUser":{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"},"repository":{"url":"git+https://github.com/alessiofrittoli/crypto-cipher.git","type":"git"},"_npmVersion":"11.7.0","description":"Node.js Cipher cryptograph utility library","directories":{},"sideEffects":false,"_nodeVersion":"22.15.0","dependencies":{"@alessiofrittoli/math-utils":"^1.17.0","@alessiofrittoli/crypto-buffer":"^3.10.0","@alessiofrittoli/stream-reader":"2.7.0-alpha.2"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jest":"^30.2.0","tsup":"^8.5.1","dotenv":"^17.2.3","eslint":"^9.39.2","globals":"^16.5.0","ts-jest":"^29.4.6","ts-node":"^10.9.2","cross-env":"^10.1.0","@eslint/js":"^9.39.2","typescript":"^5.9.3","@types/jest":"^30.0.0","@types/node":"^25.0.3","http-server":"^14.1.1","concurrently":"^9.2.1","@jest/globals":"^30.2.0","typescript-eslint":"^8.50.1","@alessiofrittoli/node-scripts":"^3.3.0"},"_npmOperationalInternal":{"tmp":"tmp/crypto-cipher_3.0.0-alpha.3_1767006137806_0.11248059674494315","host":"s3://npm-registry-packages-npm-production"}},"3.0.0-alpha.4":{"name":"@alessiofrittoli/crypto-cipher","version":"3.0.0-alpha.4","keywords":["nodejs-crypto","cryptography","cipher","aes","hybrid-encryption","stream-encrypt","stream-decrypt"],"author":{"url":"https://alessiofrittoli.it","name":"Alessio Frittoli","email":"info@alessiofrittoli.it"},"license":"MIT","_id":"@alessiofrittoli/crypto-cipher@3.0.0-alpha.4","maintainers":[{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"}],"homepage":"https://github.com/alessiofrittoli/crypto-cipher#readme","bugs":{"url":"https://github.com/alessiofrittoli/crypto-cipher/issues","email":"info@alessiofrittoli.it"},"dist":{"shasum":"6edf41f7355db08f0ab28af4caced84564e4bbcb","tarball":"https://registry.npmjs.org/@alessiofrittoli/crypto-cipher/-/crypto-cipher-3.0.0-alpha.4.tgz","fileCount":13,"integrity":"sha512-e0OkwfrNG1/oPBkASjipYdjgENQpu9pgVmZjqckumYwpLx5q9iUS1JoHxPCb+ywAd6hLwuEG2LNU31BtWfEzxQ==","signatures":[{"sig":"MEQCIHUX2Yuyakzp7+P89L4POQzRQtb8wKUDJ3kayzbvWs8pAiAYpb/r6iaXUssvsk66zF4uFNXlWTRNthkeU4FJS9z1mA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":88467},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"./types":{"import":{"types":"./dist/types.d.mts"},"require":{"types":"./dist/types.d.ts"}}},"funding":[{"url":"https://github.com/sponsors/alessiofrittoli","type":"github"}],"gitHead":"442ba16e64a6338f764dd864b92ad01e852520c5","scripts":{"dev":"cross-env NODE_ENV=development tsup --watch","//1a":"*********************************************************************","//1b":"******************** DEV - BUILD - LINT - RELEASE *******************","//1c":"*********************************************************************","//2a":"*********************************************************************","//2b":"***************************** UNIT TESTS ****************************","//2c":"*********************************************************************","//3a":"*********************************************************************","//3b":"************************ UNIT TESTS COVERAGE ************************","//3c":"*********************************************************************","//4a":"*********************************************************************","//4b":"************************ TARGETED UNIT TESTS ************************","//4c":"*********************************************************************","lint":"eslint","test":"jest --verbose","build":"pnpm lint && pnpm test:ci && pnpm build:prod","release":"node scripts/release.js --verbose --npm","test:ci":"jest --ci --verbose","test:misc":"pnpm test:watch misc.test.ts","build:prod":"cross-env NODE_ENV=production tsup","test:watch":"jest --watchAll --verbose","test:coverage":"pnpm test:watch --coverage","test:coverage:ci":"pnpm test:ci --coverage","test:file-hybrid":"pnpm test:watch file-hybrid.test.ts","test:stream-hybrid":"pnpm test:watch stream-hybrid.test.ts","test:coverage:serve":"concurrently --prefix none --kill-others \"pnpm test:coverage\" \"pnpm test:serve-coverage\"","test:file-symmetric":"pnpm test:watch file-symmetric.test.ts","test:serve-coverage":"http-server ./coverage/lcov-report --gzip true -p 0 -o --silent","test:buffer-in-memory":"pnpm test:watch buffer-in-memory.test.ts","test:stream-symmetric":"pnpm test:watch stream-symmetric.test.ts"},"_npmUser":{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"},"repository":{"url":"git+https://github.com/alessiofrittoli/crypto-cipher.git","type":"git"},"_npmVersion":"11.7.0","description":"Node.js Cipher cryptograph utility library","directories":{},"sideEffects":false,"_nodeVersion":"22.15.0","dependencies":{"@alessiofrittoli/math-utils":"^1.17.0","@alessiofrittoli/crypto-buffer":"^3.10.0","@alessiofrittoli/stream-reader":"2.7.0-alpha.3"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jest":"^30.2.0","tsup":"^8.5.1","dotenv":"^17.2.3","eslint":"^9.39.2","globals":"^16.5.0","ts-jest":"^29.4.6","ts-node":"^10.9.2","cross-env":"^10.1.0","@eslint/js":"^9.39.2","typescript":"^5.9.3","@types/jest":"^30.0.0","@types/node":"^25.0.3","http-server":"^14.1.1","concurrently":"^9.2.1","@jest/globals":"^30.2.0","typescript-eslint":"^8.50.1","@alessiofrittoli/node-scripts":"^3.3.0"},"_npmOperationalInternal":{"tmp":"tmp/crypto-cipher_3.0.0-alpha.4_1767023632652_0.7566504406248367","host":"s3://npm-registry-packages-npm-production"}},"3.0.0":{"name":"@alessiofrittoli/crypto-cipher","version":"3.0.0","keywords":["nodejs-crypto","cryptography","cipher","aes","aead","hybrid-encryption","stream-encrypt","stream-decrypt","ccm","gcm","ocb","cbc"],"author":{"url":"https://alessiofrittoli.it","name":"Alessio Frittoli","email":"info@alessiofrittoli.it"},"license":"MIT","_id":"@alessiofrittoli/crypto-cipher@3.0.0","maintainers":[{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"}],"homepage":"https://github.com/alessiofrittoli/crypto-cipher#readme","bugs":{"url":"https://github.com/alessiofrittoli/crypto-cipher/issues","email":"info@alessiofrittoli.it"},"dist":{"shasum":"fbaa30462a5f98ced781137ae963843e8d7fc982","tarball":"https://registry.npmjs.org/@alessiofrittoli/crypto-cipher/-/crypto-cipher-3.0.0.tgz","fileCount":13,"integrity":"sha512-OZojCULj5zTlUVIfFCWI0nQWxs3gCwqz8EpxdMH0Mfhs90kzWgy6PzCIflODDiM2jRvg8pK1bOZ6kJdlhq+zBw==","signatures":[{"sig":"MEUCIQDeWnMW14nvn9UWR/h43YOivgDH9COozarqZv5FuXzZFgIgeJpRtNTGigBHkkS5HNv9UHKxJ0bFhyWz/aQc4xGD1pc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":88497},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"./types":{"import":{"types":"./dist/types.d.mts"},"require":{"types":"./dist/types.d.ts"}}},"funding":[{"url":"https://github.com/sponsors/alessiofrittoli","type":"github"}],"gitHead":"1e3384c782c431deba403ae4f1451eb424667cc7","scripts":{"dev":"cross-env NODE_ENV=development tsup --watch","//1a":"*********************************************************************","//1b":"******************** DEV - BUILD - LINT - RELEASE *******************","//1c":"*********************************************************************","//2a":"*********************************************************************","//2b":"***************************** UNIT TESTS ****************************","//2c":"*********************************************************************","//3a":"*********************************************************************","//3b":"************************ UNIT TESTS COVERAGE ************************","//3c":"*********************************************************************","//4a":"*********************************************************************","//4b":"************************ TARGETED UNIT TESTS ************************","//4c":"*********************************************************************","lint":"eslint","test":"jest --verbose","build":"pnpm lint && pnpm test:ci && pnpm build:prod","release":"node scripts/release.js --verbose --npm","test:ci":"jest --ci --verbose","test:misc":"pnpm test:watch misc.test.ts","build:prod":"cross-env NODE_ENV=production tsup","test:watch":"jest --watchAll --verbose","test:coverage":"pnpm test:watch --coverage","test:coverage:ci":"pnpm test:ci --coverage","test:file-hybrid":"pnpm test:watch file-hybrid.test.ts","test:stream-hybrid":"pnpm test:watch stream-hybrid.test.ts","test:coverage:serve":"concurrently --prefix none --kill-others \"pnpm test:coverage\" \"pnpm test:serve-coverage\"","test:file-symmetric":"pnpm test:watch file-symmetric.test.ts","test:serve-coverage":"http-server ./coverage/lcov-report --gzip true -p 0 -o --silent","test:buffer-in-memory":"pnpm test:watch buffer-in-memory.test.ts","test:stream-symmetric":"pnpm test:watch stream-symmetric.test.ts"},"_npmUser":{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"},"repository":{"url":"git+https://github.com/alessiofrittoli/crypto-cipher.git","type":"git"},"_npmVersion":"11.7.0","description":"Node.js Cipher cryptograph utility library","directories":{},"sideEffects":false,"_nodeVersion":"22.15.0","dependencies":{"@alessiofrittoli/math-utils":"^1.17.0","@alessiofrittoli/crypto-buffer":"^3.10.0","@alessiofrittoli/stream-reader":"3.0.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","tsup":"^8.5.1","dotenv":"^17.2.3","eslint":"^9.39.2","globals":"^16.5.0","ts-jest":"^29.4.6","ts-node":"^10.9.2","cross-env":"^10.1.0","@eslint/js":"^9.39.2","typescript":"^5.9.3","@types/jest":"^30.0.0","@types/node":"^25.0.3","http-server":"^14.1.1","concurrently":"^9.2.1","@jest/globals":"^30.2.0","typescript-eslint":"^8.50.1","@alessiofrittoli/node-scripts":"^3.3.0"},"_npmOperationalInternal":{"tmp":"tmp/crypto-cipher_3.0.0_1767025759918_0.17572874153698526","host":"s3://npm-registry-packages-npm-production"}},"3.1.0":{"name":"@alessiofrittoli/crypto-cipher","version":"3.1.0","description":"Node.js Cipher cryptograph utility library","author":{"name":"Alessio Frittoli","email":"info@alessiofrittoli.it","url":"https://alessiofrittoli.it"},"license":"MIT","funding":[{"type":"github","url":"https://github.com/sponsors/alessiofrittoli"}],"keywords":["nodejs-crypto","cryptography","cipher","aes","aead","hybrid-encryption","stream-encrypt","stream-decrypt","ccm","gcm","ocb","cbc"],"homepage":"https://github.com/alessiofrittoli/crypto-cipher#readme","bugs":{"url":"https://github.com/alessiofrittoli/crypto-cipher/issues","email":"info@alessiofrittoli.it"},"repository":{"type":"git","url":"git+https://github.com/alessiofrittoli/crypto-cipher.git"},"main":"./dist/index.js","module":"./dist/index.mjs","types":"./dist/index.d.ts","exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"./types":{"import":{"types":"./dist/types.d.mts"},"require":{"types":"./dist/types.d.ts"}}},"sideEffects":false,"scripts":{"//1a":"*********************************************************************","//1b":"******************** DEV - BUILD - LINT - RELEASE *******************","//1c":"*********************************************************************","dev":"cross-env NODE_ENV=development tsup --watch","build:prod":"cross-env NODE_ENV=production tsup","build":"pnpm lint && pnpm test:ci && pnpm build:prod","lint":"eslint","release":"node scripts/release.js --verbose --npm","//2a":"*********************************************************************","//2b":"***************************** UNIT TESTS ****************************","//2c":"*********************************************************************","test":"jest --verbose","test:watch":"jest --watchAll --verbose","test:ci":"jest --ci --verbose","//3a":"*********************************************************************","//3b":"************************ UNIT TESTS COVERAGE ************************","//3c":"*********************************************************************","test:coverage":"pnpm test:watch --coverage","test:coverage:ci":"pnpm test:ci --coverage","test:serve-coverage":"http-server ./coverage/lcov-report --gzip true -p 0 -o --silent","test:coverage:serve":"concurrently --prefix none --kill-others \"pnpm test:coverage\" \"pnpm test:serve-coverage\"","//4a":"*********************************************************************","//4b":"************************ TARGETED UNIT TESTS ************************","//4c":"*********************************************************************","test:buffer-in-memory":"pnpm test:watch buffer-in-memory.test.ts","test:file-symmetric":"pnpm test:watch file-symmetric.test.ts","test:file-hybrid":"pnpm test:watch file-hybrid.test.ts","test:stream-symmetric":"pnpm test:watch stream-symmetric.test.ts","test:stream-hybrid":"pnpm test:watch stream-hybrid.test.ts","test:misc":"pnpm test:watch misc.test.ts"},"devDependencies":{"@alessiofrittoli/node-scripts":"^3.3.0","@eslint/js":"^10.0.1","@jest/globals":"^30.3.0","@types/jest":"^30.0.0","@types/node":"^25.5.0","concurrently":"^9.2.1","cross-env":"^10.1.0","dotenv":"^17.3.1","eslint":"^10.0.3","globals":"^17.4.0","http-server":"^14.1.1","jest":"^30.3.0","ts-jest":"^29.4.6","ts-node":"^10.9.2","tsup":"^8.5.1","typescript":"^5.9.3","typescript-eslint":"^8.57.0"},"dependencies":{"@alessiofrittoli/crypto-buffer":"^3.11.0","@alessiofrittoli/math-utils":"^2.0.0","@alessiofrittoli/stream-reader":"3.0.0"},"_id":"@alessiofrittoli/crypto-cipher@3.1.0","gitHead":"c83e25ae4ad2c80a67dff406a8b04aa548e2fce4","_nodeVersion":"22.22.0","_npmVersion":"10.9.4","dist":{"integrity":"sha512-WuU/Fk/PVDigzU6yWVYOWxYO8UyzghxkIFMP13vYi1P515hGRzMOX9DZTVyCnYJN0yhnLMbHdkYSw1zQcd5rLw==","shasum":"5d2dfcd36d5a1dfe59f147f1d541a3a3874faf1a","tarball":"https://registry.npmjs.org/@alessiofrittoli/crypto-cipher/-/crypto-cipher-3.1.0.tgz","fileCount":11,"unpackedSize":88221,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCJ7OVZiCuhVaHr+G9BfgXZe3z99A9rlokB1fr3UjirTgIhALg5M7qma5bbWWNp6M4jhBHoz4bEIbUt8u6J95IwRqo6"}]},"_npmUser":{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"},"directories":{},"maintainers":[{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/crypto-cipher_3.1.0_1773497761640_0.5328810572422611"},"_hasShrinkwrap":false}},"time":{"created":"2025-01-16T19:28:49.087Z","modified":"2026-03-14T14:16:01.907Z","1.0.0":"2025-01-16T19:28:49.399Z","1.1.0":"2025-01-16T19:51:31.357Z","2.0.0":"2025-01-22T18:53:20.968Z","2.1.0":"2025-03-22T15:53:25.062Z","2.2.0":"2025-05-03T15:33:40.424Z","3.0.0-alpha.1":"2025-12-14T19:58:18.552Z","3.0.0-alpha.2":"2025-12-28T18:45:18.009Z","3.0.0-alpha.3":"2025-12-29T11:02:17.935Z","3.0.0-alpha.4":"2025-12-29T15:53:52.788Z","3.0.0":"2025-12-29T16:29:20.082Z","3.1.0":"2026-03-14T14:16:01.801Z"},"bugs":{"url":"https://github.com/alessiofrittoli/crypto-cipher/issues","email":"info@alessiofrittoli.it"},"author":{"name":"Alessio Frittoli","email":"info@alessiofrittoli.it","url":"https://alessiofrittoli.it"},"license":"MIT","homepage":"https://github.com/alessiofrittoli/crypto-cipher#readme","keywords":["nodejs-crypto","cryptography","cipher","aes","aead","hybrid-encryption","stream-encrypt","stream-decrypt","ccm","gcm","ocb","cbc"],"repository":{"type":"git","url":"git+https://github.com/alessiofrittoli/crypto-cipher.git"},"description":"Node.js Cipher cryptograph utility library","maintainers":[{"name":"alessiofrittoli","email":"info@alessiofrittoli.it"}],"readme":"# Crypto Cipher 🔐\n\n[![NPM Latest Version][version-badge]][npm-url] [![Coverage Status][coverage-badge]][coverage-url] [![Socket Status][socket-badge]][socket-url] [![NPM Monthly Downloads][downloads-badge]][npm-url] [![Dependencies][deps-badge]][deps-url]\n\n[![GitHub Sponsor][sponsor-badge]][sponsor-url]\n\n[version-badge]: https://img.shields.io/npm/v/%40alessiofrittoli%2Fcrypto-cipher\n[npm-url]: https://npmjs.org/package/%40alessiofrittoli%2Fcrypto-cipher\n[coverage-badge]: https://coveralls.io/repos/github/alessiofrittoli/crypto-cipher/badge.svg\n[coverage-url]: https://coveralls.io/github/alessiofrittoli/crypto-cipher\n[socket-badge]: https://socket.dev/api/badge/npm/package/@alessiofrittoli/crypto-cipher\n[socket-url]: https://socket.dev/npm/package/@alessiofrittoli/crypto-cipher/overview\n[downloads-badge]: https://img.shields.io/npm/dm/%40alessiofrittoli%2Fcrypto-cipher.svg\n[deps-badge]: https://img.shields.io/librariesio/release/npm/%40alessiofrittoli%2Fcrypto-cipher\n[deps-url]: https://libraries.io/npm/%40alessiofrittoli%2Fcrypto-cipher\n[sponsor-badge]: https://img.shields.io/static/v1?label=Fund%20this%20package&message=%E2%9D%A4&logo=GitHub&color=%23DB61A2\n[sponsor-url]: https://github.com/sponsors/alessiofrittoli\n\n## Node.js Cipher cryptograph utility library\n\n### Table of Contents\n\n- [Getting started](#getting-started)\n- [Key features](#key-features)\n- [What's changed](#whats-changed)\n- [Migration guide](#migration-guide)\n- [API Reference](#api-reference)\n  - [Constants](#constants)\n  - [Methods](#methods)\n    - [`Cipher.Encrypt()`](#cipherencrypt)\n    - [`Cipher.Decrypt()`](#cipherdecrypt)\n    - [`Cipher.HybridEncrypt()`](#cipherhybridencrypt)\n    - [`Cipher.HybridDecrypt()`](#cipherhybriddecrypt)\n    - [`Cipher.stream.Encrypt()`](#cipherstreamencrypt)\n    - [`Cipher.stream.Decrypt()`](#cipherstreamdecrypt)\n    - [`Cipher.stream.HybridEncrypt()`](#cipherstreamhybridencrypt)\n    - [`Cipher.stream.HybridDecrypt()`](#cipherstreamhybriddecrypt)\n  - [Types](#types)\n- [Examples](#examples)\n  - [In-memory data buffer encryption/decryption](#in-memory-data-buffer-encryptiondecryption)\n  - [In-memory data buffer hybrid encryption/decryption](#in-memory-data-buffer-hybrid-encryptiondecryption)\n  - [In-memory data stream encryption/decryption](#in-memory-data-stream-encryptiondecryption)\n  - [In-memory data stream with hybrid encryption/decryption](#in-memory-data-stream-with-hybrid-encryptiondecryption)\n  - [File based data stream encryption/decryption](#file-based-data-stream-encryptiondecryption)\n  - [File based data stream with hybrid encryption/decryption](#file-based-data-stream-with-hybrid-encryptiondecryption)\n- [Development](#development)\n  - [ESLint](#eslint)\n  - [Jest](#jest)\n- [Contributing](#contributing)\n- [Security](#security)\n- [Credits](#made-with-)\n\n---\n\n### Getting started\n\nThe `crypto-cipher` library provides AES encryption and decryption functionality, supporting both in-memory buffers and streams. It adheres to the [NIST SP 800-38D](https://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-38d.pdf) standard recommendations.\n\n⚠️ Note that every performed operation cannot be accomplished client-side and must be executed on a back-end server.\n\nIt is part of the [`crypto`](https://npmjs.com/search?q=%40alessiofrittoli%2Fcrypto) utility libraries and can be installed by running the following command:\n\n```bash\nnpm i @alessiofrittoli/crypto-cipher\n```\n\nor using `pnpm`\n\n```bash\npnpm i @alessiofrittoli/crypto-cipher\n```\n\n---\n\n### Key features\n\n- Supports multiple AES algorithms (`CCM`, `GCM`, `OCB`, `CBC`) and even `chacha20-poly1305`.\n- In-memory buffer encryption and decrpytion.\n- Robust support for encrypting and decrypting streams (in-memory and file based).\n- Hybrid encryption methods for combining symmetric and asymmetric cryptography.\n\n#### Security Considerations\n\n- Random `salt` and `IV` generation.\n- AEAD - Authenticated encryption modes with proper `authTag` and `Additional Authenticated Data` handling.\n\n#### Readable and Modular\n\n- Separation of concerns with clear method responsibilities.\n- Comprehensive JSDoc comments enhance maintainability and readability.\n\n---\n\n### What's Changed\n\n🎉 Core updates in the latest release:\n\n- `Cipher` methods have been refactored to provide a solid and easy usage\n- [`Cipher.HybridEncrypt()`](#cipherhybridencrypt) and [`Cipher.HybridDecrypt()`](#cipherhybriddecrypt) have been added. These methods will allow you to encrypt/decrypt in-memory buffer data using hybrid encryption algorithms.\n- `Cipher.stream` subgroup has been added to keep method names consistent across the library.\n- hybrid encryption doesn't require a password anymore which was redundant. an RSA key pair is all what you need.\n- providing RSA key length during hybrid decryption is no longer needed.\n\n---\n\n### Migration guide\n\n#### Migrating from v2.x.x to v3.0.0\n\n**`Cipher.encrypt()`**\n\nIs now renamed to **`Cipher.Encrypt()`**. It's API implementation remain the same.\n\n---\n\n**`Cipher.decrypt()`**\n\nIs now renamed to **`Cipher.Decrypt()`**. It's API implementation remain the same.\n\n---\n\n**`Cipher.streamEncrypt()`**\n\n**Before**\n\n```ts\nawait Cipher.streamEncrypt(password, { input, output }).encrypt();\n```\n\n**Now**\n\n```ts\nawait Cipher.stream.Encrypt(password, { input, output });\n```\n\n---\n\n**`Cipher.streamDecrypt()`**\n\n**Before**\n\n```ts\nconst { decrypt } = await Cipher.streamDecrypt(password, { input, output });\n\nawait decrypt();\n```\n\n**Now**\n\n```ts\nawait Cipher.stream.Decrypt(password, { input, output });\n```\n\n---\n\n**`Cipher.hybridEncrypt()`**\n\n**Before**\n\n```ts\nconst { encrypt } = Cipher.hybridEncrypt(\n  password,\n  {\n    key: keyPair.publicKey,\n    padding: crypto.constants.RSA_PKCS1_OAEP_PADDING,\n    oaepHash: \"SHA-256\",\n  },\n  { input, output }\n);\nawait encrypt();\n```\n\n**Now**\n\n```ts\nawait Cipher.stream.HybridEncrypt(keyPair.publicKey, { input, output });\n```\n\n---\n\n**`Cipher.hybridDecrypt()`**\n\n**Before**\n\n```ts\nconst { decrypt } = await Cipher.hybridDecrypt(\n  {\n    key: keyPair.privateKey,\n    passphrase: passphrase,\n    padding: crypto.constants.RSA_PKCS1_OAEP_PADDING,\n    oaepHash: \"SHA-256\",\n  },\n  { input, output, rsaKeyLength }\n);\n\nawait decrypt();\n```\n\n**Now**\n\n```ts\nawait Cipher.stream.HybridDecrypt(\n  { key: keyPair.privateKey, passphrase },\n  { input, output }\n);\n```\n\n**Or even**\n\n```ts\nawait Cipher.stream.HybridDecrypt(keyPair.privateKey, { input, output });\n```\n\n---\n\n### API Reference\n\n#### Constants\n\n##### `Cipher.SALT_LENGTH`\n\nDefines the minimum, maximum, and default lengths for salt.\n\n<details>\n<summary>Properties</summary>\n\n| Property  | Value |\n| --------- | ----- |\n| `min`     | 16    |\n| `max`     | 64    |\n| `default` | 32    |\n\n</details>\n\n---\n\n##### `Cipher.IV_LENGTH`\n\nDefines the minimum, maximum, and default lengths for initialization vectors (IV).\n\n<details>\n<summary>Properties</summary>\n\n| Property  | Value |\n| --------- | ----- |\n| `min`     | 8     |\n| `max`     | 32    |\n| `default` | 16    |\n\n</details>\n\n---\n\n##### `Cipher.AUTH_TAG_LENGTH`\n\nDefines the minimum, maximum, and default lengths for authentication tags.\n\n<details>\n<summary>Properties</summary>\n\n| Property  | Value |\n| --------- | ----- |\n| `min`     | 4     |\n| `max`     | 16    |\n| `default` | 16    |\n\n</details>\n\n---\n\n##### `Cipher.AAD_LENGTH`\n\nDefines the minimum, maximum, and default lengths for additional authenticated data (AAD).\n\n<details>\n<summary>Properties</summary>\n\n| Property  | Value |\n| --------- | ----- |\n| `min`     | 16    |\n| `max`     | 4096  |\n| `default` | 32    |\n\n</details>\n\n---\n\n##### `Cipher.DEFAULT_ALGORITHM`\n\nSpecifies default AES algorithms for buffer and stream operations.\n\n<details>\n<summary>Properties</summary>\n\n| Operation | Algorithm     | Description                                                                           |\n| --------- | ------------- | ------------------------------------------------------------------------------------- |\n| `buffer`  | `aes-256-gcm` | Default algorithm used for buffer data encryption/decryption                          |\n| `stream`  | `aes-256-cbc` | Default algorithm used for stream encryption/decryption (Cipher Block Chaining mode). |\n\n</details>\n\n---\n\n##### `Cipher.ALGORITHM`\n\nAn object defining algorithm names.\n\n<details>\n<summary>Properties</summary>\n\n| Property         | Value               |\n| ---------------- | ------------------- |\n| `AES_128_CBC`    | 'aes-128-cbc'       |\n| `AES_192_CBC`    | 'aes-192-cbc'       |\n| `AES_256_CBC`    | 'aes-256-cbc'       |\n| `AES_128_CCM`    | 'aes-128-ccm'       |\n| `AES_192_CCM`    | 'aes-192-ccm'       |\n| `AES_256_CCM`    | 'aes-256-ccm'       |\n| `AES_128_GCM`    | 'aes-128-gcm'       |\n| `AES_192_GCM`    | 'aes-192-gcm'       |\n| `AES_256_GCM`    | 'aes-256-gcm'       |\n| `AES_128_OCB`    | 'aes-128-ocb'       |\n| `AES_192_OCB`    | 'aes-192-ocb'       |\n| `AES_256_OCB`    | 'aes-256-ocb'       |\n| `CHACHA_20_POLY` | 'chacha20-poly1305' |\n\n</details>\n\n---\n\n##### `Cipher.ALGORITHMS`\n\nAn array of supported AES algorithms. This array includes all values in [`Cipher.ALGORITHM`](#cipheralgorithm) constant.\n\n---\n\n#### Methods\n\n##### `Cipher.Encrypt()`\n\nEncrypts an in-memory data buffer.\n\n> [!WARNING]\n> This is not suitable for large data encryption. Use [`Cipher.stream.Encrypt()`](#cipherstreamencrypt) or [`Cipher.stream.HybridEncrypt()`](#cipherstreamhybridencrypt) methods for large data encryption.\n\n<details>\n\n<summary>Parameters</summary>\n\n| Name      | Type                      | Description                               |\n| --------- | ------------------------- | ----------------------------------------- |\n| `data`    | `CoerceToUint8ArrayInput` | Data to encrypt.                          |\n| `secret`  | `CoerceToUint8ArrayInput` | Secret key for encryption.                |\n| `options` | `Cph.Options`             | (Optional) Additional encryption options. |\n\n</details>\n\n---\n\n<details>\n\n<summary>Returns</summary>\n\nType: `Buffer`\n\nThe encrypted result buffer.\n\n</details>\n\n---\n\n- See [`CoerceToUint8ArrayInput`](#coercetouint8arrayinput) for more informations about supported input data types.\n- See [`Cph.Options`](#cphoptionst) for more informations about additional encryption options.\n- See [In-memory data buffer encryption/decryption](#in-memory-data-buffer-encryptiondecryption) examples.\n\n---\n\n##### `Cipher.Decrypt()`\n\nDecrypts an in-memory data buffer.\n\n> [!WARNING]\n> This is not suitable for large data decryption. Use [`Cipher.stream.Decrypt()`](#cipherstreamdecrypt) or [`Cipher.stream.HybridDecrypt()`](#cipherstreamhybriddecrypt) methods for large data decryption.\n\n<details>\n\n<summary>Parameters</summary>\n\n| Name      | Type                      | Description                                            |\n| --------- | ------------------------- | ------------------------------------------------------ |\n| `data`    | `CoerceToUint8ArrayInput` | Data to decrypt.                                       |\n| `secret`  | `CoerceToUint8ArrayInput` | Secret key for decryption.                             |\n| `options` | `Cph.Options`             | (Optional) Decryption options (must match encryption). |\n\n</details>\n\n---\n\n<details>\n\n<summary>Returns</summary>\n\nType: `Buffer`\n\nThe decrypted result buffer.\n\n</details>\n\n---\n\n- See [`CoerceToUint8ArrayInput`](#coercetouint8arrayinput) for more informations about supported input data types.\n- See [`Cph.Options`](#cphoptionst) for more informations about additional decryption options.\n- See [In-memory data buffer encryption/decryption](#in-memory-data-buffer-encryptiondecryption) examples.\n\n---\n\n##### `Cipher.HybridEncrypt()`\n\nEncrypts in-memory data using hybrid encryption.\n\n> [!WARNING]\n> This is not suitable for large data encryption. Use [`Cipher.stream.HybridEncrypt()`](#cipherstreamhybridencrypt) method for large data encryption.\n\n---\n\n> [!WARNING]\n> Please, note that when using hybrid encryption/decryption algorithms:\n>\n> - an RSA keypair is required.\n> - if a passphrase is set for the Private Key, please make sure to use one of the Cipher Block Chaining algorithm or `chacha20-poly1305` algorithm:\n>   - aes-128-cbc (`type` can be `pkcs1` or `pkcs8`)\n>   - aes-192-cbc (`type` can be `pkcs1` or `pkcs8`)\n>   - aes-256-cbc (`type` can be `pkcs1` or `pkcs8`)\n>   - chacha20-poly1305 (`type` can only be `pkcs1`)\n\n<details>\n\n<summary style=\"cursor:pointer\">Parameters</summary>\n\n| Parameter | Type                      | Default | Description                    |\n| --------- | ------------------------- | ------- | ------------------------------ |\n| `data`    | `CoerceToUint8ArrayInput` | -       | The data to encrypt.           |\n| `key`     | `crypto.KeyLike`          | -       | The RSA Public Key.            |\n| `options` | `Cph.Options`             | -       | (Optional) Additional options. |\n\n</details>\n\n---\n\n<details>\n\n<summary>Returns</summary>\n\nType: `Buffer`\n\nThe encrypted result buffer.\n\n</details>\n\n---\n\n- See [`CoerceToUint8ArrayInput`](#coercetouint8arrayinput) for more informations about supported input data types.\n- See [`Cph.Options`](#cphoptionst) for more informations about additional decryption options.\n- See [In-memory data buffer hybrid encryption/decryption](#in-memory-data-buffer-hybrid-encryptiondecryption) example.\n\n---\n\n##### `Cipher.HybridDecrypt()`\n\nDecrypts in-memory data using hybrid encryption.\n\n> [!WARNING]\n> This is not suitable for large data decryption. Use [`Cipher.stream.HybridDecrypt()`](#cipherstreamhybriddecrypt) method for large data decryption.\n\n---\n\n> [!WARNING]\n> Please, note that when using hybrid encryption/decryption algorithms:\n>\n> - an RSA keypair is required.\n> - if a passphrase is set for the Private Key, please make sure to use one of the Cipher Block Chaining algorithm or `chacha20-poly1305` algorithm:\n>   - aes-128-cbc (`type` can be `pkcs1` or `pkcs8`)\n>   - aes-192-cbc (`type` can be `pkcs1` or `pkcs8`)\n>   - aes-256-cbc (`type` can be `pkcs1` or `pkcs8`)\n>   - chacha20-poly1305 (`type` can only be `pkcs1`)\n\n<details>\n\n<summary style=\"cursor:pointer\">Parameters</summary>\n\n| Parameter | Type                      | Default | Description                    |\n| --------- | ------------------------- | ------- | ------------------------------ |\n| `data`    | `CoerceToUint8ArrayInput` | -       | The data to encrypt.           |\n| `key`     | `Cph.PrivateKey`          | -       | The RSA Private Key.           |\n| `options` | `Cph.Options`             | -       | (Optional) Additional options. |\n\n</details>\n\n---\n\n<details>\n\n<summary style=\"cursor:pointer\">Returns</summary>\n\nType: `Buffer`.\n\nThe encrypted result Buffer.\n\n</details>\n\n---\n\n- See [`CoerceToUint8ArrayInput`](#coercetouint8arrayinput) for more informations about supported input data types.\n- See [`Cph.PrivateKey`](#cphprivatekey) for accepted formats.\n- See [`Cph.Options`](#cphoptionst) for more informations about additional decryption options.\n- See [In-memory data buffer hybrid encryption/decryption](#in-memory-data-buffer-hybrid-encryptiondecryption) example.\n\n---\n\n##### `Cipher.stream.Encrypt()`\n\nEncrypt stream data.\n\n<details>\n\n<summary>Parameters</summary>\n\n| Name                | Type                        | Default       | Description                                              |\n| ------------------- | --------------------------- | ------------- | -------------------------------------------------------- |\n| `secret`            | `CoerceToUint8ArrayInput`   | -             | The secret key used to encrypt the data.                 |\n| `options`           | `Cph.Stream.EncryptOptions` | -             | An object defining required options.                     |\n| `options.input`     | `Readable`                  | -             | The `Readable` Stream where raw data to encrypt is read. |\n| `options.output`    | `Writable`                  | -             | The `Writable` Stream where encrypted data is written.   |\n| `options.algorithm` | `Cph.CBCTypes`              | `aes-256-cbc` | One of the Cipher Block Chaining algorithm.              |\n\n</details>\n\n---\n\n<details>\n\n<summary style=\"cursor:pointer\">Returns</summary>\n\nType: `Promise<void>`\n\nA new Promise that resolves `void` once stream encryption is completed.\n\n</details>\n\n---\n\n- See [In-memory data stream encryption/decryption](#in-memory-data-stream-encryptiondecryption) example.\n\n---\n\n##### `Cipher.stream.Decrypt()`\n\nDecrypt stream data.\n\n<details>\n\n<summary>Parameters</summary>\n\n| Name                | Type                        | Default       | Description                                            |\n| ------------------- | --------------------------- | ------------- | ------------------------------------------------------ |\n| `secret`            | `CoerceToUint8ArrayInput`   | -             | The secret key used to decrypt the data.               |\n| `options`           | `Cph.Stream.DecryptOptions` | -             | An object defining required options.                   |\n| `options.input`     | `Readable`                  | -             | The `Readable` Stream where encrypted data is read.    |\n| `options.output`    | `Writable`                  | -             | The `Writable` Stream where decrypted data is written. |\n| `options.algorithm` | `Cph.CBCTypes`              | `aes-256-cbc` | One of the Cipher Block Chaining algorithm.            |\n\n</details>\n\n---\n\n<details>\n\n<summary style=\"cursor:pointer\">Returns</summary>\n\nType: `Promise<void>`\n\nA new Promise that resolves `void` once stream decryption is completed.\n\n</details>\n\n---\n\n- See [In-memory data stream encryption/decryption](#in-memory-data-stream-encryptiondecryption) example.\n\n---\n\n##### `Cipher.stream.HybridEncrypt()`\n\nEncrypt stream data using hybrid encryption.\n\n> [!WARNING]\n> Please, note that when using hybrid encryption/decryption algorithms:\n>\n> - an RSA keypair is required.\n> - if a passphrase is set for the Private Key, please make sure to use one of the Cipher Block Chaining algorithm or `chacha20-poly1305` algorithm:\n>   - aes-128-cbc (`type` can be `pkcs1` or `pkcs8`)\n>   - aes-192-cbc (`type` can be `pkcs1` or `pkcs8`)\n>   - aes-256-cbc (`type` can be `pkcs1` or `pkcs8`)\n>   - chacha20-poly1305 (`type` can only be `pkcs1`)\n\n<details>\n\n<summary style=\"cursor:pointer\">Parameters</summary>\n\n| Parameter           | Type                        | Default       | Description                                              |\n| ------------------- | --------------------------- | ------------- | -------------------------------------------------------- |\n| `key`               | `crypto.KeyLike`            | -             | The RSA Public Key.                                      |\n| `options`           | `Cph.Stream.EncryptOptions` | -             | An object defining required options.                     |\n| `options.input`     | `Readable`                  | -             | The `Readable` Stream where raw data to encrypt is read. |\n| `options.output`    | `Writable`                  | -             | The `Writable` Stream where encrypted data is written.   |\n| `options.algorithm` | `Cph.CBCTypes`              | `aes-256-cbc` | One of the Cipher Block Chaining algorithm.              |\n\n</details>\n\n---\n\n<details>\n\n<summary>Returns</summary>\n\nType: `Promise<void>`\n\nA new Promise that resolves `void` once stream encryption is completed.\n\n</details>\n\n---\n\n- See [In-memory data stream with hybrid encryption/decryption](#in-memory-data-stream-with-hybrid-encryptiondecryption) example.\n\n---\n\n##### `Cipher.stream.HybridDecrypt()`\n\nDecrypt stream data using hybrid decryption.\n\n> [!WARNING]\n> Please, note that when using hybrid encryption/decryption algorithms:\n>\n> - an RSA keypair is required.\n> - if a passphrase is set for the Private Key, please make sure to use one of the Cipher Block Chaining algorithm or `chacha20-poly1305` algorithm:\n>   - aes-128-cbc (`type` can be `pkcs1` or `pkcs8`)\n>   - aes-192-cbc (`type` can be `pkcs1` or `pkcs8`)\n>   - aes-256-cbc (`type` can be `pkcs1` or `pkcs8`)\n>   - chacha20-poly1305 (`type` can only be `pkcs1`)\n\n<details>\n\n<summary style=\"cursor:pointer\">Parameters</summary>\n\n| Parameter           | Type                        | Default       | Description                                            |\n| ------------------- | --------------------------- | ------------- | ------------------------------------------------------ |\n| `key`               | `Cph.PrivateKey`            | -             | The RSA Private Key.                                   |\n| `options`           | `Cph.Stream.DecryptOptions` | -             | An object defining required options.                   |\n| `options.input`     | `Readable`                  | -             | The `Readable` Stream where encrypted data is read.    |\n| `options.output`    | `Writable`                  | -             | The `Writable` Stream where decrypted data is written. |\n| `options.algorithm` | `Cph.CBCTypes`              | `aes-256-cbc` | One of the Cipher Block Chaining algorithm.            |\n\n</details>\n\n---\n\n<details>\n\n<summary>Returns</summary>\n\nType: `Promise<void>`\n\nA new Promise that resolves `void` once stream encryption is completed.\n\n</details>\n\n---\n\n- See [`CoerceToUint8ArrayInput`](#coercetouint8arrayinput) for more informations about supported input data types.\n- See [`Cph.PrivateKey`](#cphprivatekey) for accepted formats.\n- See [In-memory data stream with hybrid encryption/decryption](#in-memory-data-stream-with-hybrid-encryptiondecryption) example.\n\n---\n\n#### Types\n\n##### `CoerceToUint8ArrayInput`\n\nThis module supports different input data types and it uses the [`coerceToUint8Array`](https://npmjs.com/package/@alessiofrittoli/crypto-buffer#coercetouint8array) utility function from [`@alessiofrittoli/crypto-buffer`](https://npmjs.com/package/@alessiofrittoli/crypto-buffer) to convert it to a `Uint8Array`.\n\n- See [`coerceToUint8Array`](https://npmjs.com/package/@alessiofrittoli/crypto-buffer#coercetouint8array) for more informations about the supported input types.\n\n---\n\n##### `Cph.CBCTypes`\n\nAES Cipher Block Chaining algorithms.\n\n---\n\n##### `Cph.AesAlgorithm`\n\nAll supported AES algorithms.\n\n---\n\n##### `Cph.Options<T>`\n\nCommon options in encryption/decryption processes.\n\n<details>\n\n<summary>Type parameters</summary>\n\n| Parameter | Default            | Description                                                                            |\n| --------- | ------------------ | -------------------------------------------------------------------------------------- |\n| `T`       | `Cph.AesAlgorithm` | Accepted algorithm in `Cph.Options`. This is usefull to constraint specifc algorithms. |\n\n</details>\n\n---\n\n<details>\n\n<summary>Properties</summary>\n\n| Property    | Type                      | Default                      | Description                                                                                                                                                    |\n| ----------- | ------------------------- | ---------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| `algorithm` | `T`                       | `aes-256-gcm \\| aes-256-cbc` | Accepted algorithms.                                                                                                                                           |\n| `salt`      | `number`                  | `32`                         | The `salt` length in bytes. Minimum: `16`, Maximum: `64`.                                                                                                      |\n| `iv`        | `number`                  | `16`                         | The Initialization Vector length in bytes. Minimum: `8`, Maximum: `32`.                                                                                        |\n| `authTag`   | `number`                  | `16`                         | The `authTag` length in bytes. Minimum: `4`, Maximum: `16`.                                                                                                    |\n| `aad`       | `CoerceToUint8ArrayInput` | -                            | Custom Additional Authenticated Data. `aadLength` is then automatically resolved. If not provided, a random AAD is generated with a max length of `aadLength`. |\n| `aadLength` | `number`                  | `32`                         | The auto generated AAD length in bytes. Minimum: `16`, Maximum: `128`.                                                                                         |\n\n</details>\n\n---\n\n##### `Cph.Stream.EncryptOptions`\n\nStream symmetric encryption options.\n\n<details>\n\n<summary>Properties</summary>\n\n| Property    | Type           | Description                                                   |\n| ----------- | -------------- | ------------------------------------------------------------- |\n| `input`     | `Readable`     | The `Readable` Stream from where raw data to encrypt is read. |\n| `output`    | `Writable`     | The `Writable` Stream where encrypted data is written.        |\n| `algorithm` | `Cph.CBCTypes` | One of the Cipher Block Chaining algorithm.                   |\n\n</details>\n\n---\n\n##### `Cph.Stream.DecryptOptions`\n\nStream symmetric decryption options.\n\n- Alias of [`Cph.Stream.EncryptOptions`](#cphstreamencryptoptions).\n\n<details>\n\n<summary>Properties</summary>\n\n| Property    | Type           | Description                                              |\n| ----------- | -------------- | -------------------------------------------------------- |\n| `input`     | `Readable`     | The `Readable` Stream from where encrypted data is read. |\n| `output`    | `Writable`     | The `Writable` Stream where decrypted data is written.   |\n| `algorithm` | `Cph.CBCTypes` | One of the Cipher Block Chaining algorithm.              |\n\n</details>\n\n---\n\n##### `Cph.PrivateKey`\n\nThe RSA Private Key.\n\nIt could be:\n\n- a `crypto.KeyLike`\n- an object defining `key` and `passphrase` where `key` is a `crypto.KeyLike`\n\n---\n\n### Examples\n\n#### In-memory data buffer encryption/decryption\n\nThe simpliest way to encrypt/decrypt in-memory data buffers.\n\n```ts\n// encrypt\nconst data = \"my top-secret data\";\nconst password = \"my-very-strong-password\";\n\nconst encrypted = Cipher.Encrypt(data, password);\n\n// decrypt\nconst decrypted = Cipher.Decrypt(encrypted, password);\nconsole.log(decrypted); // Outputs: my top-secret data\n```\n\n---\n\n#### In-memory data buffer hybrid encryption/decryption\n\nHybrid encryption offers an higher level of security since only the RSA Private Key owner will be able to decrypt the data.\n\n> [!WARNING]\n> Please, note that when using hybrid encryption/decryption algorithms:\n>\n> - an RSA keypair is required.\n> - if a passphrase is set for the Private Key, please make sure to use one of the Cipher Block Chaining algorithm or `chacha20-poly1305` algorithm:\n>   - aes-128-cbc (`type` can be `pkcs1` or `pkcs8`)\n>   - aes-192-cbc (`type` can be `pkcs1` or `pkcs8`)\n>   - aes-256-cbc (`type` can be `pkcs1` or `pkcs8`)\n>   - chacha20-poly1305 (`type` can only be `pkcs1`)\n\n##### Keypair\n\n```ts\nimport { Cipher } from \"@alessiofrittoli/crypto-cipher\";\n\nconst keyPair = crypto.generateKeyPairSync(\"rsa\", {\n  modulusLength: 512 * 8, // 4096 bits\n  publicKeyEncoding: { type: \"spki\", format: \"pem\" },\n  privateKeyEncoding: { type: \"pkcs1\", format: \"pem\" },\n});\n\n// or you can optionally set a custom passphrase\nconst passphrase = \"custompassphrase\";\n\nconst keyPair = crypto.generateKeyPairSync(\"rsa\", {\n  modulusLength: 512 * 8, // 4096 bits\n  publicKeyEncoding: { type: \"spki\", format: \"pem\" },\n  privateKeyEncoding: {\n    type: \"pkcs1\",\n    format: \"pem\",\n    passphrase,\n    cipher: Cipher.ALGORITHM.CHACHA_20_POLY,\n  },\n});\n```\n\n```ts\nimport { Cipher } from \"@alessiofrittoli/crypto-cipher\";\n\n// encrypt\nconst data = \"my top-secret data\";\nconst encrypted = Cipher.HybridEncrypt(data, keypair.publicKey);\n\n// decrypt\nconst decrypted = Cipher.HybridDecrypt(encrypted, {\n  key: keypair.privateKey,\n  passphrase,\n});\n```\n\n---\n\n#### In-memory data stream encryption/decryption\n\nThe in-memory data stream comes pretty handy when, for example, we need to stream encrypted data within a Server Response or to decrypt stream data from a Server Response.\n\n##### Streaming\n\n```ts\n// /api/stream-encrypt\n\nimport { Readable, Writable } from \"stream\";\nimport { Stream } from \"@alessiofrittoli/stream-writer\";\n\nconst routeHandler = () => {\n  const password = \"my-very-strong-password\";\n  const stream = new Stream();\n  const headers = new Headers(stream.headers);\n\n  const input = Readable.from([\n    Buffer.from(\"Chunk n.1\"),\n    Buffer.from(\"Chunk n.2\"),\n    Buffer.from(\"Chunk n.3\"),\n    Buffer.from(\"Chunk n.4\"),\n  ]);\n\n  // `Writable` Stream where encrypted data is written\n  const output = new Writable({\n    async write(chunk, encoding, callback) {\n      await new Promise((resolve) => setTimeout(resolve, 2000));\n      await stream.write(chunk);\n      callback();\n    },\n    async final(callback) {\n      await stream.close();\n      callback();\n    },\n  });\n\n  Cipher.stream.Encrypt(password, { input, output }).catch(async () => {\n    await stream.close();\n  });\n\n  return (\n    // encrypted stream\n    new Response(stream.readable, { headers })\n  );\n};\n```\n\n##### Decrypting received stream\n\n```ts\n// /api/stream-decrypt\n\nimport { Transform, Writable } from \"stream\";\nimport { Cipher } from \"@alessiofrittoli/crypto-cipher\";\nimport { StreamReader } from \"@alessiofrittoli/stream-reader\";\n\nconst password = \"my-very-strong-password\";\n\nconst routeHandler = () =>\n  fetch(\"/api/stream-encrypt\").then((response) => {\n    if (!response.body) {\n      return new Respone(null, { status: 400 });\n    }\n\n    // web stream where decrypted data is written\n    const stream = new Stream<Buffer, string>({\n      transform(chunk, controller) {\n        controller.enqueue(chunk.toString());\n      },\n    });\n    const headers = new Headers(stream.headers);\n\n    headers.set(\"Content-Type\", \"text/html\");\n\n    const reader = new StreamReader<Uint8Array, Buffer, false>(response.body, {\n      inMemory: false,\n      transform: Buffer.from,\n    });\n\n    const input = new Transform();\n\n    reader.on(\"data\", (chunk) => input.push(chunk));\n    reader.on(\"close\", () => input.end());\n\n    reader.read();\n\n    // `Writable` Stream where encrypted data is written\n    const output = new Writable({\n      async write(chunk: Buffer, encoding, callback) {\n        await stream.write(chunk);\n        callback();\n      },\n      final(callback) {\n        stream.close();\n        callback();\n      },\n    });\n\n    Cipher.stream.Decrypt(password, { input, output }).catch(async (error) => {\n      console.error(error);\n      await stream.close();\n    });\n\n    return new Response(stream.readable, { headers });\n  });\n```\n\n---\n\n#### In-memory data stream with hybrid encryption/decryption\n\nHybrid encryption offers an higher level of security since only the RSA Private Key owner will be able to decrypt the data.\n\n> [!WARNING]\n> Please, note that when using hybrid encryption/decryption algorithms:\n>\n> - an RSA keypair is required.\n> - if a passphrase is set for the Private Key, please make sure to use one of the Cipher Block Chaining algorithm or `chacha20-poly1305` algorithm:\n>   - aes-128-cbc (`type` can be `pkcs1` or `pkcs8`)\n>   - aes-192-cbc (`type` can be `pkcs1` or `pkcs8`)\n>   - aes-256-cbc (`type` can be `pkcs1` or `pkcs8`)\n>   - chacha20-poly1305 (`type` can only be `pkcs1`)\n\n##### Keypair\n\n```ts\nimport { Cipher } from \"@alessiofrittoli/crypto-cipher\";\n\nconst keyPair = crypto.generateKeyPairSync(\"rsa\", {\n  modulusLength: 512 * 8, // 4096 bits\n  publicKeyEncoding: { type: \"spki\", format: \"pem\" },\n  privateKeyEncoding: { type: \"pkcs1\", format: \"pem\" },\n});\n\n// or you can optionally set a custom passphrase\nconst passphrase = \"custompassphrase\";\n\nconst keyPair = crypto.generateKeyPairSync(\"rsa\", {\n  modulusLength: 512 * 8, // 4096 bits\n  publicKeyEncoding: { type: \"spki\", format: \"pem\" },\n  privateKeyEncoding: {\n    type: \"pkcs1\",\n    format: \"pem\",\n    passphrase,\n    cipher: Cipher.ALGORITHM.CHACHA_20_POLY,\n  },\n});\n```\n\n##### Encrypt\n\n```ts\nconst data = \"my top-secret data\";\n/** Store encrypted chunks for next example. */\nconst encryptedChunks: Buffer[] = [];\n\n// Create a `Readable` Stream with raw data.\nconst input = new Readable({\n  read() {\n    this.push(data); // Push data to encrypt\n    this.push(null); // Signal end of stream\n  },\n});\n\n// Create a `Writable` Stream where encrypted data is written\nconst output = new Writable({\n  write(chunk, encoding, callback) {\n    // push written chunk to `encryptedChunks` for further usage.\n    encryptedChunks.push(chunk);\n    callback();\n  },\n});\n\nawait Cipher.stream.HybridEncrypt(keyPair.publicKey, { input, output });\n```\n\n---\n\n##### Decrypt\n\n```ts\n/** Store decrypted chunks. */\nconst chunks: Buffer[] = [];\n// Create a `Readable` Stream with encrypted data.\nconst input = Readable.from(encryptedChunks);\n\n// Create a `Writable` Stream where decrypted data is written\nconst output = new Writable({\n  write(chunk, encoding, callback) {\n    chunks.push(chunk);\n    callback();\n  },\n});\n\nawait Cipher.stream.HybridDecrypt(\n  {\n    key: keyPair.privateKey,\n    passphrase, // optional passhrase (required if set while generating keypair).\n  },\n  { input, output }\n);\n\nconsole.log(Buffer.concat(chunks).toString()); // Outputs: 'my top-secret data'\n```\n\n---\n\n#### File based data stream encryption/decryption\n\nNothig differs from the [In-memory data stream encryption/decryption](#in-memory-data-stream-encryptiondecryption) example, except for `input` and `output` streams which now comes directly from files reading/writing.\n\n##### Encrypt a file\n\n```ts\nimport fs from \"fs\";\n\nconst password = \"my-very-strong-password\";\n\n// input where raw data to encrypt is read\nconst input = fs.createReadStream(\"my-very-large-top-secret-file.pdf\");\n// output where encrypted data is written\nconst output = fs.createWriteStream(\"my-very-large-top-secret-file.encrypted\");\n// encrypt\nawait Cipher.stream.Encrypt(password, { input, output });\n```\n\n---\n\n##### Decrypt a file\n\n```ts\nimport fs from \"fs\";\n\nconst password = \"my-very-strong-password\";\n\n// input where encrypted data is read\nconst input = fs.createReadStream(\"my-very-large-top-secret-file.encrypted\");\n// output where decrypted data is written\nconst output = fs.createWriteStream(\n  \"my-very-large-top-secret-file-decrypted.pdf\"\n);\n// decrypt\nawait Cipher.stream.Decrypt(password, { input, output });\n```\n\n---\n\n#### File based data stream with hybrid encryption/decryption\n\nNothig differs from the [In-memory data stream with hybrid encryption/decryption](#in-memory-data-stream-with-hybrid-encryptiondecryption) example, except for `input` and `output` streams which now comes directly from files reading/writing.\n\n> [!WARNING]\n> Please, note that when using hybrid encryption/decryption algorithms:\n>\n> - an RSA keypair is required.\n> - if a passphrase is set for the Private Key, please make sure to use one of the Cipher Block Chaining algorithm or `chacha20-poly1305` algorithm:\n>   - aes-128-cbc (`type` can be `pkcs1` or `pkcs8`)\n>   - aes-192-cbc (`type` can be `pkcs1` or `pkcs8`)\n>   - aes-256-cbc (`type` can be `pkcs1` or `pkcs8`)\n>   - chacha20-poly1305 (`type` can only be `pkcs1`)\n\n##### Keypair\n\n```ts\nimport { Cipher } from \"@alessiofrittoli/crypto-cipher\";\n\nconst keyPair = crypto.generateKeyPairSync(\"rsa\", {\n  modulusLength: 512 * 8, // 4096 bits\n  publicKeyEncoding: { type: \"spki\", format: \"pem\" },\n  privateKeyEncoding: { type: \"pkcs1\", format: \"pem\" },\n});\n\n// or you can optionally set a custom passphrase\nconst passphrase = \"custompassphrase\";\n\nconst keyPair = crypto.generateKeyPairSync(\"rsa\", {\n  modulusLength: 512 * 8, // 4096 bits\n  publicKeyEncoding: { type: \"spki\", format: \"pem\" },\n  privateKeyEncoding: {\n    type: \"pkcs1\",\n    format: \"pem\",\n    passphrase,\n    cipher: Cipher.ALGORITHM.CHACHA_20_POLY,\n  },\n});\n```\n\n##### Encrypt a file\n\n```ts\nimport fs from \"fs\";\n\n// input where raw data to encrypt is read\nconst input = fs.createReadStream(\"my-very-large-top-secret-file.pdf\");\n// output where encrypted data is written\nconst output = fs.createWriteStream(\"my-very-large-top-secret-file.encrypted\");\n// encrypt\nawait Cipher.stream.HybridEncrypt(keyPair.publicKey, { input, output });\n```\n\n---\n\n##### Decrypt a file\n\n```ts\nimport fs from \"fs\";\n\n// input where encrypted data is read\nconst input = fs.createReadStream(\"my-very-large-top-secret-file.encrypted\");\n// output where decrypted data is written\nconst output = fs.createWriteStream(\n  \"my-very-large-top-secret-file-decrypted.pdf\"\n);\n// decrypt\nconst { decrypt } = await Cipher.stream.HybridDecrypt(\n  {\n    key: keyPair.privateKey,\n    passphrase, // optional passhrase (required if set while generating keypair).\n  },\n  { input, output }\n);\n```\n\n---\n\n### Development\n\n#### Install depenendencies\n\n```bash\nnpm install\n```\n\nor using `pnpm`\n\n```bash\npnpm i\n```\n\n#### Build the source code\n\nRun the following command to test and build code for distribution.\n\n```bash\npnpm build\n```\n\n#### [ESLint](https://www.npmjs.com/package/eslint)\n\nwarnings / errors check.\n\n```bash\npnpm lint\n```\n\n#### [Jest](https://npmjs.com/package/jest)\n\nRun all the defined test suites by running the following:\n\n```bash\n# Run tests and watch file changes.\npnpm test:watch\n\n# Run tests in a CI environment.\npnpm test:ci\n```\n\n- See [`package.json`](./package.json) file scripts for more info.\n\nRun tests with coverage.\n\nAn HTTP server is then started to serve coverage files from `./coverage` folder.\n\n⚠️ You may see a blank page the first time you run this command. Simply refresh the browser to see the updates.\n\n```bash\ntest:coverage:serve\n```\n\n---\n\n### Contributing\n\nContributions are truly welcome!\n\nPlease refer to the [Contributing Doc](./CONTRIBUTING.md) for more information on how to start contributing to this project.\n\nHelp keep this project up to date with [GitHub Sponsor][sponsor-url].\n\n[![GitHub Sponsor][sponsor-badge]][sponsor-url]\n\n---\n\n### Security\n\nIf you believe you have found a security vulnerability, we encourage you to **_responsibly disclose this and NOT open a public issue_**. We will investigate all legitimate reports. Email `security@alessiofrittoli.it` to disclose any security vulnerabilities.\n\n### Made with ☕\n\n<table style='display:flex;gap:20px;'>\n  <tbody>\n    <tr>\n      <td>\n        <img alt=\"avatar\" src='https://avatars.githubusercontent.com/u/35973186' style='width:60px;border-radius:50%;object-fit:contain;'>\n      </td>\n      <td>\n        <table style='display:flex;gap:2px;flex-direction:column;'>\n          <tbody>\n              <tr>\n                <td>\n                  <a href='https://github.com/alessiofrittoli' target='_blank' rel='noopener'>Alessio Frittoli</a>\n                </td>\n              </tr>\n              <tr>\n                <td>\n                  <small>\n                    <a href='https://alessiofrittoli.it' target='_blank' rel='noopener'>https://alessiofrittoli.it</a> |\n                    <a href='mailto:info@alessiofrittoli.it' target='_blank' rel='noopener'>info@alessiofrittoli.it</a>\n                  </small>\n                </td>\n              </tr>\n          </tbody>\n        </table>\n      </td>\n    </tr>\n  </tbody>\n</table>\n","readmeFilename":"README.md"}