dosipas-ts 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +216 -0
  3. package/dist/decoder.d.ts +16 -0
  4. package/dist/decoder.d.ts.map +1 -0
  5. package/dist/decoder.js +265 -0
  6. package/dist/decoder.js.map +1 -0
  7. package/dist/encoder.d.ts +16 -0
  8. package/dist/encoder.d.ts.map +1 -0
  9. package/dist/encoder.js +171 -0
  10. package/dist/encoder.js.map +1 -0
  11. package/dist/fixtures.d.ts +14 -0
  12. package/dist/fixtures.d.ts.map +1 -0
  13. package/dist/fixtures.js +68 -0
  14. package/dist/fixtures.js.map +1 -0
  15. package/dist/index.d.ts +10 -0
  16. package/dist/index.d.ts.map +1 -0
  17. package/dist/index.js +7 -0
  18. package/dist/index.js.map +1 -0
  19. package/dist/oids.d.ts +28 -0
  20. package/dist/oids.d.ts.map +1 -0
  21. package/dist/oids.js +43 -0
  22. package/dist/oids.js.map +1 -0
  23. package/dist/schemas.d.ts +11 -0
  24. package/dist/schemas.d.ts.map +1 -0
  25. package/dist/schemas.js +17 -0
  26. package/dist/schemas.js.map +1 -0
  27. package/dist/signature-fixtures.d.ts +110 -0
  28. package/dist/signature-fixtures.d.ts.map +1 -0
  29. package/dist/signature-fixtures.js +142 -0
  30. package/dist/signature-fixtures.js.map +1 -0
  31. package/dist/signature-utils.d.ts +29 -0
  32. package/dist/signature-utils.d.ts.map +1 -0
  33. package/dist/signature-utils.js +201 -0
  34. package/dist/signature-utils.js.map +1 -0
  35. package/dist/signed-data.d.ts +32 -0
  36. package/dist/signed-data.d.ts.map +1 -0
  37. package/dist/signed-data.js +87 -0
  38. package/dist/signed-data.js.map +1 -0
  39. package/dist/types.d.ts +273 -0
  40. package/dist/types.d.ts.map +1 -0
  41. package/dist/types.js +8 -0
  42. package/dist/types.js.map +1 -0
  43. package/dist/verifier.d.ts +67 -0
  44. package/dist/verifier.d.ts.map +1 -0
  45. package/dist/verifier.js +309 -0
  46. package/dist/verifier.js.map +1 -0
  47. package/package.json +46 -0
  48. package/schemas/uic-barcode/intercode6.schema.json +204 -0
  49. package/schemas/uic-barcode/uicBarcodeHeader_v1.schema.json +376 -0
  50. package/schemas/uic-barcode/uicBarcodeHeader_v2.schema.json +484 -0
  51. package/schemas/uic-barcode/uicRailTicketData_v1.schema.json +31507 -0
  52. package/schemas/uic-barcode/uicRailTicketData_v2.schema.json +31623 -0
  53. package/schemas/uic-barcode/uicRailTicketData_v3.schema.json +32729 -0
