@syzlm/ofdparser 0.0.1

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 (213) hide show
  1. package/.babelrc +14 -0
  2. package/.eslintignore +2 -0
  3. package/.eslintrc.json +18 -0
  4. package/.prettierrc.json +9 -0
  5. package/dist/OFD.d.ts +8 -0
  6. package/dist/Pages.d.ts +7 -0
  7. package/dist/RootDocumnet.d.ts +1 -0
  8. package/dist/bundle.cjs.js +64123 -0
  9. package/dist/bundle.esm.js +64115 -0
  10. package/dist/bundle.iife.js +14743 -0
  11. package/dist/bundle.umd.js +64045 -0
  12. package/dist/constant/index.d.ts +7 -0
  13. package/dist/constant.d.ts +6 -0
  14. package/dist/core/ofd-core/Annotations/AnnotationsXml.d.ts +16 -0
  15. package/dist/core/ofd-core/Asn.1Utils.d.ts +47 -0
  16. package/dist/core/ofd-core/Documents/DocumentResXml.d.ts +15 -0
  17. package/dist/core/ofd-core/Documents/DocumnetXml.d.ts +25 -0
  18. package/dist/core/ofd-core/Documents/PublicResXml.d.ts +15 -0
  19. package/dist/core/ofd-core/OFDElement.d.ts +232 -0
  20. package/dist/core/ofd-core/Ofd/OFDXml.d.ts +19 -0
  21. package/dist/core/ofd-core/Pages/PageXml.d.ts +20 -0
  22. package/dist/core/ofd-core/Signatures/Signatures.d.ts +20 -0
  23. package/dist/core/ofd-core/TemplatePages/TemplatePages.d.ts +20 -0
  24. package/dist/core/ofd-core/constant.d.ts +29 -0
  25. package/dist/core/ofd-core/utils.d.ts +21 -0
  26. package/dist/dicom/dicom.d.ts +15 -0
  27. package/dist/dicom/index.d.ts +1 -0
  28. package/dist/errors/ErrorHandle.d.ts +6 -0
  29. package/dist/errors/ErrorMsg.d.ts +16 -0
  30. package/dist/errors/FetchErrors.d.ts +4 -0
  31. package/dist/errors/MimeError.d.ts +4 -0
  32. package/dist/errors/OFDErrors.d.ts +4 -0
  33. package/dist/errors/UnzipErrors.d.ts +4 -0
  34. package/dist/errors/XmlErrors.d.ts +4 -0
  35. package/dist/errors/error-msg.d.ts +9 -0
  36. package/dist/es.d.ts +2 -0
  37. package/dist/index.d.ts +6 -0
  38. package/dist/lib/ParseFile.d.ts +7 -0
  39. package/dist/lib/UnitCoversion.d.ts +31 -0
  40. package/dist/lib/asn1/Asn.1.d.ts +34 -0
  41. package/dist/lib/asn1/Stream.d.ts +27 -0
  42. package/dist/lib/asn1/asn1.d.ts +4 -0
  43. package/dist/lib/asn1/base64.d.ts +4 -0
  44. package/dist/lib/asn1/hex.d.ts +5 -0
  45. package/dist/lib/asn1/index.d.ts +5 -0
  46. package/dist/lib/asn1/int10.d.ts +34 -0
  47. package/dist/lib/asn1/oids.d.ts +2 -0
  48. package/dist/lib/asn1/string-cut.d.ts +2 -0
  49. package/dist/lib/decode-html.d.ts +7 -0
  50. package/dist/lib/fetch.d.ts +17 -0
  51. package/dist/lib/is-element.d.ts +5 -0
  52. package/dist/lib/load-files.d.ts +3 -0
  53. package/dist/lib/load-opentype.d.ts +34 -0
  54. package/dist/lib/load-script.d.ts +1 -0
  55. package/dist/lib/mime.d.ts +8 -0
  56. package/dist/lib/read-buffer.d.ts +2 -0
  57. package/dist/lib/toFixeds.d.ts +7 -0
  58. package/dist/libs/Asn.1Utils.d.ts +47 -0
  59. package/dist/libs/asn1/Asn.1.d.ts +34 -0
  60. package/dist/libs/asn1/Stream.d.ts +27 -0
  61. package/dist/libs/asn1/asn1.d.ts +4 -0
  62. package/dist/libs/asn1/base64.d.ts +4 -0
  63. package/dist/libs/asn1/hex.d.ts +5 -0
  64. package/dist/libs/asn1/index.d.ts +5 -0
  65. package/dist/libs/asn1/int10.d.ts +34 -0
  66. package/dist/libs/asn1/oids.d.ts +2 -0
  67. package/dist/libs/asn1/string-cut.d.ts +2 -0
  68. package/dist/libs/decode-html.d.ts +7 -0
  69. package/dist/libs/fetch.d.ts +17 -0
  70. package/dist/libs/mime.d.ts +8 -0
  71. package/dist/libs/ofdArray.d.ts +10 -0
  72. package/dist/libs/ofdImageObject.d.ts +9 -0
  73. package/dist/libs/ofdLayer.d.ts +3 -0
  74. package/dist/libs/ofdName.d.ts +17 -0
  75. package/dist/libs/ofdPathObject.d.ts +11 -0
  76. package/dist/libs/ofdTextObject.d.ts +6 -0
  77. package/dist/libs/parseAnnotation.d.ts +5 -0
  78. package/dist/libs/parseColor.d.ts +5 -0
  79. package/dist/libs/parsePageArea.d.ts +17 -0
  80. package/dist/libs/parser-elements.d.ts +8 -0
  81. package/dist/libs/parserElements.d.ts +8 -0
  82. package/dist/libs/pipeExtensions.d.ts +4 -0
  83. package/dist/libs/read-buffer.d.ts +2 -0
  84. package/dist/main.d.ts +15 -0
  85. package/dist/ofd/ConverterDpi.d.ts +16 -0
  86. package/dist/ofd/index.d.ts +1 -0
  87. package/dist/ofd/ofd-utils.d.ts +137 -0
  88. package/dist/ofd/ofd.d.ts +35 -0
  89. package/dist/ofd/parse-ofd.d.ts +18 -0
  90. package/dist/ofd/render.d.ts +18 -0
  91. package/dist/ofd/svg-image.d.ts +12 -0
  92. package/dist/ofd/svg-path.d.ts +5 -0
  93. package/dist/ofd/svg-text.d.ts +8 -0
  94. package/dist/ofd.parse.d.ts +6 -0
  95. package/dist/ofd.xml.d.ts +1 -0
  96. package/dist/ofdParse.d.ts +6 -0
  97. package/dist/pipe/annotations.d.ts +13 -0
  98. package/dist/pipe/attachments.d.ts +13 -0
  99. package/dist/pipe/commonData.d.ts +18 -0
  100. package/dist/pipe/customTags.d.ts +14 -0
  101. package/dist/pipe/extensions.d.ts +14 -0
  102. package/dist/pipe/output.d.ts +7 -0
  103. package/dist/pipe/pages.d.ts +13 -0
  104. package/dist/pipe/permissions.d.ts +14 -0
  105. package/dist/pipe/pipeline.d.ts +63 -0
  106. package/dist/pipe/startPipe.d.ts +11 -0
  107. package/dist/xml/index.d.ts +2 -0
  108. package/dist/xml/render.d.ts +6 -0
  109. package/dist/xml/xml.d.ts +18 -0
  110. package/package.json +47 -0
  111. package/public/index.html +75 -0
  112. package/public/opentype.min.js +2 -0
  113. package/rollup.config.dev.mjs +47 -0
  114. package/rollup.config.mjs +70 -0
  115. package/src/constant/index.ts +13 -0
  116. package/src/core/ofd-core/Annotations/Annotation.km +206 -0
  117. package/src/core/ofd-core/Annotations/Annotations.km +59 -0
  118. package/src/core/ofd-core/Annotations/Annotations.md +13 -0
  119. package/src/core/ofd-core/Annotations/AnnotationsXml.ts +114 -0
  120. package/src/core/ofd-core/Asn.1Utils.ts +225 -0
  121. package/src/core/ofd-core/Documents/DocumentResXml.ts +55 -0
  122. package/src/core/ofd-core/Documents/Documnet.km +862 -0
  123. package/src/core/ofd-core/Documents/DocumnetXml.ts +118 -0
  124. package/src/core/ofd-core/Documents/Documnets.md +296 -0
  125. package/src/core/ofd-core/Documents/PublicResXml.ts +63 -0
  126. package/src/core/ofd-core/Documents//345/233/276/345/261/202/346/270/262/346/237/223/351/241/272/345/272/217.png +0 -0
  127. package/src/core/ofd-core/Documents//350/241/25022/347/272/277/346/235/241/350/277/236/346/216/245/346/240/267/345/274/217.png +0 -0
  128. package/src/core/ofd-core/Documents//350/241/25023/347/272/277/346/235/241/350/231/232/347/272/277/346/240/267/345/274/217.png +0 -0
  129. package/src/core/ofd-core/Documents//350/241/25023/347/273/223/345/220/210/347/202/271/351/225/277/345/272/246.png +0 -0
  130. package/src/core/ofd-core/Documents//350/241/25024/347/272/277/346/235/241/347/253/257/347/202/271/346/240/267/345/274/217.png +0 -0
  131. package/src/core/ofd-core/Documents//351/241/265/350/276/271/347/225/214/345/261/202/346/254/241/347/273/223/346/236/204.png +0 -0
  132. package/src/core/ofd-core/OFDElement.ts +724 -0
  133. package/src/core/ofd-core/Ofd/CT_DocInfo.km +197 -0
  134. package/src/core/ofd-core/Ofd/OFD.km +114 -0
  135. package/src/core/ofd-core/Ofd/OFD.md +99 -0
  136. package/src/core/ofd-core/Ofd/OFDXml.ts +69 -0
  137. package/src/core/ofd-core/Pages/PAGE.md +40 -0
  138. package/src/core/ofd-core/Pages/PageXml.ts +59 -0
  139. package/src/core/ofd-core/Signatures/Signature.km +308 -0
  140. package/src/core/ofd-core/Signatures/Signature.md +21 -0
  141. package/src/core/ofd-core/Signatures/Signatures.km +315 -0
  142. package/src/core/ofd-core/Signatures/Signatures.md +24 -0
  143. package/src/core/ofd-core/Signatures/Signatures.ts +247 -0
  144. package/src/core/ofd-core/TemplatePages/TemplatePages.ts +56 -0
  145. package/src/core/ofd-core/asn.md +60 -0
  146. package/src/core/ofd-core/constant.ts +35 -0
  147. package/src/core/ofd-core/index.d.ts +867 -0
  148. package/src/core/ofd-core/utils.ts +86 -0
  149. package/src/dicom/dicom.ts +42 -0
  150. package/src/dicom/index.ts +1 -0
  151. package/src/errors/ErrorHandle.ts +14 -0
  152. package/src/errors/FetchErrors.ts +8 -0
  153. package/src/errors/MimeError.ts +9 -0
  154. package/src/errors/OFDErrors.ts +11 -0
  155. package/src/errors/UnzipErrors.ts +9 -0
  156. package/src/errors/XmlErrors.ts +11 -0
  157. package/src/errors/error-msg.ts +17 -0
  158. package/src/es.ts +3 -0
  159. package/src/global.d.ts +7 -0
  160. package/src/index.ts +7 -0
  161. package/src/lib/ParseFile.ts +12 -0
  162. package/src/lib/README.md +69 -0
  163. package/src/lib/UnitCoversion.ts +55 -0
  164. package/src/lib/asn1/Asn.1.ts +284 -0
  165. package/src/lib/asn1/README.md +1 -0
  166. package/src/lib/asn1/Stream.ts +314 -0
  167. package/src/lib/asn1/asn1.ts +120 -0
  168. package/src/lib/asn1/base64.ts +97 -0
  169. package/src/lib/asn1/hex.ts +60 -0
  170. package/src/lib/asn1/index.ts +5 -0
  171. package/src/lib/asn1/int10.ts +103 -0
  172. package/src/lib/asn1/oids.ts +6164 -0
  173. package/src/lib/asn1/string-cut.ts +8 -0
  174. package/src/lib/decode-html.ts +37 -0
  175. package/src/lib/fetch.ts +70 -0
  176. package/src/lib/is-element.ts +13 -0
  177. package/src/lib/jbig/README.md +1 -0
  178. package/src/lib/jbig/arithmetic_decoder.js +184 -0
  179. package/src/lib/jbig/base_stream.js +117 -0
  180. package/src/lib/jbig/ccitt.js +1068 -0
  181. package/src/lib/jbig/ccitt_stream.js +60 -0
  182. package/src/lib/jbig/compatibility.js +108 -0
  183. package/src/lib/jbig/core_utils.js +591 -0
  184. package/src/lib/jbig/decode_stream.js +184 -0
  185. package/src/lib/jbig/is_node.js +28 -0
  186. package/src/lib/jbig/jbig2.js +2582 -0
  187. package/src/lib/jbig/jbig2_stream.js +78 -0
  188. package/src/lib/jbig/primitives.js +441 -0
  189. package/src/lib/jbig/stream.js +101 -0
  190. package/src/lib/jbig/util.js +1231 -0
  191. package/src/lib/load-files.ts +26 -0
  192. package/src/lib/load-opentype.ts +161 -0
  193. package/src/lib/load-script.ts +33 -0
  194. package/src/lib/mime.ts +97 -0
  195. package/src/lib/read-buffer.ts +19 -0
  196. package/src/lib/toFixeds.ts +56 -0
  197. package/src/ofd/ConverterDpi.ts +35 -0
  198. package/src/ofd/OFD.md +38 -0
  199. package/src/ofd/TODO.md +10 -0
  200. package/src/ofd/index.ts +1 -0
  201. package/src/ofd/ofd-utils.ts +627 -0
  202. package/src/ofd/ofd.demo.md +12 -0
  203. package/src/ofd/ofd.ts +200 -0
  204. package/src/ofd/ofdxml.km +162 -0
  205. package/src/ofd/parse-ofd.ts +103 -0
  206. package/src/ofd/render.ts +393 -0
  207. package/src/ofd/svg-image.ts +318 -0
  208. package/src/ofd/svg-path.ts +283 -0
  209. package/src/ofd/svg-text.ts +272 -0
  210. package/src/xml/index.ts +3 -0
  211. package/src/xml/render.ts +171 -0
  212. package/src/xml/xml.ts +136 -0
  213. package/tsconfig.json +21 -0
