{"_id":"@anyenk/shinkansen-signature","_rev":"2-5f3a9bfe2117232208f0a0dbe9730db2","name":"@anyenk/shinkansen-signature","dist-tags":{"latest":"1.0.1"},"versions":{"1.0.0":{"name":"@anyenk/shinkansen-signature","version":"1.0.0","keywords":["shinkansen","signature","jws","ps256","crypto","verification","typescript","library","finance","payment"],"author":{"name":"Anyenk Inc."},"license":"MIT","_id":"@anyenk/shinkansen-signature@1.0.0","maintainers":[{"name":"ajunge","email":"ajunge@totexa.cl"}],"homepage":"https://github.com/anyenk/shinkansen-signature#readme","bugs":{"url":"https://github.com/anyenk/shinkansen-signature/issues"},"dist":{"shasum":"84438251115394bb9051aae1aabcb1f192419fb3","tarball":"https://registry.npmjs.org/@anyenk/shinkansen-signature/-/shinkansen-signature-1.0.0.tgz","fileCount":9,"integrity":"sha512-alr5vlhoL9fpUl3HGqS8l4DEUmwR3QVgr7XkRGf3XPT5n5+YDE3cg0I/XdsmHqfsv1wnVlmyngr78yAmQ2lPFQ==","signatures":[{"sig":"MEUCIQCSf/8fQZ5o2WUuGiuKdIyZMuNAm6gsCg1bwNlHCoq5lAIgHy5bVXynjTFB+j5MpY3Tw8RN1F6tY9Ea4cDC7uU+pLs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":30589},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.esm.js","engines":{"node":">=16.0.0"},"gitHead":"fca7ec4bf6ef8365878ac53d39ddef7d995e5fa3","scripts":{"dev":"rollup -c -w","lint":"eslint src --ext .ts","test":"jest","build":"rollup -c","lint:fix":"eslint src --ext .ts --fix","typecheck":"tsc --noEmit","test:watch":"jest --watch","prepublishOnly":"npm run build","publish:public":"npm publish --access public"},"_npmUser":{"name":"ajunge","email":"ajunge@totexa.cl"},"repository":{"url":"git+https://github.com/anyenk/shinkansen-signature.git","type":"git"},"_npmVersion":"11.4.2","description":"TypeScript library for creating and verifying Shinkansen JWS signatures with PS256 algorithm","directories":{},"_nodeVersion":"23.11.0","dependencies":{"jose":"^5.2.0","node-forge":"^1.3.1"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","tslib":"^2.6.2","eslint":"^8.57.0","rollup":"^4.12.0","ts-jest":"^29.1.2","typescript":"^5.3.3","@types/jest":"^29.5.12","@types/node-forge":"^1.3.11","@rollup/plugin-typescript":"^11.1.6","@typescript-eslint/parser":"^7.0.0","@typescript-eslint/eslint-plugin":"^7.0.0"},"_npmOperationalInternal":{"tmp":"tmp/shinkansen-signature_1.0.0_1754343354294_0.30954538801808074","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@anyenk/shinkansen-signature","version":"1.0.1","description":"TypeScript library for creating and verifying Shinkansen JWS signatures with PS256 algorithm","main":"dist/index.js","module":"dist/index.esm.js","types":"dist/index.d.ts","scripts":{"build":"rollup -c","dev":"rollup -c -w","test":"jest","test:watch":"jest --watch","lint":"eslint src --ext .ts","lint:fix":"eslint src --ext .ts --fix","typecheck":"tsc --noEmit","prepublishOnly":"npm run build","publish:public":"npm publish --access public"},"keywords":["shinkansen","signature","jws","ps256","crypto","verification","typescript","library","finance","payment"],"author":{"name":"Anyenk Inc."},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/anyenk/shinkansen-signature.git"},"bugs":{"url":"https://github.com/anyenk/shinkansen-signature/issues"},"homepage":"https://github.com/anyenk/shinkansen-signature#readme","engines":{"node":">=16.0.0"},"publishConfig":{"access":"public"},"dependencies":{"jose":"^5.2.0","node-forge":"^1.3.1"},"devDependencies":{"@rollup/plugin-typescript":"^11.1.6","@types/jest":"^29.5.12","@types/node-forge":"^1.3.11","@typescript-eslint/eslint-plugin":"^7.0.0","@typescript-eslint/parser":"^7.0.0","eslint":"^8.57.0","jest":"^29.7.0","rollup":"^4.12.0","ts-jest":"^29.1.2","tslib":"^2.6.2","typescript":"^5.3.3"},"_id":"@anyenk/shinkansen-signature@1.0.1","gitHead":"200a2fd55396cb953e2f0d5e549a9f55581a6081","_nodeVersion":"23.11.0","_npmVersion":"11.4.2","dist":{"integrity":"sha512-u3ecAeQg+FAxZSmIbarixbfom4vp+5QDzqiWpZ6z+OTeDhEjb+ZarmJcTafpsmUtcN66BWGBJYn5ljcXz9g8LA==","shasum":"cd825a5173538970da771f756384a9136fac484e","tarball":"https://registry.npmjs.org/@anyenk/shinkansen-signature/-/shinkansen-signature-1.0.1.tgz","fileCount":9,"unpackedSize":34188,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIFo08DoZfFd5THYEJZrKdq9t9ZSBcUCvwC9LPpJz1dx7AiAPjCchtC369yYSODZgBwEGQmD3f9q75QgfOu045/LV/Q=="}]},"_npmUser":{"name":"ajunge","email":"ajunge@totexa.cl"},"directories":{},"maintainers":[{"name":"ajunge","email":"ajunge@totexa.cl"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/shinkansen-signature_1.0.1_1754589970140_0.5251888857984452"},"_hasShrinkwrap":false}},"time":{"created":"2025-08-04T21:35:54.138Z","modified":"2025-08-07T18:06:10.564Z","1.0.0":"2025-08-04T21:35:54.489Z","1.0.1":"2025-08-07T18:06:10.344Z"},"bugs":{"url":"https://github.com/anyenk/shinkansen-signature/issues"},"author":{"name":"Anyenk Inc."},"license":"MIT","homepage":"https://github.com/anyenk/shinkansen-signature#readme","keywords":["shinkansen","signature","jws","ps256","crypto","verification","typescript","library","finance","payment"],"repository":{"type":"git","url":"git+https://github.com/anyenk/shinkansen-signature.git"},"description":"TypeScript library for creating and verifying Shinkansen JWS signatures with PS256 algorithm","maintainers":[{"name":"ajunge","email":"ajunge@totexa.cl"}],"readme":"# @anyenk/shinkansen-signature\n\n[![CI](https://github.com/anyenk/shinkansen-signature/actions/workflows/ci.yml/badge.svg)](https://github.com/anyenk/shinkansen-signature/actions/workflows/ci.yml)\n[![npm version](https://badge.fury.io/js/%40anyenk%2Fshinkansen-signature.svg)](https://badge.fury.io/js/%40anyenk%2Fshinkansen-signature)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n\nA TypeScript library for creating and verifying signatures for Shinkansen (https://shinkansen.finance/) integration according to their security specification.\n\n**Documentation:**\n- [Message Signing Specification](https://docs.shinkansen.tech/docs/firmar-mensajes)\n- [Message Verification Specification](https://docs.shinkansen.tech/docs/verificar-mensajes)\n\n## Installation\n\n```bash\nnpm install @anyenk/shinkansen-signature\n```\n\n## Usage\n\n### Verifying Signatures\n\n```typescript\nimport { verifySignature } from '@anyenk/shinkansen-signature';\n\n// Verify a JWS signature from Shinkansen POST request\nconst result = await verifySignature({\n  jws: 'eyJ0eXAiOiJKV1QiLCJhbGciOiJQUzI1NiIsIng1YyI6WyJNSUlD...',\n  payload: '{\"amount\": 1000, \"currency\": \"USD\"}',\n  trustedCertificates: ['MIICertificate1...', 'MIICertificate2...']\n});\n\nconsole.log(result.isValid); // true or false\nconsole.log(result.error); // Error message if validation failed\n```\n\n### Creating Signatures\n\n```typescript\nimport { createSignature } from '@anyenk/shinkansen-signature';\n\n// Create a JWS signature for sending to Shinkansen\nconst result = await createSignature({\n  payload: '{\"amount\": 1000, \"currency\": \"USD\"}',\n  privateKey: '-----BEGIN PRIVATE KEY-----\\nMIIEvgIBADANBgkqhkiG...',\n  certificate: '-----BEGIN CERTIFICATE-----\\nMIICertificateData...'\n});\n\nconsole.log(result.signature); // Detached JWS signature\n// Use this signature in the 'Shinkansen-JWS-Signature' HTTP header\n```\n\n### Real Shinkansen Example\n\n```typescript\nimport { verifySignature } from '@anyenk/shinkansen-signature';\n\n// Example with real Shinkansen data\nconst shinkansenJws = 'eyJhbGciOiJQUzI1NiIsImI2NCI6ZmFsc2UsImNyaXQiOlsiYjY0Il0sIng1YyI6WyJNSUlFSnpDQ0F3K2dBd0lCQWdJVUFJMFVIRjIzbEdDMzJScThhaDgyV29kWU8zTXdEUVlKS29aSWh2Y05BUUVMQlFBd2dhSXhDekFKQmdOVkJBWVRBa05NTVJZd0ZBWURWUVFJREExTlpYUnliM0J2YkdsMFlXNWhNUkV3RHdZRFZRUUhEQWhUWVc1MGFXRm5iekVUTUJFR0ExVUVDZ3dLVTJocGJtdGhibk5sYmpFVE1CRUdBMVVFQ3d3S1UyaHBibXRoYm5ObGJqRVRNQkVHQTFVRUF3d0tVMmhwYm10aGJuTmxiakVwTUNjR0NTcUdTSWIzRFFFSkFSWWFaR1YyZEdWemRFQnphR2x1YTJGdWMyVnVMbVpwYm1GdVkyVXdIaGNOTWpRd09USTBNakF6TWpBMVdoY05Nall3T1RFME1qQXpNakExV2pDQm9qRUxNQWtHQTFVRUJoTUNRMHd4RmpBVUJnTlZCQWdNRFUxbGRISnZjRzlzYVhSaGJtRXhFVEFQQmdOVkJBY01DRk5oYm5ScFlXZHZNUk13RVFZRFZRUUtEQXBUYUdsdWEyRnVjMlZ1TVJNd0VRWURWUVFMREFwVGFHbHVhMkZ1YzJWdU1STXdFUVlEVlFRRERBcFRhR2x1YTJGdWMyVnVNU2t3SndZSktvWklodmNOQVFrQkZocGtaWFowWlhOMFFITm9hVzVyWVc1elpXNHVabWx1WVc1alpUQ0NBU0l3RFFZSktvWklodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQU8wMU0zZ3YreENibTVXUGJuVXExaTRNbzIxTnZGNkNPRTB4anlnRnVTYVBkTHNqNTRpYkhwKzkzTDBlSURFMUJxN05wbGtCM3hzZzNLMU5BMGJJOGpjWXpCSFRoK3JYelZjc1BrRTJOWndNTUVqUlN0TURVcVBYWkpNSkJka2tuVnIwR25qL0dmNWZQdzNzLytWYlRCYjIwQ3ZWamVxTG1DbmJxeTNKRm91VkkvUWlhOVhvOFdWMzlDMDVFRlc2ZENpazhPWWFzSHlHMFFjVkxrb281aU16cUpXRlZWc3pZaXpVcjB6bTFSaXlUWnBKcnU4OWF3VEU2UmdSbGhXYU5GTlFmRFk5ZVdWTmtzczNzSlN3RWlaVmFWMFdITnVmSlBKbVdzZE16dXBjRnErNTJPWDhHbkcrMVFyUVVoYkROYUx2UUp4dWhPSDJtVnNrdWhIc3VQMENBd0VBQWFOVE1GRXdIUVlEVlIwT0JCWUVGQk9ZcjkwQ3pmWUJSb09Da1V2TWNOMVNIN1NMTUI4R0ExVWRJd1FZTUJhQUZCT1lyOTBDemZZQlJvT0NrVXZNY04xU0g3U0xNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdEUVlKS29aSWh2Y05BUUVMQlFBRGdnRUJBQXd3T3BVTEpYVFNLU1JXMkQwa0ZDNmdQd1ZMTzh3T3luUlpIOC82T2UxNjQwK3o4aXFZbkpzR0RZOUg1Sk4wbHBMc1Z1ZzFRSUwzZU93RVpZUEt4SFUvMUQzZVZYYmE0a1puTjRVVFZZbUtXdW1sbGw5TFdvZ0lEUW5Ja1JGREdDUWhET3g1MUUwcWdPb0hhM2RMZmd6VitnMCtHRTFoMFBCbnozWUpGU1lNbVBGNEtPNUN6dFFZRHZrb3Z0aER5clozWmFjckJ6dlB6U281SmFrWXpGV2ZMKzhROGR2N25vL3M4UlBOQklDS3pBeExFb0tibTA4OVdCYktBSTJhQmNqUVE1YjFheENjSjVJbnlRL1RTd0c2UXd2aDc3bE9lK2hxN1VUdWZKbC9acUJHZnpNcVkrdlY1TzRDcUkzTkVSREVwV0JrNUROSVVpMzh6S3htVkpBPSJdfQ..xxs8LI4Bke8nwu8xf9zjTzxwQHeo9l3f78BK1A_tlvx1r-ZXrC0-s9c_yiCD0SKv-konDUOh6u8JlCHUKOBEbgFadP6fS87212gQcDt3ltRQn7C_8qVbG23Hy7uxYSYHFbfs7w1RKWvbgzo9j8ICSazbm-2SKeLvPSnPqhiFcQQ9Md2z11BEALcWv778uvtHU6pLpPxBFsgMbh1CUP3bY7GtSitpba8hPyKP3doCCTUYEa4lADDxjmzRKY-XIzbiEVO82GMHExNucmTB1cTM-hQX3QJoWPDzAHqVIMeAObyQZrJal8_dje-9hUEwZqyAz0nWGewgKeXn3ipx43-MLg';\n\nconst shinkansenPayload = '{\"document\":{\"header\":{\"creation_date\":\"2025-08-04T21:00:57Z\",\"message_id\":\"6ebaf63f-eeb5-464e-bf3b-a4ec21627c76\",\"receiver\":{\"fin_id\":\"ANYENK_CL\",\"fin_id_schema\":\"SHINKANSEN\"},\"sender\":{\"fin_id\":\"SHINKANSEN\",\"fin_id_schema\":\"SHINKANSEN\"},\"shinkansen_message_id\":\"5190f257-2346-4633-8afa-e15ea7a1800c\"},\"notifications\":[{\"amount\":\"100000.00000\",\"creditor\":{\"account\":\"30002590\",\"account_type\":\"current_account\",\"financial_institution\":{\"fin_id\":\"SIMULATED_BANK\",\"fin_id_schema\":\"SHINKANSEN\"},\"identification\":{\"id\":\"60000159-0\",\"id_schema\":\"CLID\"},\"name\":\"Anyenk\"},\"currency\":\"CLP\",\"debtor\":{\"account\":\"30002590\",\"account_type\":\"current_account\",\"financial_institution\":{\"fin_id\":\"SIMULATED_BANK\",\"fin_id_schema\":\"SHINKANSEN\"},\"identification\":{\"id\":\"60000159-0\",\"id_schema\":\"CLID\"},\"name\":\"Anyenk\"},\"description\":\"Depositar dinero test0\",\"notification_date\":\"2025-08-04T21:00:57Z\",\"notification_id\":\"0c3d19d0-b61d-4e65-b78b-09a9cfbbd27b\",\"notification_type\":\"payin\",\"original_notification_id\":\"f5da362c-1134-4e63-95ce-890c780b929e\",\"payment_operator_metadata\":null,\"referenced_shinkansen_notification_ids\":null,\"shinkansen_notification_id\":\"72edbeb6-36b5-4e7b-9914-8601cc94f53d\",\"transaction_accounting_date\":\"2025-08-04T21:00:57Z\",\"transaction_accounting_id\":null,\"transaction_date\":\"2025-08-04T21:00:57Z\"}]}}';\n\nconst shinkansenCertificate = `-----BEGIN CERTIFICATE-----\nMIIEJzCCAw+gAwIBAgIUAI0UHF23lGC32Rq8ah82WodYO3MwDQYJKoZIhvcNAQEL\nBQAwgaIxCzAJBgNVBAYTAkNMMRYwFAYDVQQIDA1NZXRyb3BvbGl0YW5hMREwDwYD\nVQQHDAhTYW50aWFnbzETMBEGA1UECgwKU2hpbmthbnNlbjETMBEGA1UECwwKU2hp\nbmthbnNlbjETMBEGA1UEAwwKU2hpbmthbnNlbjEpMCcGCSqGSIb3DQEJARYaZGV2\ndGVzdEBzaGlua2Fuc2VuLmZpbmFuY2UwHhcNMjQwOTI0MjAzMjA1WhcNMjYwOTE0\nMjAzMjA1WjCBojELMAkGA1UEBhMCQ0wxFjAUBgNVBAgMDU1ldHJvcG9saXRhbmEx\nETAPBgNVBAcMCFNhbnRpYWdvMRMwEQYDVQQKDApTaGlua2Fuc2VuMRMwEQYDVQQL\nDApTaGlua2Fuc2VuMRMwEQYDVQQDDApTaGlua2Fuc2VuMSkwJwYJKoZIhvcNAQkB\nFhpkZXZ0ZXN0QHNoaW5rYW5zZW4uZmluYW5jZTCCASIwDQYJKoZIhvcNAQEBBQAD\nggEPADCCAQoCggEBAO01M3gv+xCbm5WPbnUq1i4Mo21NvF6COE0xjygFuSaPdLsj\n54ibHp+93L0eIDE1Bq7NplkB3xsg3K1NA0bI8jcYzBHTh+rXzVcsPkE2NZwMMEjR\nStMDUqPXZJMJBdkknVr0Gnj/Gf5fPw3s/+VbTBb20CvVjeqLmCnbqy3JFouVI/Qi\na9Xo8WV39C05EFW6dCik8OYasHyG0QcVLkoo5iMzqJWFVVszYizUr0zm1RiyTZpJ\nru89awTE6RgRlhWaNFNQfDY9eWVNkss3sJSwEiZVaV0WHNufJPJmWsdMzupcFq+5\n2OX8GnG+1QrQUhbDNaLvQJxuhOH2mVskuhHsuP0CAwEAAaNTMFEwHQYDVR0OBBYE\nFBOYr90CzfYBRoOCkUvMcN1SH7SLMB8GA1UdIwQYMBaAFBOYr90CzfYBRoOCkUvM\ncN1SH7SLMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAAwwOpUL\nJXTSKSRW2D0kFC6gPwVLO8wOynRZH8/6Oe1640+z8iqYnJsGDY9H5JN0lpLsVug1\nQIL3eOwEZYPKxHU/1D3eVXba4kZnN4UTVYmKWumlll9LWogIDQnIkRFDGCQhDOx5\n1E0qgOoHa3dLfgzV+g0+GE1h0PBnz3YJFSYMmPF4KO5CztQYDvkovthDyrZ3Zacr\nBzvPzSo5JakYzFWfL+8Q8dv7no/s8RPNBICKzAxLEoKbm089WBbKAI2aBcjQQ5b1\naxCcJ5InyQ/TSwG6Qwvh77lOe+hq7UTufJl/ZqBGfzMqY+vV5O4CqI3NERDEpWBk\n5DNIUi38zKxmVJA=\n-----END CERTIFICATE-----`;\n\nconst result = await verifySignature({\n  jws: shinkansenJws,\n  payload: shinkansenPayload,\n  trustedCertificates: [shinkansenCertificate]\n});\n\nconsole.log(result.isValid); // true\nconsole.log('Verified real Shinkansen signature successfully!');\n```\n\n## Features\n\nThis library implements both signature creation and verification according to Shinkansen specifications:\n\n**Signature Creation:**\n- JWS detached signatures with PS256 algorithm\n- Certificate embedding in `x5c` header (DER format)\n- Support for `b64: false` for unencoded payloads\n- Proper `Shinkansen-JWS-Signature` header format\n\n**Signature Verification:**\n- JWS (JSON Web Signature) with PS256 algorithm validation\n- X.509 certificate validation against trusted whitelists\n- Certificate expiration checks\n- Exact payload verification without JSON parsing/re-stringification\n\n## Development\n\n### Scripts\n\n- `npm run build` - Build the library\n- `npm run dev` - Build in watch mode\n- `npm test` - Run tests\n- `npm run test:watch` - Run tests in watch mode\n- `npm run lint` - Run ESLint\n- `npm run lint:fix` - Run ESLint with auto-fix\n- `npm run typecheck` - Type check without emitting files\n\n### Testing\n\nTests are written using Jest and located in `src/__tests__/`.\n\n```bash\nnpm test\n```\n\n## License\n\nMIT","readmeFilename":"README.md"}