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.
- package/LICENSE +21 -0
- package/README.md +216 -0
- package/dist/decoder.d.ts +16 -0
- package/dist/decoder.d.ts.map +1 -0
- package/dist/decoder.js +265 -0
- package/dist/decoder.js.map +1 -0
- package/dist/encoder.d.ts +16 -0
- package/dist/encoder.d.ts.map +1 -0
- package/dist/encoder.js +171 -0
- package/dist/encoder.js.map +1 -0
- package/dist/fixtures.d.ts +14 -0
- package/dist/fixtures.d.ts.map +1 -0
- package/dist/fixtures.js +68 -0
- package/dist/fixtures.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/oids.d.ts +28 -0
- package/dist/oids.d.ts.map +1 -0
- package/dist/oids.js +43 -0
- package/dist/oids.js.map +1 -0
- package/dist/schemas.d.ts +11 -0
- package/dist/schemas.d.ts.map +1 -0
- package/dist/schemas.js +17 -0
- package/dist/schemas.js.map +1 -0
- package/dist/signature-fixtures.d.ts +110 -0
- package/dist/signature-fixtures.d.ts.map +1 -0
- package/dist/signature-fixtures.js +142 -0
- package/dist/signature-fixtures.js.map +1 -0
- package/dist/signature-utils.d.ts +29 -0
- package/dist/signature-utils.d.ts.map +1 -0
- package/dist/signature-utils.js +201 -0
- package/dist/signature-utils.js.map +1 -0
- package/dist/signed-data.d.ts +32 -0
- package/dist/signed-data.d.ts.map +1 -0
- package/dist/signed-data.js +87 -0
- package/dist/signed-data.js.map +1 -0
- package/dist/types.d.ts +273 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +8 -0
- package/dist/types.js.map +1 -0
- package/dist/verifier.d.ts +67 -0
- package/dist/verifier.d.ts.map +1 -0
- package/dist/verifier.js +309 -0
- package/dist/verifier.js.map +1 -0
- package/package.json +46 -0
- package/schemas/uic-barcode/intercode6.schema.json +204 -0
- package/schemas/uic-barcode/uicBarcodeHeader_v1.schema.json +376 -0
- package/schemas/uic-barcode/uicBarcodeHeader_v2.schema.json +484 -0
- package/schemas/uic-barcode/uicRailTicketData_v1.schema.json +31507 -0
- package/schemas/uic-barcode/uicRailTicketData_v2.schema.json +31623 -0
- package/schemas/uic-barcode/uicRailTicketData_v3.schema.json +32729 -0
package/dist/encoder.js
ADDED
|
@@ -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":"AAAA;;;;;GAKG;AACH,OAAO,EACL,WAAW,EACX,aAAa,EACb,SAAS,GAEV,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AASnF,8EAA8E;AAC9E,yDAAyD;AACzD,8EAA8E;AAE9E,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAAuB,CAAC;AACxD,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAA0C,CAAC;AAC3E,IAAI,qBAA8C,CAAC;AACnD,IAAI,qBAA8C,CAAC;AAEnD,SAAS,cAAc,CAAC,OAAe;IACrC,IAAI,KAAK,GAAG,gBAAgB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAC1C,IAAI,KAAK;QAAE,OAAO,KAAK,CAAC;IACxB,MAAM,OAAO,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;IACxC,IAAI,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,OAAO,EAAE,CAAC,CAAC;IAClE,KAAK,GAAG,IAAI,WAAW,CAAC,OAAO,CAAC,gBAA8B,CAAC,CAAC;IAChE,gBAAgB,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IACrC,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,eAAe,CAAC,OAAe;IACtC,IAAI,MAAM,GAAG,gBAAgB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAC3C,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC;IAC1B,MAAM,OAAO,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAC7C,IAAI,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,OAAO,EAAE,CAAC,CAAC;IAC7D,MAAM,GAAG,aAAa,CAAC,QAAQ,CAAC,OAAqC,CAAC,CAAC;IACvE,gBAAgB,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IACtC,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,wBAAwB;IAC/B,IAAI,qBAAqB;QAAE,OAAO,qBAAqB,CAAC;IACxD,qBAAqB,GAAG,IAAI,WAAW,CAAC,iBAAiB,CAAC,oBAAkC,CAAC,CAAC;IAC9F,qBAAqB,GAAG,IAAI,WAAW,CAAC,iBAAiB,CAAC,oBAAkC,CAAC,CAAC;IAC9F,OAAO,qBAAqB,CAAC;AAC/B,CAAC;AAED,SAAS,wBAAwB;IAC/B,IAAI,qBAAqB;QAAE,OAAO,qBAAqB,CAAC;IACxD,wBAAwB,EAAE,CAAC;IAC3B,OAAO,qBAAsB,CAAC;AAChC,CAAC;AAED,SAAS,KAAK,CAAC,KAAiB;IAC9B,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC9E,CAAC;AAED,8EAA8E;AAC9E,aAAa;AACb,8EAA8E;AAE9E;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAAC,KAA4B;IACvD,MAAM,aAAa,GAAG,KAAK,CAAC,aAAa,IAAI,CAAC,CAAC;IAC/C,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,IAAI,CAAC,CAAC;IAEzC,sCAAsC;IACtC,MAAM,eAAe,GAAG,gBAAgB,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;IAE5D,kCAAkC;IAClC,MAAM,YAAY,GAAoD;QACpE,EAAE,UAAU,EAAE,MAAM,UAAU,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE;KAC1D,CAAC;IAEF,iDAAiD;IACjD,IAAI,UAAgE,CAAC;IACrE,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;QACtB,MAAM,YAAY,GAAG,wBAAwB,EAAE,CAAC,MAAM,CAAC;YACrD,iBAAiB,EAAE,KAAK,CAAC,WAAW,CAAC,iBAAiB,IAAI,CAAC;YAC3D,kBAAkB,EAAE,KAAK,CAAC,WAAW,CAAC,kBAAkB;YACxD,uBAAuB,EAAE,KAAK,CAAC,WAAW,CAAC,uBAAuB;YAClE,sBAAsB,EAAE,KAAK,CAAC,WAAW,CAAC,sBAAsB;SACjE,CAAC,CAAC;QACH,UAAU,GAAG;YACX,UAAU,EAAE,IAAI,KAAK,CAAC,WAAW,CAAC,IAAI,MAAM;YAC5C,IAAI,EAAE,YAAY;SACnB,CAAC;IACJ,CAAC;IAED,0CAA0C;IAC1C,MAAM,UAAU,GAA4B;QAC1C,MAAM,EAAE,IAAI,aAAa,EAAE;QAC3B,gBAAgB,EAAE;YAChB,UAAU,EAAE;gBACV,mBAAmB,EAAE,KAAK,CAAC,mBAAmB;gBAC9C,KAAK,EAAE,KAAK,CAAC,KAAK;gBAClB,YAAY;gBACZ,YAAY,EAAE,KAAK,CAAC,YAAY;gBAChC,YAAY,EAAE,KAAK,CAAC,YAAY;gBAChC,gBAAgB,EAAE,KAAK,CAAC,gBAAgB;gBACxC,gBAAgB,EAAE,KAAK,CAAC,gBAAgB;gBACxC,eAAe,EAAE,KAAK,CAAC,eAAe;aACvC;YACD,eAAe,EAAE,KAAK,CAAC,eAAe;YACtC,UAAU;SACX;QACD,eAAe,EAAE,KAAK,CAAC,eAAe;KACvC,CAAC;IAEF,4BAA4B;IAC5B,MAAM,KAAK,GAAG,cAAc,CAAC,aAAa,CAAC,CAAC;IAC5C,OAAO,KAAK,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;AACvC,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAA4B;IAC9D,MAAM,GAAG,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;IAChC,OAAO,IAAI,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;AACzE,CAAC;AAED,8EAA8E;AAC9E,4BAA4B;AAC5B,8EAA8E;AAE9E,SAAS,gBAAgB,CAAC,UAAkB,EAAE,KAA4B;IACxE,MAAM,GAAG,GAAG,KAAK,CAAC,UAAU,CAAC,aAAa,CAAC;IAE3C,oDAAoD;IACpD,IAAI,SAAyE,CAAC;IAC9E,IAAI,GAAG,CAAC,gBAAgB,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,GAAG,CAAC,mBAAmB,IAAI,KAAK,CAAC,mBAAmB,IAAI,CAAC,CAAC;QACvE,MAAM,YAAY,GAAG,wBAAwB,EAAE,CAAC,MAAM,CAAC;YACrD,gBAAgB,EAAE,GAAG,CAAC,gBAAgB,CAAC,gBAAgB,IAAI,CAAC;YAC5D,sBAAsB,EAAE,GAAG,CAAC,gBAAgB,CAAC,sBAAsB,IAAI,CAAC;YACxE,SAAS,EAAE,GAAG,CAAC,gBAAgB,CAAC,SAAS;YACzC,eAAe,EAAE,GAAG,CAAC,gBAAgB,CAAC,eAAe;SACtD,CAAC,CAAC;QACH,SAAS,GAAG;YACV,WAAW,EAAE,IAAI,IAAI,KAAK;YAC1B,aAAa,EAAE,YAAY;SAC5B,CAAC;IACJ,CAAC;IAED,2BAA2B;IAC3B,MAAM,aAAa,GAA4B;QAC7C,mBAAmB,EAAE,GAAG,CAAC,mBAAmB;QAC5C,SAAS,EAAE,GAAG,CAAC,SAAS;QACxB,WAAW,EAAE,GAAG,CAAC,WAAW;QAC5B,UAAU,EAAE,GAAG,CAAC,UAAU;QAC1B,WAAW,EAAE,GAAG,CAAC,WAAW;QAC5B,UAAU,EAAE,GAAG,CAAC,UAAU;QAC1B,QAAQ,EAAE,GAAG,CAAC,QAAQ,IAAI,KAAK;QAC/B,iBAAiB,EAAE,GAAG,CAAC,iBAAiB,IAAI,KAAK;QACjD,SAAS,EAAE,GAAG,CAAC,SAAS,IAAI,IAAI;QAChC,QAAQ,EAAE,GAAG,CAAC,QAAQ;QACtB,aAAa,EAAE,GAAG,CAAC,aAAa;QAChC,SAAS,EAAE,GAAG,CAAC,SAAS;QACxB,SAAS;KACV,CAAC;IAEF,4BAA4B;IAC5B,MAAM,iBAAiB,GAAG,KAAK,CAAC,UAAU,CAAC,iBAAiB,EAAE,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAC1E,MAAM,EAAE,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE;KACzC,CAAC,CAAC,CAAC;IAEJ,kCAAkC;IAClC,MAAM,UAAU,GAA4B;QAC1C,aAAa;QACb,cAAc,EAAE,KAAK,CAAC,UAAU,CAAC,cAAc;QAC/C,iBAAiB;QACjB,aAAa,EAAE,KAAK,CAAC,UAAU,CAAC,aAAa;KAC9C,CAAC;IAEF,MAAM,MAAM,GAAG,eAAe,CAAC,UAAU,CAAC,CAAC;IAC3C,MAAM,GAAG,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC;IAC9B,MAAM,CAAC,iBAAiB,CAAC,MAAM,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;IACjD,OAAO,GAAG,CAAC,YAAY,EAAE,CAAC;AAC5B,CAAC"}
|
|
@@ -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"}
|
package/dist/fixtures.js
ADDED
|
@@ -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"}
|
package/dist/index.d.ts
ADDED
|
@@ -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
|
package/dist/oids.js.map
ADDED
|
@@ -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"}
|
package/dist/schemas.js
ADDED
|
@@ -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"}
|