{"_id":"@autoviatest/rscp-core","_rev":"4-ff5650d07f8ba3127fc90e9730dc1d3d","name":"@autoviatest/rscp-core","dist-tags":{"latest":"1.0.0-alpha.4","alpha":"1.0.0-alpha.3"},"versions":{"1.0.0-alpha.1":{"name":"@autoviatest/rscp-core","version":"1.0.0-alpha.1","keywords":["rscp","road-safety","certification","credentials","verifiable-credentials","protocol","delivery","driving"],"author":{"name":"RSCP Protocol Contributors"},"license":"Apache-2.0","_id":"@autoviatest/rscp-core@1.0.0-alpha.1","maintainers":[{"name":"autoviatest","email":"contact@autoviatest.com"}],"homepage":"https://rscp.org/docs/sdk","bugs":{"url":"https://github.com/rscp-protocol/rscp-sdk/issues"},"dist":{"shasum":"0e7bae0188947e61bab5083338cb9300e86627c5","tarball":"https://registry.npmjs.org/@autoviatest/rscp-core/-/rscp-core-1.0.0-alpha.1.tgz","fileCount":38,"integrity":"sha512-+3m0LzTUrwsNjxVZ8u9E9hvgFL/C55gMr31rIxKY1uoh5CWe/ffM1lAN6wNNlQzGFP7jGkfqluAftDgmFEF/PA==","signatures":[{"sig":"MEYCIQD1FpEWpz4jZMwtbS+UOA93ekUQHWd4ikZ6QxN0qkVKdAIhAP60BZjYITew+B1z9MpCLUUhrskSem9BqlfkmlIoA6VH","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":715281},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">=18.0.0"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./types":{"import":{"types":"./dist/types/index.d.ts","default":"./dist/types/index.mjs"},"require":{"types":"./dist/types/index.d.cts","default":"./dist/types/index.cjs"}},"./crypto":{"import":{"types":"./dist/crypto/index.d.ts","default":"./dist/crypto/index.mjs"},"require":{"types":"./dist/crypto/index.d.cts","default":"./dist/crypto/index.cjs"}},"./protocol":{"import":{"types":"./dist/protocol/index.d.ts","default":"./dist/protocol/index.mjs"},"require":{"types":"./dist/protocol/index.d.cts","default":"./dist/protocol/index.cjs"}},"./identifiers":{"import":{"types":"./dist/identifiers/index.d.ts","default":"./dist/identifiers/index.mjs"},"require":{"types":"./dist/identifiers/index.d.cts","default":"./dist/identifiers/index.cjs"}}},"gitHead":"a32ddb28d8534d48c79a7354420369ff99e2ee88","scripts":{"dev":"tsup --watch","lint":"eslint src/","test":"vitest run","build":"tsup","clean":"rm -rf dist","typecheck":"tsc --noEmit","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"autoviatest","email":"contact@autoviatest.com"},"repository":{"url":"git+https://github.com/rscp-protocol/rscp-sdk.git","type":"git","directory":"packages/core"},"_npmVersion":"10.9.4","description":"RSCP - Road Safety Certification Protocol Core Library","directories":{},"sideEffects":false,"_nodeVersion":"22.21.1","_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","vitest":"^1.6.0","typescript":"^5.4.0","@vitest/coverage-v8":"^1.6.0"},"_npmOperationalInternal":{"tmp":"tmp/rscp-core_1.0.0-alpha.1_1769940273974_0.09034141876098722","host":"s3://npm-registry-packages-npm-production"}},"1.0.0-alpha.2":{"name":"@autoviatest/rscp-core","version":"1.0.0-alpha.2","keywords":["rscp","road-safety","certification","credentials","verifiable-credentials","protocol","delivery","driving"],"author":{"name":"RSCP Protocol Contributors"},"license":"Apache-2.0","_id":"@autoviatest/rscp-core@1.0.0-alpha.2","maintainers":[{"name":"autoviatest","email":"contact@autoviatest.com"}],"homepage":"https://rscp.org/docs/sdk","bugs":{"url":"https://github.com/rscp-protocol/rscp-sdk/issues"},"dist":{"shasum":"a485b40b9e628e02287838d4cfe59bf1a3602ace","tarball":"https://registry.npmjs.org/@autoviatest/rscp-core/-/rscp-core-1.0.0-alpha.2.tgz","fileCount":38,"integrity":"sha512-nDs93k7sNvwYneawUaX0yRwbjJpxIn16SIKYMn6VLRZ9VlooySfVVIt/UR0Xd4O63vPBIvO7GnzXXCTpVvMaLw==","signatures":[{"sig":"MEUCIE+U+6AT/SsHcuJdVKVDFIdh2N5khGk5q8h/VnsbPanLAiEAjFh72EMPbCyJ5sJHTjMPOjlebqgmMGkisnqfcyFKqXI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":715407},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">=18.0.0"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./types":{"import":{"types":"./dist/types/index.d.ts","default":"./dist/types/index.mjs"},"require":{"types":"./dist/types/index.d.cts","default":"./dist/types/index.cjs"}},"./crypto":{"import":{"types":"./dist/crypto/index.d.ts","default":"./dist/crypto/index.mjs"},"require":{"types":"./dist/crypto/index.d.cts","default":"./dist/crypto/index.cjs"}},"./protocol":{"import":{"types":"./dist/protocol/index.d.ts","default":"./dist/protocol/index.mjs"},"require":{"types":"./dist/protocol/index.d.cts","default":"./dist/protocol/index.cjs"}},"./identifiers":{"import":{"types":"./dist/identifiers/index.d.ts","default":"./dist/identifiers/index.mjs"},"require":{"types":"./dist/identifiers/index.d.cts","default":"./dist/identifiers/index.cjs"}}},"gitHead":"4e83a11f246fccfc236431031628efd972b35241","scripts":{"dev":"tsup --watch","lint":"eslint src/","test":"vitest run","build":"tsup","clean":"rm -rf dist","typecheck":"tsc --noEmit","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"autoviatest","email":"contact@autoviatest.com"},"repository":{"url":"git+https://github.com/rscp-protocol/rscp-sdk.git","type":"git","directory":"packages/core"},"_npmVersion":"10.9.4","description":"RSCP - Road Safety Certification Protocol Core Library","directories":{},"sideEffects":false,"_nodeVersion":"22.21.1","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"tsup":"^8.0.0","vitest":"^1.6.0","typescript":"^5.4.0","@vitest/coverage-v8":"^1.6.0"},"_npmOperationalInternal":{"tmp":"tmp/rscp-core_1.0.0-alpha.2_1769940507457_0.08017598830099959","host":"s3://npm-registry-packages-npm-production"}},"1.0.0-alpha.3":{"name":"@autoviatest/rscp-core","version":"1.0.0-alpha.3","keywords":["rscp","road-safety","certification","credentials","verifiable-credentials","protocol","delivery","driving"],"author":{"name":"RSCP Protocol Contributors"},"license":"Apache-2.0","_id":"@autoviatest/rscp-core@1.0.0-alpha.3","maintainers":[{"name":"autoviatest","email":"contact@autoviatest.com"}],"homepage":"https://github.com/pawansahai/rscp-sdk#readme","bugs":{"url":"https://github.com/pawansahai/rscp-sdk/issues"},"dist":{"shasum":"477937126fbd5df4a43a470300a058c9f474d285","tarball":"https://registry.npmjs.org/@autoviatest/rscp-core/-/rscp-core-1.0.0-alpha.3.tgz","fileCount":38,"integrity":"sha512-M+dqk0zsJV25sUHZ11FkxWXTXyWD4DlrSENVNdk8kI+k+K7OGvi0RNnUA6ovjClhJ5YxFYgDLcdthNXKcUkmYg==","signatures":[{"sig":"MEUCIQCPevTaCBafbpzTN2yiO/Ui68opILHAjF98A2iBp2Qe3wIgYHDmTbTnk5gzXIywsz469Mxq2OamN4WmvYVyjAK3Pqg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":715421},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.mjs","engines":{"node":">=18.0.0"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./types":{"import":{"types":"./dist/types/index.d.ts","default":"./dist/types/index.mjs"},"require":{"types":"./dist/types/index.d.cts","default":"./dist/types/index.cjs"}},"./crypto":{"import":{"types":"./dist/crypto/index.d.ts","default":"./dist/crypto/index.mjs"},"require":{"types":"./dist/crypto/index.d.cts","default":"./dist/crypto/index.cjs"}},"./protocol":{"import":{"types":"./dist/protocol/index.d.ts","default":"./dist/protocol/index.mjs"},"require":{"types":"./dist/protocol/index.d.cts","default":"./dist/protocol/index.cjs"}},"./identifiers":{"import":{"types":"./dist/identifiers/index.d.ts","default":"./dist/identifiers/index.mjs"},"require":{"types":"./dist/identifiers/index.d.cts","default":"./dist/identifiers/index.cjs"}}},"gitHead":"7bf8e4864f0621541074016ab114dbccae4ad08e","scripts":{"dev":"tsup --watch","lint":"eslint src/","test":"vitest run","build":"tsup","clean":"rm -rf dist","typecheck":"tsc --noEmit","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"autoviatest","email":"contact@autoviatest.com"},"repository":{"url":"git+https://github.com/pawansahai/rscp-sdk.git","type":"git","directory":"packages/core"},"_npmVersion":"10.9.4","description":"RSCP - Road Safety Certification Protocol Core Library","directories":{},"sideEffects":false,"_nodeVersion":"22.21.1","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"tsup":"^8.0.0","vitest":"^1.6.0","typescript":"^5.4.0","@vitest/coverage-v8":"^1.6.0"},"_npmOperationalInternal":{"tmp":"tmp/rscp-core_1.0.0-alpha.3_1769940696258_0.5443872737239173","host":"s3://npm-registry-packages-npm-production"}},"1.0.0-alpha.4":{"name":"@autoviatest/rscp-core","version":"1.0.0-alpha.4","description":"RSCP - Road Safety Certification Protocol Core Library","type":"module","main":"./dist/index.js","module":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./types":{"import":{"types":"./dist/types/index.d.ts","default":"./dist/types/index.js"},"require":{"types":"./dist/types/index.d.cts","default":"./dist/types/index.cjs"}},"./identifiers":{"import":{"types":"./dist/identifiers/index.d.ts","default":"./dist/identifiers/index.js"},"require":{"types":"./dist/identifiers/index.d.cts","default":"./dist/identifiers/index.cjs"}},"./protocol":{"import":{"types":"./dist/protocol/index.d.ts","default":"./dist/protocol/index.js"},"require":{"types":"./dist/protocol/index.d.cts","default":"./dist/protocol/index.cjs"}},"./crypto":{"import":{"types":"./dist/crypto/index.d.ts","default":"./dist/crypto/index.js"},"require":{"types":"./dist/crypto/index.d.cts","default":"./dist/crypto/index.cjs"}}},"sideEffects":false,"keywords":["rscp","road-safety","certification","credentials","verifiable-credentials","protocol","delivery","driving"],"author":{"name":"RSCP Protocol Contributors"},"license":"Apache-2.0","repository":{"type":"git","url":"git+https://github.com/pawansahai/rscp-sdk.git","directory":"packages/core"},"homepage":"https://github.com/pawansahai/rscp-sdk#readme","bugs":{"url":"https://github.com/pawansahai/rscp-sdk/issues"},"devDependencies":{"@vitest/coverage-v8":"^1.6.0","tsup":"^8.0.0","typescript":"^5.4.0","vitest":"^1.6.0"},"engines":{"node":">=18.0.0"},"scripts":{"build":"tsup","dev":"tsup --watch","test":"vitest run","test:watch":"vitest","test:coverage":"vitest run --coverage","typecheck":"tsc --noEmit","clean":"rm -rf dist","lint":"eslint src/"},"_id":"@autoviatest/rscp-core@1.0.0-alpha.4","_integrity":"sha512-RHqmY7ySZCcaODtogPKYHx0luwvpEzhXxWxde3m0+7SnubyUDamPMKklkF9v3THlbLCTdKrN6bvMqFRE30S2XA==","_resolved":"/private/var/folders/h7/vt8c_83s52l0gkzd87w0k8d80000gn/T/43861655bf0eb0b482731e73f87a5ee4/autoviatest-rscp-core-1.0.0-alpha.4.tgz","_from":"file:autoviatest-rscp-core-1.0.0-alpha.4.tgz","_nodeVersion":"22.21.1","_npmVersion":"10.9.4","dist":{"integrity":"sha512-RHqmY7ySZCcaODtogPKYHx0luwvpEzhXxWxde3m0+7SnubyUDamPMKklkF9v3THlbLCTdKrN6bvMqFRE30S2XA==","shasum":"205bac6267528af03e097e0167c409d772c9825e","tarball":"https://registry.npmjs.org/@autoviatest/rscp-core/-/rscp-core-1.0.0-alpha.4.tgz","fileCount":39,"unpackedSize":733425,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIC3XQD8uQiEVuC68YKTqyJevesx3/lu8e3ItkKHmdJ+MAiEA8UTfb7AznS5ag7Z/xqeqshDNjay9mY0EUZWIRWFG0J4="}]},"_npmUser":{"name":"autoviatest","email":"contact@autoviatest.com"},"directories":{},"maintainers":[{"name":"autoviatest","email":"contact@autoviatest.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/rscp-core_1.0.0-alpha.4_1779494428304_0.8480350067566054"},"_hasShrinkwrap":false}},"time":{"created":"2026-02-01T10:04:33.916Z","modified":"2026-05-23T00:00:28.599Z","1.0.0-alpha.1":"2026-02-01T10:04:34.159Z","1.0.0-alpha.2":"2026-02-01T10:08:27.639Z","1.0.0-alpha.3":"2026-02-01T10:11:36.467Z","1.0.0-alpha.4":"2026-05-23T00:00:28.483Z"},"bugs":{"url":"https://github.com/pawansahai/rscp-sdk/issues"},"author":{"name":"RSCP Protocol Contributors"},"license":"Apache-2.0","homepage":"https://github.com/pawansahai/rscp-sdk#readme","keywords":["rscp","road-safety","certification","credentials","verifiable-credentials","protocol","delivery","driving"],"repository":{"type":"git","url":"git+https://github.com/pawansahai/rscp-sdk.git","directory":"packages/core"},"description":"RSCP - Road Safety Certification Protocol Core Library","maintainers":[{"name":"autoviatest","email":"contact@autoviatest.com"}],"readme":"# @autoviatest/rscp-core\n\nCore library for the Road Safety Certification Protocol (RSCP).\n\n[![npm version](https://img.shields.io/npm/v/@autoviatest/rscp-core.svg)](https://www.npmjs.com/package/@autoviatest/rscp-core)\n[![License](https://img.shields.io/npm/l/@autoviatest/rscp-core.svg)](https://github.com/pawansahai/rscp-sdk/blob/main/LICENSE)\n\n## Overview\n\nRSCP is a privacy-preserving, zero-trust protocol for road safety certifications. This core library provides:\n\n- **Identifier Generation**: Certificate numbers, verification codes, credential IDs\n- **Protocol Enforcement**: Zero-trust validation that prevents PII leakage\n- **Cryptographic Signing**: HMAC-SHA256 signatures for credential integrity\n- **Validation Utilities**: Check digit algorithms (ISO 7064, Damm)\n\n## Installation\n\n```bash\nnpm install @autoviatest/rscp-core\n# or\npnpm add @autoviatest/rscp-core\n# or\nyarn add @autoviatest/rscp-core\n```\n\n## Quick Start\n\n```typescript\nimport {\n  generateCertificateNumber,\n  generateVerificationCode,\n  enforcePublicAttributesOnly,\n  createSignedCredential,\n  generateSigningKey,\n} from '@autoviatest/rscp-core';\n\n// Generate identifiers\nconst certNumber = generateCertificateNumber({\n  year: 2026,\n  level: 'gold',\n  country: 'IN',\n  issuerCode: 'SWG',\n  serial: 1,\n});\n// → 'RS-2026-G-IN-SWG-000001-7'\n\nconst verificationCode = generateVerificationCode();\n// → 'A3B7K9M2'\n\n// Create public attributes (only these go to registry)\nconst publicAttributes = enforcePublicAttributesOnly({\n  givenName: 'Rahul',\n  familyName: 'Kumar',\n  level: 'gold',\n  validFrom: '2026-01-15',\n  validUntil: '2028-01-15',\n  // email: 'rahul@example.com', // Would throw ProtocolViolationError!\n});\n\n// Sign the credential\nconst signingKey = generateSigningKey();\nconst signed = await createSignedCredential({\n  credentialId: 'urn:rscp:credential:swg:2026:000001',\n  certificateNumber: certNumber,\n  verificationCode,\n  publicAttributes,\n  issuerCode: 'SWG',\n}, signingKey);\n```\n\n## Key Concepts\n\n### Zero-Trust Architecture\n\nRSCP enforces privacy at the protocol level, not by policy:\n\n```typescript\nimport { ALLOWED_PUBLIC_FIELDS, FORBIDDEN_FIELDS } from '@autoviatest/rscp-core';\n\nconsole.log(ALLOWED_PUBLIC_FIELDS);\n// ['givenName', 'familyName', 'level', 'validFrom', 'validUntil']\n\nconsole.log(FORBIDDEN_FIELDS);\n// ['email', 'phone', 'testScore', 'hazardScore', 'address', ...]\n```\n\nAny attempt to store forbidden fields in the registry throws a `ProtocolViolationError`.\n\n### Certificate Number Format\n\n```\nRS-2026-G-IN-SWG-000001-7\n│  │    │ │  │   │      └─ ISO 7064 check digit\n│  │    │ │  │   └──────── 6-digit serial number\n│  │    │ │  └──────────── 3-char issuer code\n│  │    │ └─────────────── 2-char country (ISO 3166-1)\n│  │    └───────────────── Level: B/S/G (Bronze/Silver/Gold)\n│  └────────────────────── 4-digit year\n└───────────────────────── Protocol prefix\n```\n\n### Verification Code Format\n\n```\nA3B7-K9M2\n│       └─ Damm check digit\n└──────── 7 random characters\n```\n\n- Uses 32-character alphabet (excludes I, O, 0, 1)\n- Cryptographically secure random generation\n- Damm algorithm detects all single-digit errors\n\n### Certification Levels\n\n| Level | Training | Min Score | Validity |\n|-------|----------|-----------|----------|\n| Bronze | 2 hours | ≥70% | 1 year |\n| Silver | 4 hours | ≥80% | 1 year |\n| Gold | 8 hours | ≥85% | 2 years |\n\n## API Reference\n\n### Identifiers\n\n```typescript\n// Certificate numbers\ngenerateCertificateNumber(options): string\nparseCertificateNumber(certNumber): CertificateNumberParts | null\nvalidateCertificateNumber(certNumber): boolean\n\n// Verification codes\ngenerateVerificationCode(): string\nformatVerificationCode(code): string  // 'A3B7K9M2' → 'A3B7-K9M2'\nvalidateVerificationCode(code): boolean\n\n// Credential IDs\ngenerateCredentialId(issuerCode, year, serial): string\nparseCredentialId(credentialId): CredentialIdParts | null\n\n// DIDs\ngenerateIssuerDid(issuerCode): string  // 'did:rscp:issuer:swg'\ngenerateHolderDid(userId): string      // 'did:rscp:holder:{uuid}'\n```\n\n### Protocol Enforcement\n\n```typescript\n// Main enforcement function\nenforcePublicAttributesOnly(data): RSCPPublicAttributes\n// Throws: ProtocolViolationError, MissingAttributeError, AttributeValidationError\n\n// Field checking\nisForbiddenField(field): boolean\nisAllowedField(field): boolean\ndetectForbiddenFields(data): string[]\n```\n\n### Cryptography\n\n```typescript\n// Key management\ngenerateSigningKey(): string\nisValidSigningKey(key): boolean\n\n// Signing\nsignPayload(payload, key): Promise<string>\nverifySignature(payload, signature, key): Promise<SignatureVerificationResult>\ncreateSignedCredential(input, key): Promise<SignedCredential>\n\n// Hashing\ngenerateCredentialHash(payload): Promise<string>\nverifyCredentialHash(payload, hash): Promise<boolean>\n\n// Secure random\ngetRandomBytes(length): Uint8Array\ngetSecureRandomInt(max): number\ngetRandomString(length, alphabet): string\n```\n\n### Utilities\n\n```typescript\n// Dates\ngetExpiryDate(level, fromDate?): string\nisExpired(validUntil): boolean\ndaysUntilExpiry(validUntil): number\n\n// Levels\ncompareLevels(a, b): -1 | 0 | 1\nmeetsLevelRequirement(actual, minimum): boolean\ngetLevelMinScore(level): number\n\n// Scores\ndetermineLevelFromScores(testScore, hazardScore?): CertificationLevel | null\n```\n\n## Builder API\n\nFor fluent credential creation:\n\n```typescript\nimport { RSCP } from '@autoviatest/rscp-core';\n\nconst credential = RSCP.credential()\n  .issuer('SWG', 'IN')\n  .holder('Rahul', 'Kumar')\n  .level('gold')\n  .validFor({ years: 2 })\n  .serial(1)\n  .build();\n```\n\n## Error Types\n\n```typescript\nimport {\n  ProtocolViolationError,\n  MissingAttributeError,\n  AttributeValidationError,\n} from '@autoviatest/rscp-core';\n\ntry {\n  enforcePublicAttributesOnly({ email: 'test@example.com' });\n} catch (e) {\n  if (e instanceof ProtocolViolationError) {\n    console.log(e.field); // 'email'\n    console.log(e.code);  // 'PROTOCOL_VIOLATION'\n  }\n}\n```\n\n## Requirements\n\n- Node.js >= 18.0.0 (for Web Crypto API)\n- Modern browsers with Web Crypto API support\n\n## Related Packages\n\n- `@rscp/registry-client` - HTTP client for RSCP registry\n- `@rscp/react` - React hooks and components\n- `@rscp/node` - Node.js optimizations\n\n## License\n\nApache-2.0 - see [LICENSE](../../LICENSE) for details.\n\n## Links\n\n- [Documentation](https://rscp.org/docs)\n- [Protocol Specification](https://rscp.org/spec)\n- [GitHub](https://github.com/pawansahai/rscp-sdk)\n","readmeFilename":"README.md"}