@@ -0,0 +1,171 @@
1
+ /**
2
+ * Encoder for UIC barcode tickets with Intercode 6 extensions.
3
+ *
4
+ * Encodes a {@link UicBarcodeTicketInput} object into a hex string suitable
5
+ * for embedding in an Aztec barcode.
6
+ */
7
+ import { SchemaCodec, SchemaBuilder, BitBuffer, } from 'asn1-per-ts';
8
+ import { HEADER_SCHEMAS, RAIL_TICKET_SCHEMAS, INTERCODE_SCHEMAS } from './schemas';
9
+ // ---------------------------------------------------------------------------
10
+ // Codec caches (separate from decoder to avoid coupling)
11
+ // ---------------------------------------------------------------------------
12
+ const headerCodecCache = new Map();
13
+ const ticketCodecCache = new Map();
14
+ let intercodeIssuingCodec;
15
+ let intercodeDynamicCodec;
16
+ function getHeaderCodec(version) {
17
+ let codec = headerCodecCache.get(version);
18
+ if (codec)
19
+ return codec;
20
+ const schemas = HEADER_SCHEMAS[version];
21
+ if (!schemas)
22
+ throw new Error(`No schema for header v${version}`);
23
+ codec = new SchemaCodec(schemas.UicBarcodeHeader);
24
+ headerCodecCache.set(version, codec);
25
+ return codec;
26
+ }
27
+ function getTicketCodecs(version) {
28
+ let codecs = ticketCodecCache.get(version);
29
+ if (codecs)
30
+ return codecs;
31
+ const schemas = RAIL_TICKET_SCHEMAS[version];
32
+ if (!schemas)
33
+ throw new Error(`No schema for FCB${version}`);
34
+ codecs = SchemaBuilder.buildAll(schemas);
35
+ ticketCodecCache.set(version, codecs);
36
+ return codecs;
37
+ }
38
+ function getIntercodeIssuingCodec() {
39
+ if (intercodeIssuingCodec)
40
+ return intercodeIssuingCodec;
41
+ intercodeIssuingCodec = new SchemaCodec(INTERCODE_SCHEMAS.IntercodeIssuingData);
42
+ intercodeDynamicCodec = new SchemaCodec(INTERCODE_SCHEMAS.IntercodeDynamicData);
43
+ return intercodeIssuingCodec;
44
+ }
45
+ function getIntercodeDynamicCodec() {
46
+ if (intercodeDynamicCodec)
47
+ return intercodeDynamicCodec;
48
+ getIntercodeIssuingCodec();
49
+ return intercodeDynamicCodec;
50
+ }
51
+ function toHex(bytes) {
52
+ return Array.from(bytes).map(b => b.toString(16).padStart(2, '0')).join('');
53
+ }
54
+ // ---------------------------------------------------------------------------
55
+ // Public API
56
+ // ---------------------------------------------------------------------------
57
+ /**
58
+ * Encode a UIC barcode ticket to a hex string.
59
+ *
60
+ * @param input - The ticket data to encode.
61
+ * @returns Hex string of the encoded barcode payload.
62
+ */
63
+ export function encodeTicket(input) {
64
+ const headerVersion = input.headerVersion ?? 2;
65
+ const fcbVersion = input.fcbVersion ?? 2;
66
+ // Step 1: Encode the rail ticket data
67
+ const railTicketBytes = encodeRailTicket(fcbVersion, input);
68
+ // Step 2: Build the data sequence
69
+ const dataSequence = [
70
+ { dataFormat: `FCB${fcbVersion}`, data: railTicketBytes },
71
+ ];
72
+ // Step 3: Build Level 2 data (Intercode dynamic)
73
+ let level2Data;
74
+ if (input.dynamicData) {
75
+ const dynamicBytes = getIntercodeDynamicCodec().encode({
76
+ dynamicContentDay: input.dynamicData.dynamicContentDay ?? 0,
77
+ dynamicContentTime: input.dynamicData.dynamicContentTime,
78
+ dynamicContentUTCOffset: input.dynamicData.dynamicContentUTCOffset,
79
+ dynamicContentDuration: input.dynamicData.dynamicContentDuration,
80
+ });
81
+ level2Data = {
82
+ dataFormat: `_${input.dynamicData.rics}.ID1`,
83
+ data: dynamicBytes,
84
+ };
85
+ }
86
+ // Step 4: Build the full header structure
87
+ const headerData = {
88
+ format: `U${headerVersion}`,
89
+ level2SignedData: {
90
+ level1Data: {
91
+ securityProviderNum: input.securityProviderNum,
92
+ keyId: input.keyId,
93
+ dataSequence,
94
+ level1KeyAlg: input.level1KeyAlg,
95
+ level2KeyAlg: input.level2KeyAlg,
96
+ level1SigningAlg: input.level1SigningAlg,
97
+ level2SigningAlg: input.level2SigningAlg,
98
+ level2PublicKey: input.level2PublicKey,
99
+ },
100
+ level1Signature: input.level1Signature,
101
+ level2Data,
102
+ },
103
+ level2Signature: input.level2Signature,
104
+ };
105
+ // Step 5: Encode the header
106
+ const codec = getHeaderCodec(headerVersion);
107
+ return codec.encodeToHex(headerData);
108
+ }
109
+ /**
110
+ * Encode a UIC barcode ticket to bytes.
111
+ *
112
+ * @param input - The ticket data to encode.
113
+ * @returns Uint8Array of the encoded barcode payload.
114
+ */
115
+ export function encodeTicketToBytes(input) {
116
+ const hex = encodeTicket(input);
117
+ return new Uint8Array(hex.match(/.{1,2}/g).map(b => parseInt(b, 16)));
118
+ }
119
+ // ---------------------------------------------------------------------------
120
+ // Internal encoding helpers
121
+ // ---------------------------------------------------------------------------
122
+ function encodeRailTicket(fcbVersion, input) {
123
+ const iss = input.railTicket.issuingDetail;
124
+ // Build extension if intercode issuing data present
125
+ let extension;
126
+ if (iss.intercodeIssuing) {
127
+ const rics = iss.securityProviderNum ?? input.securityProviderNum ?? 0;
128
+ const issuingBytes = getIntercodeIssuingCodec().encode({
129
+ intercodeVersion: iss.intercodeIssuing.intercodeVersion ?? 1,
130
+ intercodeInstanciation: iss.intercodeIssuing.intercodeInstanciation ?? 1,
131
+ networkId: iss.intercodeIssuing.networkId,
132
+ productRetailer: iss.intercodeIssuing.productRetailer,
133
+ });
134
+ extension = {
135
+ extensionId: `_${rics}II1`,
136
+ extensionData: issuingBytes,
137
+ };
138
+ }
139
+ // Build the issuing detail
140
+ const issuingDetail = {
141
+ securityProviderNum: iss.securityProviderNum,
142
+ issuerNum: iss.issuerNum,
143
+ issuingYear: iss.issuingYear,
144
+ issuingDay: iss.issuingDay,
145
+ issuingTime: iss.issuingTime,
146
+ issuerName: iss.issuerName,
147
+ specimen: iss.specimen ?? false,
148
+ securePaperTicket: iss.securePaperTicket ?? false,
149
+ activated: iss.activated ?? true,
150
+ currency: iss.currency,
151
+ currencyFract: iss.currencyFract,
152
+ issuerPNR: iss.issuerPNR,
153
+ extension,
154
+ };
155
+ // Build transport documents
156
+ const transportDocument = input.railTicket.transportDocument?.map((doc) => ({
157
+ ticket: { [doc.ticketType]: doc.ticket },
158
+ }));
159
+ // Build the full rail ticket data
160
+ const ticketData = {
161
+ issuingDetail,
162
+ travelerDetail: input.railTicket.travelerDetail,
163
+ transportDocument,
164
+ controlDetail: input.railTicket.controlDetail,
165
+ };
166
+ const codecs = getTicketCodecs(fcbVersion);
167
+ const buf = BitBuffer.alloc();
168
+ codecs.UicRailTicketData.encode(buf, ticketData);
169
+ return buf.toUint8Array();
170
+ }
171
+ //# sourceMappingURL=encoder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"encoder.js","sourceRoot":"","sources":["../src/encoder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Example fixture hex data for testing and demo purposes.
3
+ */
4
+ /** Sample UIC barcode header with FCB2 rail ticket + Intercode 6 extensions. */
5
+ export declare const SAMPLE_TICKET_HEX: string;
6
+ /** SNCF TER ticket barcode. */
7
+ export declare const SNCF_TER_TICKET_HEX: string;
8
+ /** Soléa ticket barcode. */
9
+ export declare const SOLEA_TICKET_HEX: string;
10
+ /** CTS ticket barcode. */
11
+ export declare const CTS_TICKET_HEX: string;
12
+ /** Grand Est U1 barcode with FCB3 rail ticket data. */
13
+ export declare const GRAND_EST_U1_FCB3_HEX: string;
14
+ //# sourceMappingURL=fixtures.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fixtures.d.ts","sourceRoot":"","sources":["../src/fixtures.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,gFAAgF;AAChF,eAAO,MAAM,iBAAiB,QAUY,CAAC;AAE3C,+BAA+B;AAC/B,eAAO,MAAM,mBAAmB,QAOa,CAAC;AAE9C,4BAA4B;AAC5B,eAAO,MAAM,gBAAgB,QAakC,CAAC;AAEhE,0BAA0B;AAC1B,eAAO,MAAM,cAAc,QAcP,CAAC;AAErB,uDAAuD;AACvD,eAAO,MAAM,qBAAqB,QAe1B,CAAC"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * Example fixture hex data for testing and demo purposes.
3
+ */
4
+ /** Sample UIC barcode header with FCB2 rail ticket + Intercode 6 extensions. */
5
+ export const SAMPLE_TICKET_HEX = '815563dd8e760000808246870992a911080e76043c3e32117d9b760ce4c96216' +
6
+ '924a122af880102068083002810123e4567e89b12d3a45642661417400012a00' +
7
+ '23844001007270e0473b00010048010040c940245a009f102006a00180004010' +
8
+ '008000004154324671e81808384154324671e81808384154324671e820181108' +
9
+ '1aa322ebf4721c09e26194e7699f4323029190a43a0c2bbac8bfa1e31493bcb7' +
10
+ '3a00888888888888888888888888888888888888888888888888888888888888' +
11
+ '8888888888888888888888888888888888888888888888888888888888888888' +
12
+ '88884df66dd8335d26231063ba4f9a0096040222222222222222222222222222' +
13
+ '2222222222222222222222222222222222222222222222222222222222222222' +
14
+ '22222222222222222222222222222222222220';
15
+ /** SNCF TER ticket barcode. */
16
+ export const SNCF_TER_TICKET_HEX = '01556550004a2000000824687099c04a390100944142a84e4195c6a5264b11d4' +
17
+ '92509158c00814182618330404383a14fb0b5aae64b9cad934a4d30004015038' +
18
+ '012a8908a9ea09092988a12908a98988a849e9288b172808244005008d08201a' +
19
+ '0f999b302808410008802144cc44010a268404000c32c350045a0b8008001012' +
20
+ '0000100a0062a30b934b3102737b936b0b6045f62c5c37a751883186a8c4001' +
21
+ '040400000171816010a3d38d26cd5ef910257206b6e96ffa56d986faf22010a3' +
22
+ '342b79c99cb27c12f8e412ed4a52f1c347ff32480';
23
+ /** Soléa ticket barcode. */
24
+ export const SOLEA_TICKET_HEX = '815565dff8e76000380824687099c04b390101cec142a8864195c6a5264b1324' +
25
+ '9250915fc4040400404080494a6b305cd2fb8c2db1b572cdc2dcd91be45ad1c3' +
26
+ '164b5c6664c16b072dd8e4c395a32c6d3100014121c1831311931b2b116b2999' +
27
+ 'a32969a32b2b216b09a18b196991c9c19333333189ab1993109500124204006e' +
28
+ 'c90be41900fac0240100607a1a31fe5d80801e103120566f796167652031204865' +
29
+ '757265000004154324671e81808384154324671e81808384154324671e8201810' +
30
+ '4154324671e8201811081fcaced2780ddfbb1a882f7fc5ca8a452a2dacc95e9ab' +
31
+ 'c048beade76918facdde050aa3f895a398228110806017d045a5144200d029ee9' +
32
+ '2860fba45728e8b5cd561375660482b34af855f3401102860f8d89d2f470932' +
33
+ '20fc20acf2d98c46a82f399aa2495c6f1b4a20ed53942d8246890d88b3027' +
34
+ '9b92ec7a7a79ef87caedbd7668dfd79e5153ff842318220110126f9ec96c79' +
35
+ '1e8580ab939971ba9670bcfb2d40b00941a0dc37cbb97b33bd0a01100a4e94' +
36
+ 'a879c92ff5381fa024759d6d0bb24e6e911455a98ce5ece06aceae7b018';
37
+ /** CTS ticket barcode. */
38
+ export const CTS_TICKET_HEX = '815565dff8e76000380824687099c04fb90101cec142a8944195c6a5264b1324' +
39
+ '9250915fc0048100004080494a6b305ce6fb96edb2b9c2c9aadc9859385ad32b' +
40
+ '972b5cb964e16e170cb2e4ccd333572c9980014121a9b189a191b1b32169b9a9' +
41
+ 'a9c969a333230969c9931b216b3321c9c9a199a9c9818b21b89500124224806e' +
42
+ 'c929042400590024010064a012321a6102006a00020030010008000350531311' +
43
+ '548814d2535413114801022214000004154324671e81808384154324671e8180' +
44
+ '8384154324671e82018104154324671e8201811081479ea31897b4f48c080746' +
45
+ '2750e9fdb93688c1388ba7dd2036ecbf044e226cb9050aa43095a41823011080' +
46
+ '44ba579cec8a293c2d908fa4f6171b181595b9f61dccfae6dd2f8dfae4f3e5b9' +
47
+ '0110807a3419bd5b3be394d21db00e46f98f864e4c91df2b88d673904a1e0fcc' +
48
+ 'd951a58246890d88c302b9b92ec7d39aee7d3961e78b7f5e59d775cfbc5507c8' +
49
+ '02318220110300b057de0e2b8cdf149e66f41156ac0d0ee7ab099057aed94799' +
50
+ '6a7db796f3201102ee60c4eb0157abe4db761b005f01f13a7ffc6e7b75986515' +
51
+ 'deb3484d3cc1b600';
52
+ /** Grand Est U1 barcode with FCB3 rail ticket data. */
53
+ export const GRAND_EST_U1_FCB3_HEX = '815563df8e76000100824687099c049390101cec0c51517422fb36ec19c992c4' +
54
+ 'df24942457f101643e8010101262aacc5732617dce1c6e313270d16e66b9732d' +
55
+ '68d71645ae1b64cab5a6268c3138c2e58b3cd8c010212b00005048c462626066' +
56
+ 'c6ccc85a7068626c5a686a72c65ac270ca605a606cc466686462c66cc2ca7225' +
57
+ '400490800013b67120500010090040192803328b5ca0a0020000800200060010' +
58
+ '00004154324671e81808384154324671e81808384154324671e8201810415432' +
59
+ '4671e8201812d982c98098303954324671e81008304154324671e81808381a10' +
60
+ '0020271e2edb56938886ef244fcc81bf6e5697aca1a2e6a59e1aa7ee43cb3e26' +
61
+ '465151f2acf79d9312c632989a2d5c48238279ad1c0118c7e4668bc17a70cc6d' +
62
+ '4e4a3982281103e3be4fe0e624718807fff3510946c752d00f4e835c795a9ad8' +
63
+ '4e4ff0712f55e8110804e93751b844b825e4970e3f4845240b47a32ca9ae8a29' +
64
+ 'e9f8fd83007932014fe8246890d885300b878709390a2a6cf023982281101dd7' +
65
+ '58964d38e56487095e74b9284307b673a3e9bbd671c028f1f891696947230110' +
66
+ '8074b89dc1b249e15a958e0b1a4f7b07f4c1ec4d64a8e8f96bc17abe3bdd54c9' +
67
+ 'd300';
68
+ //# sourceMappingURL=fixtures.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fixtures.js","sourceRoot":"","sources":["../src/fixtures.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,gFAAgF;AAChF,MAAM,CAAC,MAAM,iBAAiB,GAC5B,kEAAkE;IAClE,kEAAkE;IAClE,kEAAkE;IAClE,kEAAkE;IAClE,kEAAkE;IAClE,kEAAkE;IAClE,kEAAkE;IAClE,kEAAkE;IAClE,kEAAkE;IAClE,wCAAwC,CAAC;AAE3C,+BAA+B;AAC/B,MAAM,CAAC,MAAM,mBAAmB,GAC9B,kEAAkE;IAClE,kEAAkE;IAClE,kEAAkE;IAClE,kEAAkE;IAClE,iEAAiE;IACjE,kEAAkE;IAClE,2CAA2C,CAAC;AAE9C,4BAA4B;AAC5B,MAAM,CAAC,MAAM,gBAAgB,GAC3B,kEAAkE;IAClE,kEAAkE;IAClE,kEAAkE;IAClE,kEAAkE;IAClE,oEAAoE;IACpE,mEAAmE;IACnE,mEAAmE;IACnE,mEAAmE;IACnE,iEAAiE;IACjE,+DAA+D;IAC/D,gEAAgE;IAChE,gEAAgE;IAChE,6DAA6D,CAAC;AAEhE,0BAA0B;AAC1B,MAAM,CAAC,MAAM,cAAc,GACzB,kEAAkE;IAClE,kEAAkE;IAClE,kEAAkE;IAClE,kEAAkE;IAClE,kEAAkE;IAClE,kEAAkE;IAClE,kEAAkE;IAClE,kEAAkE;IAClE,kEAAkE;IAClE,kEAAkE;IAClE,kEAAkE;IAClE,kEAAkE;IAClE,kEAAkE;IAClE,kBAAkB,CAAC;AAErB,uDAAuD;AACvD,MAAM,CAAC,MAAM,qBAAqB,GAChC,kEAAkE;IAClE,kEAAkE;IAClE,kEAAkE;IAClE,kEAAkE;IAClE,kEAAkE;IAClE,kEAAkE;IAClE,kEAAkE;IAClE,kEAAkE;IAClE,kEAAkE;IAClE,kEAAkE;IAClE,kEAAkE;IAClE,kEAAkE;IAClE,kEAAkE;IAClE,kEAAkE;IAClE,MAAM,CAAC"}
@@ -0,0 +1,10 @@
1
+ export { decodeTicket, decodeTicketFromBytes } from './decoder';
2
+ export { encodeTicket, encodeTicketToBytes } from './encoder';
3
+ export { verifySignatures, verifyLevel1Signature, verifyLevel2Signature, findKeyInXml, parseKeysXml } from './verifier';
4
+ export { extractSignedData } from './signed-data';
5
+ export { SAMPLE_TICKET_HEX, SNCF_TER_TICKET_HEX, SOLEA_TICKET_HEX, CTS_TICKET_HEX, GRAND_EST_U1_FCB3_HEX } from './fixtures';
6
+ export { SNCF_TER_SIGNATURES, SOLEA_SIGNATURES, CTS_SIGNATURES } from './signature-fixtures';
7
+ export type { UicBarcodeTicket, SecurityInfo, DataBlock, RailTicketData, IssuingDetail, ExtensionData, IntercodeIssuingData, IntercodeDynamicData, RetailChannel, ProductRetailerData, TravelerDetail, TravelerInfo, CustomerStatus, TransportDocumentEntry, ControlDetail, CardReference, TicketLink, UicBarcodeTicketInput, RailTicketInput, IssuingDetailInput, IntercodeIssuingDataInput, IntercodeDynamicDataInput, TravelerDetailInput, TransportDocumentInput, SignatureVerificationResult, SignatureLevelResult, VerifyOptions, Level1KeyProvider, } from './types';
8
+ export type { UicPublicKeyEntry } from './verifier';
9
+ export type { ExtractedSignedData } from './signed-data';
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AACxH,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAC7H,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE7F,YAAY,EACV,gBAAgB,EAChB,YAAY,EACZ,SAAS,EACT,cAAc,EACd,aAAa,EACb,aAAa,EACb,oBAAoB,EACpB,oBAAoB,EACpB,aAAa,EACb,mBAAmB,EACnB,cAAc,EACd,YAAY,EACZ,cAAc,EACd,sBAAsB,EACtB,aAAa,EACb,aAAa,EACb,UAAU,EACV,qBAAqB,EACrB,eAAe,EACf,kBAAkB,EAClB,yBAAyB,EACzB,yBAAyB,EACzB,mBAAmB,EACnB,sBAAsB,EACtB,2BAA2B,EAC3B,oBAAoB,EACpB,aAAa,EACb,iBAAiB,GAClB,MAAM,SAAS,CAAC;AAEjB,YAAY,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AACpD,YAAY,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,7 @@
1
+ export { decodeTicket, decodeTicketFromBytes } from './decoder';
2
+ export { encodeTicket, encodeTicketToBytes } from './encoder';
3
+ export { verifySignatures, verifyLevel1Signature, verifyLevel2Signature, findKeyInXml, parseKeysXml } from './verifier';
4
+ export { extractSignedData } from './signed-data';
5
+ export { SAMPLE_TICKET_HEX, SNCF_TER_TICKET_HEX, SOLEA_TICKET_HEX, CTS_TICKET_HEX, GRAND_EST_U1_FCB3_HEX } from './fixtures';
6
+ export { SNCF_TER_SIGNATURES, SOLEA_SIGNATURES, CTS_SIGNATURES } from './signature-fixtures';
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AACxH,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAC7H,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC"}
package/dist/oids.d.ts ADDED
@@ -0,0 +1,28 @@
1
+ /**
2
+ * OID-to-algorithm mapping for UIC barcode signature verification.
3
+ *
4
+ * Maps ASN.1 Object Identifiers to their corresponding signing/key algorithms
5
+ * as specified in the UIC barcode standard.
6
+ */
7
+ export interface SigningAlgorithm {
8
+ hash: string;
9
+ type: 'ECDSA' | 'DSA' | 'RSA';
10
+ }
11
+ export interface KeyAlgorithm {
12
+ type: 'EC' | 'RSA';
13
+ curve?: string;
14
+ }
15
+ /** OID → signing algorithm (hash + type). */
16
+ export declare const SIGNING_ALGORITHMS: Record<string, SigningAlgorithm>;
17
+ /** OID → key algorithm (type + optional curve name). */
18
+ export declare const KEY_ALGORITHMS: Record<string, KeyAlgorithm>;
19
+ /** Get signing algorithm details for an OID, or undefined if unknown. */
20
+ export declare function getSigningAlgorithm(oid: string): SigningAlgorithm | undefined;
21
+ /** Get key algorithm details for an OID, or undefined if unknown. */
22
+ export declare function getKeyAlgorithm(oid: string): KeyAlgorithm | undefined;
23
+ /**
24
+ * Get the component byte length for a given curve name.
25
+ * Used for DER-to-raw signature conversion.
26
+ */
27
+ export declare function curveComponentLength(curve: string): number;
28
+ //# sourceMappingURL=oids.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oids.d.ts","sourceRoot":"","sources":["../src/oids.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,OAAO,GAAG,KAAK,GAAG,KAAK,CAAC;CAC/B;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,IAAI,GAAG,KAAK,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,6CAA6C;AAC7C,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAO/D,CAAC;AAEF,wDAAwD;AACxD,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAKvD,CAAC;AAEF,yEAAyE;AACzE,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS,CAE7E;AAED,qEAAqE;AACrE,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAErE;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAO1D"}
package/dist/oids.js ADDED
@@ -0,0 +1,43 @@
1
+ /**
2
+ * OID-to-algorithm mapping for UIC barcode signature verification.
3
+ *
4
+ * Maps ASN.1 Object Identifiers to their corresponding signing/key algorithms
5
+ * as specified in the UIC barcode standard.
6
+ */
7
+ /** OID → signing algorithm (hash + type). */
8
+ export const SIGNING_ALGORITHMS = {
9
+ '1.2.840.10045.4.3.2': { hash: 'SHA-256', type: 'ECDSA' },
10
+ '1.2.840.10045.4.3.3': { hash: 'SHA-384', type: 'ECDSA' },
11
+ '1.2.840.10045.4.3.4': { hash: 'SHA-512', type: 'ECDSA' },
12
+ '2.16.840.1.101.3.4.3.1': { hash: 'SHA-224', type: 'DSA' },
13
+ '2.16.840.1.101.3.4.3.2': { hash: 'SHA-256', type: 'DSA' },
14
+ '1.2.840.113549.1.1.11': { hash: 'SHA-256', type: 'RSA' },
15
+ };
16
+ /** OID → key algorithm (type + optional curve name). */
17
+ export const KEY_ALGORITHMS = {
18
+ '1.2.840.10045.3.1.7': { curve: 'P-256', type: 'EC' },
19
+ '1.3.132.0.34': { curve: 'P-384', type: 'EC' },
20
+ '1.3.132.0.35': { curve: 'P-521', type: 'EC' },
21
+ '1.2.840.113549.1.1.1': { type: 'RSA' },
22
+ };
23
+ /** Get signing algorithm details for an OID, or undefined if unknown. */
24
+ export function getSigningAlgorithm(oid) {
25
+ return SIGNING_ALGORITHMS[oid];
26
+ }
27
+ /** Get key algorithm details for an OID, or undefined if unknown. */
28
+ export function getKeyAlgorithm(oid) {
29
+ return KEY_ALGORITHMS[oid];
30
+ }
31
+ /**
32
+ * Get the component byte length for a given curve name.
33
+ * Used for DER-to-raw signature conversion.
34
+ */
35
+ export function curveComponentLength(curve) {
36
+ switch (curve) {
37
+ case 'P-256': return 32;
38
+ case 'P-384': return 48;
39
+ case 'P-521': return 66;
40
+ default: throw new Error(`Unknown curve: ${curve}`);
41
+ }
42
+ }
43
+ //# sourceMappingURL=oids.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oids.js","sourceRoot":"","sources":["../src/oids.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAYH,6CAA6C;AAC7C,MAAM,CAAC,MAAM,kBAAkB,GAAqC;IAClE,qBAAqB,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE;IACzD,qBAAqB,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE;IACzD,qBAAqB,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE;IACzD,wBAAwB,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE;IAC1D,wBAAwB,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE;IAC1D,uBAAuB,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE;CAC1D,CAAC;AAEF,wDAAwD;AACxD,MAAM,CAAC,MAAM,cAAc,GAAiC;IAC1D,qBAAqB,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE;IACrD,cAAc,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE;IAC9C,cAAc,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE;IAC9C,sBAAsB,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE;CACxC,CAAC;AAEF,yEAAyE;AACzE,MAAM,UAAU,mBAAmB,CAAC,GAAW;IAC7C,OAAO,kBAAkB,CAAC,GAAG,CAAC,CAAC;AACjC,CAAC;AAED,qEAAqE;AACrE,MAAM,UAAU,eAAe,CAAC,GAAW;IACzC,OAAO,cAAc,CAAC,GAAG,CAAC,CAAC;AAC7B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAC,KAAa;IAChD,QAAQ,KAAK,EAAE,CAAC;QACd,KAAK,OAAO,CAAC,CAAC,OAAO,EAAE,CAAC;QACxB,KAAK,OAAO,CAAC,CAAC,OAAO,EAAE,CAAC;QACxB,KAAK,OAAO,CAAC,CAAC,OAAO,EAAE,CAAC;QACxB,OAAO,CAAC,CAAC,MAAM,IAAI,KAAK,CAAC,kBAAkB,KAAK,EAAE,CAAC,CAAC;IACtD,CAAC;AACH,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Embedded JSON schemas for UIC barcode decoding.
3
+ * These are imported at build time and bundled into the compiled module.
4
+ */
5
+ import type { SchemaNode } from 'asn1-per-ts';
6
+ type SchemaMap = Record<string, SchemaNode>;
7
+ export declare const HEADER_SCHEMAS: Record<number, SchemaMap>;
8
+ export declare const RAIL_TICKET_SCHEMAS: Record<number, SchemaMap>;
9
+ export declare const INTERCODE_SCHEMAS: SchemaMap;
10
+ export {};
11
+ //# sourceMappingURL=schemas.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../src/schemas.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAS9C,KAAK,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;AAE5C,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAGpD,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAIzD,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAA4B,SAAS,CAAC"}
@@ -0,0 +1,17 @@
1
+ import headerV1 from '../schemas/uic-barcode/uicBarcodeHeader_v1.schema.json';
2
+ import headerV2 from '../schemas/uic-barcode/uicBarcodeHeader_v2.schema.json';
3
+ import railTicketV1 from '../schemas/uic-barcode/uicRailTicketData_v1.schema.json';
4
+ import railTicketV2 from '../schemas/uic-barcode/uicRailTicketData_v2.schema.json';
5
+ import railTicketV3 from '../schemas/uic-barcode/uicRailTicketData_v3.schema.json';
6
+ import intercode6 from '../schemas/uic-barcode/intercode6.schema.json';
7
+ export const HEADER_SCHEMAS = {
8
+ 1: headerV1,
9
+ 2: headerV2,
10
+ };
11
+ export const RAIL_TICKET_SCHEMAS = {
12
+ 1: railTicketV1,
13
+ 2: railTicketV2,
14
+ 3: railTicketV3,
15
+ };
16
+ export const INTERCODE_SCHEMAS = intercode6;
17
+ //# sourceMappingURL=schemas.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schemas.js","sourceRoot":"","sources":["../src/schemas.ts"],"names":[],"mappings":"AAMA,OAAO,QAAQ,MAAM,wDAAwD,CAAC;AAC9E,OAAO,QAAQ,MAAM,wDAAwD,CAAC;AAC9E,OAAO,YAAY,MAAM,yDAAyD,CAAC;AACnF,OAAO,YAAY,MAAM,yDAAyD,CAAC;AACnF,OAAO,YAAY,MAAM,yDAAyD,CAAC;AACnF,OAAO,UAAU,MAAM,+CAA+C,CAAC;AAIvE,MAAM,CAAC,MAAM,cAAc,GAA8B;IACvD,CAAC,EAAE,QAAgC;IACnC,CAAC,EAAE,QAAgC;CACpC,CAAC;AAEF,MAAM,CAAC,MAAM,mBAAmB,GAA8B;IAC5D,CAAC,EAAE,YAAoC;IACvC,CAAC,EAAE,YAAoC;IACvC,CAAC,EAAE,YAAoC;CACxC,CAAC;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAAG,UAAkC,CAAC"}
@@ -0,0 +1,110 @@
1
+ /**
2
+ * Signature fixture data extracted from real-world ticket barcodes.
3
+ *
4
+ * These fixtures contain the DER-encoded signatures and security metadata
5
+ * for use in signature verification unit tests.
6
+ *
7
+ * Source tickets: intercode6-ts/src/fixtures.ts
8
+ * - SNCF_TER_TICKET_HEX
9
+ * - SOLEA_TICKET_HEX
10
+ * - CTS_TICKET_HEX
11
+ */
12
+ export declare const SNCF_TER_SIGNATURES: {
13
+ /** Issuer RICS code (securityProviderNum) — used to look up level 1 key. */
14
+ readonly securityProviderNum: 1187;
15
+ /** Key identifier — used with securityProviderNum to find the level 1 key. */
16
+ readonly keyId: 1;
17
+ /** Level 1 key algorithm OID: DSA (no named curve). */
18
+ readonly level1KeyAlg: "2.16.840.1.101.3.4.3.1";
19
+ /** Level 2 key algorithm OID: secp256r1 (P-256). */
20
+ readonly level2KeyAlg: "1.2.840.10045.3.1.7";
21
+ /** Level 1 signing algorithm OID: DSA with SHA-224. */
22
+ readonly level1SigningAlg: "2.16.840.1.101.3.4.3.1";
23
+ /** Level 2 signing algorithm OID: ECDSA with SHA-256. */
24
+ readonly level2SigningAlg: "1.2.840.10045.4.3.2";
25
+ /**
26
+ * Level 1 signature — DER-encoded DSA signature (46 bytes).
27
+ *
28
+ * SEQUENCE {
29
+ * INTEGER r (20 bytes): 7a71a4d9abdf2204ae40d6dd2dff4adb30df5e44
30
+ * INTEGER s (20 bytes): 66856f3933964f825f1c825da94a5e3868ffe649
31
+ * }
32
+ */
33
+ readonly level1SignatureHex: string;
34
+ /**
35
+ * Level 2 signature — DER-encoded ECDSA P-256 signature (70 bytes).
36
+ *
37
+ * SEQUENCE {
38
+ * INTEGER r (32 bytes): 24df3d92d8f23d0b01572732e3752ce179f65a8160128341b86f9772f6677a14
39
+ * INTEGER s (32 bytes): 149d2950f3925fea703f4048eb3ada17649cdd2228ab5319cbd9c0d59d5cf603
40
+ * }
41
+ */
42
+ readonly level2SignatureHex: string;
43
+ };
44
+ export declare const SOLEA_SIGNATURES: {
45
+ /** Issuer RICS code (securityProviderNum) — used to look up level 1 key. */
46
+ readonly securityProviderNum: 1187;
47
+ /** Key identifier — used with securityProviderNum to find the level 1 key. */
48
+ readonly keyId: 1;
49
+ /** Level 1 key algorithm OID: secp256r1 (P-256). */
50
+ readonly level1KeyAlg: "1.2.840.10045.3.1.7";
51
+ /** Level 2 key algorithm OID: secp256r1 (P-256). */
52
+ readonly level2KeyAlg: "1.2.840.10045.3.1.7";
53
+ /** Level 1 signing algorithm OID: ECDSA with SHA-256. */
54
+ readonly level1SigningAlg: "1.2.840.10045.4.3.2";
55
+ /** Level 2 signing algorithm OID: ECDSA with SHA-256. */
56
+ readonly level2SigningAlg: "1.2.840.10045.4.3.2";
57
+ /**
58
+ * Level 1 signature — DER-encoded ECDSA P-256 signature (71 bytes).
59
+ *
60
+ * SEQUENCE {
61
+ * INTEGER r (33 bytes, 0x00-padded): 00c02fa08b4a288401a053dd250c1f748ae51d16b9aac26eacc09056695f0abe68
62
+ * INTEGER s (32 bytes): 50c1f1b13a5e8e126441f84159e5b3188d505e73354492b8de369441daa7285b
63
+ * }
64
+ */
65
+ readonly level1SignatureHex: string;
66
+ /**
67
+ * Level 2 signature — DER-encoded ECDSA P-256 signature (71 bytes).
68
+ *
69
+ * SEQUENCE {
70
+ * INTEGER r (32 bytes): 2a79f008376051f020eae108d0e9950314cac19c4c580249be4b530ec2250ccb
71
+ * INTEGER s (33 bytes, 0x00-padded): 00a00d805f051efcd130b17b76bf10969b626ed026423f6024d34446eae9168fa3
72
+ * }
73
+ */
74
+ readonly level2SignatureHex: string;
75
+ };
76
+ export declare const CTS_SIGNATURES: {
77
+ /** Issuer RICS code (securityProviderNum) — used to look up level 1 key. */
78
+ readonly securityProviderNum: 1187;
79
+ /** Key identifier — used with securityProviderNum to find the level 1 key. */
80
+ readonly keyId: 1;
81
+ /** Level 1 key algorithm OID: secp256r1 (P-256). */
82
+ readonly level1KeyAlg: "1.2.840.10045.3.1.7";
83
+ /** Level 2 key algorithm OID: secp256r1 (P-256). */
84
+ readonly level2KeyAlg: "1.2.840.10045.3.1.7";
85
+ /** Level 1 signing algorithm OID: ECDSA with SHA-256. */
86
+ readonly level1SigningAlg: "1.2.840.10045.4.3.2";
87
+ /** Level 2 signing algorithm OID: ECDSA with SHA-256. */
88
+ readonly level2SigningAlg: "1.2.840.10045.4.3.2";
89
+ /**
90
+ * Level 1 signature — DER-encoded ECDSA P-256 signature (72 bytes).
91
+ *
92
+ * SEQUENCE {
93
+ * INTEGER r (33 bytes, 0x00-padded): 008974af39d91452785b211f49ec2e36302b2b73ec3b99f5cdba5f1bf5c9e7cb72
94
+ * INTEGER s (33 bytes, 0x00-padded): 00f468337ab677c729a43b601c8df31f0c9c9923be5711ace720943c1f99b2a34b
95
+ * }
96
+ */
97
+ readonly level1SignatureHex: string;
98
+ /**
99
+ * Level 2 signature — DER-encoded ECDSA P-256 signature (71 bytes).
100
+ *
101
+ * SEQUENCE {
102
+ * INTEGER r (32 bytes): 2a79f008376051f020eae108d0e9950314cac19c4c580249be4b530ec2250ccb
103
+ * INTEGER s (33 bytes, 0x00-padded): 00a00d805f051efcd130b17b76bf10969b626ed026423f6024d34446eae9168fa3
104
+ * }
105
+ *
106
+ * Note: identical to Soléa level2Signature (same level 2 key pair).
107
+ */
108
+ readonly level2SignatureHex: string;
109
+ };
110
+ //# sourceMappingURL=signature-fixtures.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signature-fixtures.d.ts","sourceRoot":"","sources":["../src/signature-fixtures.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAMH,eAAO,MAAM,mBAAmB;IAC9B,4EAA4E;;IAE5E,8EAA8E;;IAE9E,uDAAuD;;IAEvD,oDAAoD;;IAEpD,uDAAuD;;IAEvD,yDAAyD;;IAGzD;;;;;;;OAOG;;IAKH;;;;;;;OAOG;;CAKK,CAAC;AAMX,eAAO,MAAM,gBAAgB;IAC3B,4EAA4E;;IAE5E,8EAA8E;;IAE9E,oDAAoD;;IAEpD,oDAAoD;;IAEpD,yDAAyD;;IAEzD,yDAAyD;;IAGzD;;;;;;;OAOG;;IASH;;;;;;;OAOG;;CAQK,CAAC;AAMX,eAAO,MAAM,cAAc;IACzB,4EAA4E;;IAE5E,8EAA8E;;IAE9E,oDAAoD;;IAEpD,oDAAoD;;IAEpD,yDAAyD;;IAEzD,yDAAyD;;IAGzD;;;;;;;OAOG;;IASH;;;;;;;;;OASG;;CAQK,CAAC"}