@@ -0,0 +1,314 @@
1
+ import Int10 from './int10';
2
+ import oids from './oids';
3
+ import stringCut from './string-cut';
4
+
5
+ const b64Safe =
6
+ 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_';
7
+
8
+ const reTimeS =
9
+ /^(\d\d)(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])([01]\d|2[0-3])(?:([0-5]\d)(?:([0-5]\d)(?:[.,](\d{1,3}))?)?)?(Z|[-+](?:[0]\d|1[0-2])([0-5]\d)?)?$/;
10
+ const reTimeL =
11
+ /^(\d\d\d\d)(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])([01]\d|2[0-3])(?:([0-5]\d)(?:([0-5]\d)(?:[.,](\d{1,3}))?)?)?(Z|[-+](?:[0]\d|1[0-2])([0-5]\d)?)?$/;
12
+ const ellipsis = '\u2026';
13
+ function ex(c: number) {
14
+ // must be 10xxxxxx
15
+ if (c < 0x80 || c >= 0xc0)
16
+ throw new Error('Invalid UTF-8 continuation byte: ' + c);
17
+
18
+ return c & 0x3f;
19
+ }
20
+
21
+ function surrogate(cp: number) {
22
+ if (cp < 0x10000)
23
+ throw new Error(
24
+ 'UTF-8 overlong encoding, codepoint encoded in 4 bytes: ' + cp
25
+ );
26
+ // we could use String.fromCodePoint(cp) but let's be nice to older browsers and use surrogate pairs
27
+
28
+ cp -= 0x10000;
29
+
30
+ return String.fromCharCode((cp >> 10) + 0xd800, (cp & 0x3ff) + 0xdc00);
31
+ }
32
+
33
+ class Stream {
34
+ enc: string | Uint8Array;
35
+ pos: number;
36
+ static hexDigits: '0123456789ABCDEF';
37
+ constructor(streams: Stream | string, pos?: number) {
38
+ if (streams instanceof Stream) {
39
+ this.enc = streams.enc;
40
+ this.pos = streams.pos;
41
+ } else {
42
+ // enc should be an array or a binary string
43
+ this.enc = streams;
44
+ this.pos = pos as number;
45
+ }
46
+ }
47
+
48
+ hexDigits = '0123456789ABCDEF';
49
+
50
+ get(pos?: number): number {
51
+ let cPos = pos;
52
+ if (cPos === undefined) {
53
+ cPos = this.pos++;
54
+ }
55
+ if (!this.enc || !this.enc.length) {
56
+ return 0;
57
+ }
58
+ if (this.enc && cPos >= this.enc.length)
59
+ throw (
60
+ 'Requesting byte offset ' +
61
+ pos +
62
+ ' on a stream of length ' +
63
+ this.enc.length
64
+ );
65
+ return typeof this.enc == 'string'
66
+ ? this.enc.charCodeAt(cPos)
67
+ : this.enc[cPos];
68
+ }
69
+ hexByte(b: number): string {
70
+ return (
71
+ this.hexDigits.charAt((b >> 4) & 0xf) + this.hexDigits.charAt(b & 0xf)
72
+ );
73
+ }
74
+ hexDump(start: number, end: number, raw?: boolean) {
75
+ let s = '';
76
+ for (let i = start; i < end; ++i) {
77
+ s += this.hexByte(this.get(i));
78
+ if (raw !== true)
79
+ switch (i & 0xf) {
80
+ case 0x7:
81
+ s += ' ';
82
+ break;
83
+ case 0xf:
84
+ s += '\n';
85
+ break;
86
+ default:
87
+ s += ' ';
88
+ }
89
+ }
90
+ return s;
91
+ }
92
+ b64Dump(start: number, end: number) {
93
+ const extra = (end - start) % 3;
94
+ let s = '';
95
+ let i;
96
+ let c;
97
+ for (i = start; i + 2 < end; i += 3) {
98
+ c = (this.get(i) << 16) | (this.get(i + 1) << 8) | this.get(i + 2);
99
+ s += b64Safe.charAt((c >> 18) & 0x3f);
100
+ s += b64Safe.charAt((c >> 12) & 0x3f);
101
+ s += b64Safe.charAt((c >> 6) & 0x3f);
102
+ s += b64Safe.charAt(c & 0x3f);
103
+ }
104
+ if (extra > 0) {
105
+ c = this.get(i) << 16;
106
+ if (extra > 1) c |= this.get(i + 1) << 8;
107
+ s += b64Safe.charAt((c >> 18) & 0x3f);
108
+ s += b64Safe.charAt((c >> 12) & 0x3f);
109
+ if (extra === 2) s += b64Safe.charAt((c >> 6) & 0x3f);
110
+ }
111
+ return s;
112
+ }
113
+ isASCII(start: number, end: number) {
114
+ for (let i = start; i < end; ++i) {
115
+ var c = this.get(i);
116
+ if (c < 32 || c > 176) return false;
117
+ }
118
+ return true;
119
+ }
120
+
121
+ parseStringISO(start: number, end: number) {
122
+ let s = '';
123
+ for (let i = start; i < end; ++i) {
124
+ s += String.fromCharCode(this.get(i));
125
+ }
126
+ return s;
127
+ }
128
+ parseStringUTF(start: number, end: number) {
129
+ let s = '';
130
+ for (let i = start; i < end; ) {
131
+ const c = this.get(i++);
132
+ if (c < 0x80)
133
+ // 0xxxxxxx (7 bit)
134
+ s += String.fromCharCode(c);
135
+ else if (c < 0xc0) throw new Error('Invalid UTF-8 starting byte: ' + c);
136
+ else if (c < 0xe0)
137
+ // 110xxxxx 10xxxxxx (11 bit)
138
+ s += String.fromCharCode(((c & 0x1f) << 6) | ex(this.get(i++)));
139
+ else if (c < 0xf0)
140
+ // 1110xxxx 10xxxxxx 10xxxxxx (16 bit)
141
+ s += String.fromCharCode(
142
+ ((c & 0x0f) << 12) | (ex(this.get(i++)) << 6) | ex(this.get(i++))
143
+ );
144
+ else if (c < 0xf8)
145
+ // 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx (21 bit)
146
+ s += surrogate(
147
+ ((c & 0x07) << 18) |
148
+ (ex(this.get(i++)) << 12) |
149
+ (ex(this.get(i++)) << 6) |
150
+ ex(this.get(i++))
151
+ );
152
+ else
153
+ throw new Error(
154
+ 'Invalid UTF-8 starting byte (since 2003 it is restricted to 4 bytes): ' +
155
+ c
156
+ );
157
+ }
158
+ return s;
159
+ }
160
+ parseStringBMP(start: number, end: number): string {
161
+ let str = '';
162
+ let hi;
163
+ let lo;
164
+ for (let i = start; i < end; ) {
165
+ hi = this.get(i++);
166
+ lo = this.get(i++);
167
+ str += String.fromCharCode((hi << 8) | lo);
168
+ }
169
+ return str;
170
+ }
171
+ parseTime(start: number, end: number, shortYear: boolean) {
172
+ let s = this.parseStringISO(start, end);
173
+ const t = (shortYear ? reTimeS : reTimeL).exec(s);
174
+ if (!t) return 'Unrecognized time: ' + s;
175
+ const m: (number | string)[] = t;
176
+ if (shortYear) {
177
+ // to avoid querying the timer, use the fixed range [1970, 2069]
178
+ // it will conform with ITU X.400 [-10, +40] sliding window until 2030
179
+
180
+ m[1] = +Number(m[1]);
181
+ m[1] += Number(m[1]) < 70 ? 2000 : 1900;
182
+ }
183
+ s = m[1] + '-' + m[2] + '-' + m[3] + ' ' + m[4];
184
+ if (m[5]) {
185
+ s += ':' + m[5];
186
+ if (m[6]) {
187
+ s += ':' + m[6];
188
+ if (m[7]) s += '.' + m[7];
189
+ }
190
+ }
191
+ if (m[8]) {
192
+ s += ' UTC';
193
+ if (m[8] != 'Z') {
194
+ s += m[8];
195
+ if (m[9]) s += ':' + m[9];
196
+ }
197
+ }
198
+ return s;
199
+ }
200
+ parseInteger(start: number, end: number) {
201
+ let v = this.get(start),
202
+ neg = v > 127,
203
+ pad = neg ? 255 : 0,
204
+ len,
205
+ s = null;
206
+ // skip unuseful bits (not allowed in DER)
207
+ while (v === pad && ++start < end) {
208
+ v = this.get(start);
209
+ }
210
+ len = end - start;
211
+ if (len === 0) return neg ? '-1' : '0';
212
+ // show bit length of huge integers
213
+ if (len > 4) {
214
+ s = v;
215
+ len <<= 3;
216
+ while (((s ^ pad) & 0x80) === 0) {
217
+ s <<= 1;
218
+ --len;
219
+ }
220
+ s = '(' + len + ' bit)\n';
221
+ }
222
+ // decode the integer
223
+ if (neg) v = v - 256;
224
+
225
+ const n = new Int10(v);
226
+ for (let i = start + 1; i < end; ++i) {
227
+ n.mulAdd(256, this.get(i));
228
+ }
229
+
230
+ return s ? s + n.toString() : n.toString();
231
+ }
232
+ parseBitString(start: number, end: number, maxLength: number) {
233
+ var unusedBits = this.get(start);
234
+ if (unusedBits > 7) throw 'Invalid BitString with unusedBits=' + unusedBits;
235
+ var lenBit = ((end - start - 1) << 3) - unusedBits,
236
+ s = '';
237
+ for (var i = start + 1; i < end; ++i) {
238
+ var b = this.get(i),
239
+ skip = i == end - 1 ? unusedBits : 0;
240
+ for (var j = 7; j >= skip; --j) s += (b >> j) & 1 ? '1' : '0';
241
+ if (s.length > maxLength) s = stringCut(s, maxLength);
242
+ }
243
+ return { size: lenBit, str: s };
244
+ }
245
+ parseOctetString(start: number, end: number, maxLength: number) {
246
+ var len = end - start,
247
+ s;
248
+ try {
249
+ s = this.parseStringUTF(start, end);
250
+ var v;
251
+ for (i = 0; i < s.length; ++i) {
252
+ v = s.charCodeAt(i);
253
+ if (v < 32 && v != 9 && v != 10 && v != 13)
254
+ // [\t\r\n] are (kinda) printable
255
+ throw new Error(
256
+ 'Unprintable character at index ' +
257
+ i +
258
+ ' (code ' +
259
+ s.charCodeAt(i) +
260
+ ')'
261
+ );
262
+ }
263
+ return { size: len, str: s };
264
+ } catch (e) {
265
+ // ignore
266
+ }
267
+ maxLength /= 2; // we work in bytes
268
+ if (len > maxLength) end = start + maxLength;
269
+ s = '';
270
+ for (var i = start; i < end; ++i) s += this.hexByte(this.get(i));
271
+ if (len > maxLength) s += ellipsis;
272
+ return { size: len, str: s };
273
+ }
274
+ parseOID(start: number, end: number, maxLength: number) {
275
+ let s = '';
276
+ let n = new Int10();
277
+ let bits = 0;
278
+ for (let i = start; i < end; ++i) {
279
+ var v = this.get(i);
280
+ n.mulAdd(128, v & 0x7f);
281
+ bits += 7;
282
+ if (!(v & 0x80)) {
283
+ // finished
284
+ if (s === '') {
285
+ n = n.simplify() as Int10;
286
+ if (n instanceof Int10) {
287
+ n.sub(80);
288
+
289
+ s = '2.' + n.toString();
290
+ } else {
291
+ const m = n < 80 ? (n < 40 ? 0 : 1) : 2;
292
+ s = m + '.' + (n - m * 40);
293
+ }
294
+ } else s += '.' + n.toString();
295
+ if (s.length > maxLength) return stringCut(s, maxLength);
296
+
297
+ n = new Int10();
298
+ bits = 0;
299
+ }
300
+ }
301
+ if (bits > 0) s += '.incomplete';
302
+ if (typeof oids === 'object') {
303
+ const oid = oids[s];
304
+ if (oid) {
305
+ if (oid.d) s += '\n' + oid.d;
306
+ if (oid.c) s += '\n' + oid.c;
307
+ if (oid.w) s += '\n(warning!)';
308
+ }
309
+ }
310
+ return s;
311
+ }
312
+ }
313
+
314
+ export default Stream;
@@ -0,0 +1,120 @@
1
+ // ASN.1 JavaScript decoder
2
+ // Copyright (c) 2008-2021 Lapo Luchini <lapo@lapo.it>
3
+
4
+ // Permission to use, copy, modify, and/or distribute this software for any
5
+ // purpose with or without fee is hereby granted, provided that the above
6
+ // copyright notice and this permission notice appear in all copies.
7
+ //
8
+ // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9
+ // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10
+ // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11
+ // ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12
+ // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13
+ // ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14
+ // OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15
+
16
+ import Stream from './Stream';
17
+ import ASN1, { ASN1Tag } from './Asn.1';
18
+
19
+ export function decodeLength(stream: Stream) {
20
+ let buf = stream.get(),
21
+ len = buf & 0x7f;
22
+ if (len == buf)
23
+ // first bit was 0, short form
24
+ return len;
25
+ if (len === 0)
26
+ // long form with length 0 is a special case
27
+ return null; // undefined length
28
+ if (len > 6)
29
+ // no reason to use Int10, as it would be a huge buffer anyways
30
+ throw 'Length over 48 bits not supported at position ' + (stream.pos - 1);
31
+ buf = 0;
32
+ for (var i = 0; i < len; ++i) buf = buf * 256 + stream.get();
33
+ return buf;
34
+ }
35
+
36
+ export function decode(pStream: Stream | string, offset?: number): any {
37
+ let stream: Stream =
38
+ pStream instanceof Stream ? pStream : new Stream(pStream, offset || 0);
39
+ const streamStart = new Stream(stream);
40
+ let tag = new ASN1Tag(stream);
41
+ const tagLen = stream.pos - streamStart.pos;
42
+ let len = decodeLength(stream);
43
+ let start = stream.pos;
44
+ const header = start - streamStart.pos;
45
+ let sub: any = null;
46
+ const getSub = () => {
47
+ sub = [];
48
+ if (len !== null) {
49
+ // definite length
50
+ var end = start + len;
51
+ // @ts-ignore
52
+ if (end > stream.enc.length)
53
+ throw (
54
+ 'Container at offset ' +
55
+ start +
56
+ ' has a length of ' +
57
+ len +
58
+ ', which is past the end of the stream'
59
+ );
60
+ while (stream.pos < end) {
61
+ sub[sub.length] = decode(stream);
62
+ }
63
+ if (stream.pos != end)
64
+ throw 'Content size is not correct for container at offset ' + start;
65
+ } else {
66
+ // undefined length
67
+ try {
68
+ for (;;) {
69
+ var s = decode(stream);
70
+ if (s.tag.isEOC()) break;
71
+ sub[sub.length] = s;
72
+ }
73
+ len = start - stream.pos; // undefined lengths are represented as negative values
74
+ } catch (e) {
75
+ throw (
76
+ 'Exception while decoding undefined length content at offset ' +
77
+ start +
78
+ ': ' +
79
+ e
80
+ );
81
+ }
82
+ }
83
+ };
84
+ if (tag.tagConstructed) {
85
+ // must have valid content
86
+ getSub();
87
+ } else if (
88
+ tag.isUniversal() &&
89
+ (tag.tagNumber == 0x03 || tag.tagNumber == 0x04)
90
+ ) {
91
+ // sometimes BitString and OctetString are used to encapsulate ASN.1
92
+ try {
93
+ if (tag.tagNumber == 0x03)
94
+ if (stream.get() != 0)
95
+ throw 'BIT STRINGs with unused bits cannot encapsulate.';
96
+ getSub();
97
+ if (sub) {
98
+ for (var i = 0; i < sub.length; ++i)
99
+ if (sub[i].tag.isEOC())
100
+ throw 'EOC is not supposed to be actual content.';
101
+ }
102
+ } catch (e) {
103
+ // but silently ignore when they don't
104
+ sub = null;
105
+ //DEBUG console.log('Could not decode structure at ' + start + ':', e);
106
+ }
107
+ }
108
+ if (sub === null) {
109
+ if (len === null)
110
+ throw (
111
+ "We can't skip over an invalid tag with undefined length at offset " +
112
+ start
113
+ );
114
+ stream.pos = start + Math.abs(len);
115
+ }
116
+
117
+ return new ASN1(streamStart, header, len as number, tag, tagLen, sub);
118
+ }
119
+
120
+ export default decode;
@@ -0,0 +1,97 @@
1
+ // Base64 JavaScript decoder
2
+ // Copyright (c) 2008-2021 Lapo Luchini <lapo@lapo.it>
3
+
4
+ // Permission to use, copy, modify, and/or distribute this software for any
5
+ // purpose with or without fee is hereby granted, provided that the above
6
+ // copyright notice and this permission notice appear in all copies.
7
+ //
8
+ // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9
+ // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10
+ // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11
+ // ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12
+ // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13
+ // ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14
+ // OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15
+
16
+ var decoder: any[] | undefined, // populated on first usage
17
+ haveU8 = typeof Uint8Array == 'function';
18
+
19
+ export const decode = function (a: any) {
20
+ var isString = typeof a == 'string';
21
+ var i;
22
+ if (decoder === undefined) {
23
+ var b64 =
24
+ 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/',
25
+ ignore = '= \f\n\r\t\u00A0\u2028\u2029';
26
+ decoder = [];
27
+ for (i = 0; i < 64; ++i) decoder[b64.charCodeAt(i)] = i;
28
+ for (i = 0; i < ignore.length; ++i) decoder[ignore.charCodeAt(i)] = -1;
29
+ // RFC 3548 URL & file safe encoding
30
+ decoder['-'.charCodeAt(0)] = decoder['+'.charCodeAt(0)];
31
+ decoder['_'.charCodeAt(0)] = decoder['/'.charCodeAt(0)];
32
+ }
33
+ var out: any = haveU8 ? new Uint8Array((a.length * 3) >> 2) : [];
34
+ var bits = 0,
35
+ char_count = 0,
36
+ len = 0;
37
+ for (i = 0; i < a.length; ++i) {
38
+ var c = isString ? a.charCodeAt(i) : a[i];
39
+ if (c == 61)
40
+ // '='.charCodeAt(0)
41
+ break;
42
+ c = decoder[c];
43
+ if (c == -1) continue;
44
+ if (c === undefined) throw 'Illegal character at offset ' + i;
45
+ bits |= c;
46
+ if (++char_count >= 4) {
47
+ out[len++] = bits >> 16;
48
+ out[len++] = (bits >> 8) & 0xff;
49
+ out[len++] = bits & 0xff;
50
+ bits = 0;
51
+ char_count = 0;
52
+ } else {
53
+ bits <<= 6;
54
+ }
55
+ }
56
+ switch (char_count) {
57
+ case 1:
58
+ throw 'Base64 encoding incomplete: at least 2 bits missing';
59
+ case 2:
60
+ out[len++] = bits >> 10;
61
+ break;
62
+ case 3:
63
+ out[len++] = bits >> 16;
64
+ out[len++] = (bits >> 8) & 0xff;
65
+ break;
66
+ }
67
+ if (haveU8 && out.length > len) {
68
+ // in case it was originally longer because of ignored characters
69
+ out = out.subarray(0, len);
70
+ }
71
+ return out;
72
+ };
73
+
74
+ export const pretty = function (str: string) {
75
+ // fix padding
76
+ if (str.length % 4 > 0)
77
+ str = (str + '===').slice(0, str.length + (str.length % 4));
78
+ // convert RFC 3548 to standard Base64
79
+ str = str.replace(/-/g, '+').replace(/_/g, '/');
80
+ // 80 column width
81
+ return str.replace(/(.{80})/g, '$1\n');
82
+ };
83
+
84
+ export const re =
85
+ /-----BEGIN [^-]+-----([A-Za-z0-9+/=\s]+)-----END [^-]+-----|begin-base64[^\n]+\n([A-Za-z0-9+/=\s]+)====|^([A-Za-z0-9+/=\s]+)$/;
86
+
87
+ export const unarmor = function (a: any) {
88
+ var m = re.exec(a);
89
+ if (m) {
90
+ if (m[1]) a = m[1];
91
+ else if (m[2]) a = m[2];
92
+ else if (m[3]) a = m[3];
93
+ else throw 'RegExp out of sync';
94
+ }
95
+
96
+ return decode(a);
97
+ };
@@ -0,0 +1,60 @@
1
+ // Hex JavaScript decoder
2
+ // Copyright (c) 2008-2021 Lapo Luchini <lapo@lapo.it>
3
+
4
+ // Permission to use, copy, modify, and/or distribute this software for any
5
+ // purpose with or without fee is hereby granted, provided that the above
6
+ // copyright notice and this permission notice appear in all copies.
7
+ //
8
+ // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9
+ // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10
+ // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11
+ // ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12
+ // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13
+ // ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14
+ // OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15
+
16
+ var decoder: number[] | undefined, // populated on first usage
17
+ haveU8 = typeof Uint8Array == 'function';
18
+
19
+ /**
20
+ * Decodes an hexadecimal value.
21
+ * @param {string|Array|Uint8Array} a - a string representing hexadecimal data, or an array representation of its charcodes
22
+ */
23
+ export const hexDecode = function (a: any): any {
24
+ var isString = typeof a == 'string';
25
+ var i;
26
+ if (decoder === undefined) {
27
+ var hex = '0123456789ABCDEF',
28
+ ignore = ' \f\n\r\t\u00A0\u2028\u2029';
29
+ decoder = [];
30
+ for (i = 0; i < 16; ++i) decoder[hex.charCodeAt(i)] = i;
31
+ hex = hex.toLowerCase();
32
+ for (i = 10; i < 16; ++i) decoder[hex.charCodeAt(i)] = i;
33
+ for (i = 0; i < ignore.length; ++i) decoder[ignore.charCodeAt(i)] = -1;
34
+ }
35
+ var out = haveU8 ? new Uint8Array(a.length >> 1) : [],
36
+ bits = 0,
37
+ char_count = 0,
38
+ len = 0;
39
+ for (i = 0; i < a.length; ++i) {
40
+ // @ts-ignore
41
+ var c = isString ? a.charCodeAt(i) : a[i];
42
+ c = decoder[c];
43
+ if (c == -1) continue;
44
+ if (c === undefined) throw 'Illegal character at offset ' + i;
45
+ bits |= c;
46
+ if (++char_count >= 2) {
47
+ out[len++] = bits;
48
+ bits = 0;
49
+ char_count = 0;
50
+ } else {
51
+ bits <<= 4;
52
+ }
53
+ }
54
+ if (char_count) throw 'Hex encoding incomplete: 4 bits missing';
55
+ if (haveU8 && out.length > len)
56
+ // in case it was originally longer because of ignored characters
57
+ // @ts-ignore
58
+ out = out.subarray(0, len);
59
+ return out;
60
+ };
@@ -0,0 +1,5 @@
1
+ export * as Hex from './hex';
2
+ export * as Asn1 from './asn1';
3
+ export { default as Int10 } from './int10';
4
+ export { default as Oids } from './oids';
5
+ export * as Base64 from './base64';
@@ -0,0 +1,103 @@
1
+ // Big integer base-10 printing library
2
+ // Copyright (c) 2008-2021 Lapo Luchini <lapo@lapo.it>
3
+
4
+ // Permission to use, copy, modify, and/or distribute this software for any
5
+ // purpose with or without fee is hereby granted, provided that the above
6
+ // copyright notice and this permission notice appear in all copies.
7
+ //
8
+ // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9
+ // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10
+ // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11
+ // ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12
+ // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13
+ // ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14
+ // OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15
+
16
+ var max = 10000000000000; // biggest 10^n integer that can still fit 2^53 when multiplied by 256
17
+
18
+ /**
19
+ * Arbitrary length base-10 value.
20
+ * @param {number} value - Optional initial value (will be 0 otherwise).
21
+ */
22
+ class Int10 {
23
+ buf: number[];
24
+ constructor(value?: number) {
25
+ this.buf = value ? [+value] : [0];
26
+ }
27
+
28
+ /**
29
+ * Multiply value by m and add c.
30
+ * @param {number} m - multiplier, must be < =256
31
+ * @param {number} c - value to add
32
+ */
33
+ mulAdd(m: number, c: number) {
34
+ // assert(m <= 256)
35
+ var b = this.buf,
36
+ l = b.length,
37
+ i,
38
+ t;
39
+ for (i = 0; i < l; ++i) {
40
+ t = b[i] * m + c;
41
+ if (t < max) c = 0;
42
+ else {
43
+ c = 0 | (t / max);
44
+ t -= c * max;
45
+ }
46
+ b[i] = t;
47
+ }
48
+ if (c > 0) b[i] = c;
49
+ }
50
+
51
+ /**
52
+ * Subtract value.
53
+ * @param {number} c - value to subtract
54
+ */
55
+ sub(c: number) {
56
+ var b = this.buf,
57
+ l = b.length,
58
+ i,
59
+ t;
60
+ for (i = 0; i < l; ++i) {
61
+ t = b[i] - c;
62
+ if (t < 0) {
63
+ t += max;
64
+ c = 1;
65
+ } else c = 0;
66
+ b[i] = t;
67
+ }
68
+ while (b[b.length - 1] === 0) b.pop();
69
+ }
70
+
71
+ /**
72
+ * Convert to decimal string representation.
73
+ * @param {*} base - optional value, only value accepted is 10
74
+ */
75
+ toString(base?: any) {
76
+ if ((base || 10) != 10) throw 'only base 10 is supported';
77
+ var b = this.buf,
78
+ s = b[b.length - 1].toString();
79
+ for (var i = b.length - 2; i >= 0; --i)
80
+ s += (max + b[i]).toString().substring(1);
81
+ return s;
82
+ }
83
+
84
+ /**
85
+ * Convert to Number value representation.
86
+ * Will probably overflow 2^53 and thus become approximate.
87
+ */
88
+ valueOf() {
89
+ var b = this.buf,
90
+ v = 0;
91
+ for (var i = b.length - 1; i >= 0; --i) v = v * max + b[i];
92
+ return v;
93
+ }
94
+
95
+ /**
96
+ * Return value as a simple Number (if it is <= 10000000000000), or return this.
97
+ */
98
+ simplify() {
99
+ var b = this.buf;
100
+ return b.length == 1 ? b[0] : this;
101
+ }
102
+ }
103
+ export default Int10;