@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.
- package/.babelrc +14 -0
- package/.eslintignore +2 -0
- package/.eslintrc.json +18 -0
- package/.prettierrc.json +9 -0
- package/dist/OFD.d.ts +8 -0
- package/dist/Pages.d.ts +7 -0
- package/dist/RootDocumnet.d.ts +1 -0
- package/dist/bundle.cjs.js +64123 -0
- package/dist/bundle.esm.js +64115 -0
- package/dist/bundle.iife.js +14743 -0
- package/dist/bundle.umd.js +64045 -0
- package/dist/constant/index.d.ts +7 -0
- package/dist/constant.d.ts +6 -0
- package/dist/core/ofd-core/Annotations/AnnotationsXml.d.ts +16 -0
- package/dist/core/ofd-core/Asn.1Utils.d.ts +47 -0
- package/dist/core/ofd-core/Documents/DocumentResXml.d.ts +15 -0
- package/dist/core/ofd-core/Documents/DocumnetXml.d.ts +25 -0
- package/dist/core/ofd-core/Documents/PublicResXml.d.ts +15 -0
- package/dist/core/ofd-core/OFDElement.d.ts +232 -0
- package/dist/core/ofd-core/Ofd/OFDXml.d.ts +19 -0
- package/dist/core/ofd-core/Pages/PageXml.d.ts +20 -0
- package/dist/core/ofd-core/Signatures/Signatures.d.ts +20 -0
- package/dist/core/ofd-core/TemplatePages/TemplatePages.d.ts +20 -0
- package/dist/core/ofd-core/constant.d.ts +29 -0
- package/dist/core/ofd-core/utils.d.ts +21 -0
- package/dist/dicom/dicom.d.ts +15 -0
- package/dist/dicom/index.d.ts +1 -0
- package/dist/errors/ErrorHandle.d.ts +6 -0
- package/dist/errors/ErrorMsg.d.ts +16 -0
- package/dist/errors/FetchErrors.d.ts +4 -0
- package/dist/errors/MimeError.d.ts +4 -0
- package/dist/errors/OFDErrors.d.ts +4 -0
- package/dist/errors/UnzipErrors.d.ts +4 -0
- package/dist/errors/XmlErrors.d.ts +4 -0
- package/dist/errors/error-msg.d.ts +9 -0
- package/dist/es.d.ts +2 -0
- package/dist/index.d.ts +6 -0
- package/dist/lib/ParseFile.d.ts +7 -0
- package/dist/lib/UnitCoversion.d.ts +31 -0
- package/dist/lib/asn1/Asn.1.d.ts +34 -0
- package/dist/lib/asn1/Stream.d.ts +27 -0
- package/dist/lib/asn1/asn1.d.ts +4 -0
- package/dist/lib/asn1/base64.d.ts +4 -0
- package/dist/lib/asn1/hex.d.ts +5 -0
- package/dist/lib/asn1/index.d.ts +5 -0
- package/dist/lib/asn1/int10.d.ts +34 -0
- package/dist/lib/asn1/oids.d.ts +2 -0
- package/dist/lib/asn1/string-cut.d.ts +2 -0
- package/dist/lib/decode-html.d.ts +7 -0
- package/dist/lib/fetch.d.ts +17 -0
- package/dist/lib/is-element.d.ts +5 -0
- package/dist/lib/load-files.d.ts +3 -0
- package/dist/lib/load-opentype.d.ts +34 -0
- package/dist/lib/load-script.d.ts +1 -0
- package/dist/lib/mime.d.ts +8 -0
- package/dist/lib/read-buffer.d.ts +2 -0
- package/dist/lib/toFixeds.d.ts +7 -0
- package/dist/libs/Asn.1Utils.d.ts +47 -0
- package/dist/libs/asn1/Asn.1.d.ts +34 -0
- package/dist/libs/asn1/Stream.d.ts +27 -0
- package/dist/libs/asn1/asn1.d.ts +4 -0
- package/dist/libs/asn1/base64.d.ts +4 -0
- package/dist/libs/asn1/hex.d.ts +5 -0
- package/dist/libs/asn1/index.d.ts +5 -0
- package/dist/libs/asn1/int10.d.ts +34 -0
- package/dist/libs/asn1/oids.d.ts +2 -0
- package/dist/libs/asn1/string-cut.d.ts +2 -0
- package/dist/libs/decode-html.d.ts +7 -0
- package/dist/libs/fetch.d.ts +17 -0
- package/dist/libs/mime.d.ts +8 -0
- package/dist/libs/ofdArray.d.ts +10 -0
- package/dist/libs/ofdImageObject.d.ts +9 -0
- package/dist/libs/ofdLayer.d.ts +3 -0
- package/dist/libs/ofdName.d.ts +17 -0
- package/dist/libs/ofdPathObject.d.ts +11 -0
- package/dist/libs/ofdTextObject.d.ts +6 -0
- package/dist/libs/parseAnnotation.d.ts +5 -0
- package/dist/libs/parseColor.d.ts +5 -0
- package/dist/libs/parsePageArea.d.ts +17 -0
- package/dist/libs/parser-elements.d.ts +8 -0
- package/dist/libs/parserElements.d.ts +8 -0
- package/dist/libs/pipeExtensions.d.ts +4 -0
- package/dist/libs/read-buffer.d.ts +2 -0
- package/dist/main.d.ts +15 -0
- package/dist/ofd/ConverterDpi.d.ts +16 -0
- package/dist/ofd/index.d.ts +1 -0
- package/dist/ofd/ofd-utils.d.ts +137 -0
- package/dist/ofd/ofd.d.ts +35 -0
- package/dist/ofd/parse-ofd.d.ts +18 -0
- package/dist/ofd/render.d.ts +18 -0
- package/dist/ofd/svg-image.d.ts +12 -0
- package/dist/ofd/svg-path.d.ts +5 -0
- package/dist/ofd/svg-text.d.ts +8 -0
- package/dist/ofd.parse.d.ts +6 -0
- package/dist/ofd.xml.d.ts +1 -0
- package/dist/ofdParse.d.ts +6 -0
- package/dist/pipe/annotations.d.ts +13 -0
- package/dist/pipe/attachments.d.ts +13 -0
- package/dist/pipe/commonData.d.ts +18 -0
- package/dist/pipe/customTags.d.ts +14 -0
- package/dist/pipe/extensions.d.ts +14 -0
- package/dist/pipe/output.d.ts +7 -0
- package/dist/pipe/pages.d.ts +13 -0
- package/dist/pipe/permissions.d.ts +14 -0
- package/dist/pipe/pipeline.d.ts +63 -0
- package/dist/pipe/startPipe.d.ts +11 -0
- package/dist/xml/index.d.ts +2 -0
- package/dist/xml/render.d.ts +6 -0
- package/dist/xml/xml.d.ts +18 -0
- package/package.json +47 -0
- package/public/index.html +75 -0
- package/public/opentype.min.js +2 -0
- package/rollup.config.dev.mjs +47 -0
- package/rollup.config.mjs +70 -0
- package/src/constant/index.ts +13 -0
- package/src/core/ofd-core/Annotations/Annotation.km +206 -0
- package/src/core/ofd-core/Annotations/Annotations.km +59 -0
- package/src/core/ofd-core/Annotations/Annotations.md +13 -0
- package/src/core/ofd-core/Annotations/AnnotationsXml.ts +114 -0
- package/src/core/ofd-core/Asn.1Utils.ts +225 -0
- package/src/core/ofd-core/Documents/DocumentResXml.ts +55 -0
- package/src/core/ofd-core/Documents/Documnet.km +862 -0
- package/src/core/ofd-core/Documents/DocumnetXml.ts +118 -0
- package/src/core/ofd-core/Documents/Documnets.md +296 -0
- package/src/core/ofd-core/Documents/PublicResXml.ts +63 -0
- 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
- 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
- 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
- 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
- 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
- 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
- package/src/core/ofd-core/OFDElement.ts +724 -0
- package/src/core/ofd-core/Ofd/CT_DocInfo.km +197 -0
- package/src/core/ofd-core/Ofd/OFD.km +114 -0
- package/src/core/ofd-core/Ofd/OFD.md +99 -0
- package/src/core/ofd-core/Ofd/OFDXml.ts +69 -0
- package/src/core/ofd-core/Pages/PAGE.md +40 -0
- package/src/core/ofd-core/Pages/PageXml.ts +59 -0
- package/src/core/ofd-core/Signatures/Signature.km +308 -0
- package/src/core/ofd-core/Signatures/Signature.md +21 -0
- package/src/core/ofd-core/Signatures/Signatures.km +315 -0
- package/src/core/ofd-core/Signatures/Signatures.md +24 -0
- package/src/core/ofd-core/Signatures/Signatures.ts +247 -0
- package/src/core/ofd-core/TemplatePages/TemplatePages.ts +56 -0
- package/src/core/ofd-core/asn.md +60 -0
- package/src/core/ofd-core/constant.ts +35 -0
- package/src/core/ofd-core/index.d.ts +867 -0
- package/src/core/ofd-core/utils.ts +86 -0
- package/src/dicom/dicom.ts +42 -0
- package/src/dicom/index.ts +1 -0
- package/src/errors/ErrorHandle.ts +14 -0
- package/src/errors/FetchErrors.ts +8 -0
- package/src/errors/MimeError.ts +9 -0
- package/src/errors/OFDErrors.ts +11 -0
- package/src/errors/UnzipErrors.ts +9 -0
- package/src/errors/XmlErrors.ts +11 -0
- package/src/errors/error-msg.ts +17 -0
- package/src/es.ts +3 -0
- package/src/global.d.ts +7 -0
- package/src/index.ts +7 -0
- package/src/lib/ParseFile.ts +12 -0
- package/src/lib/README.md +69 -0
- package/src/lib/UnitCoversion.ts +55 -0
- package/src/lib/asn1/Asn.1.ts +284 -0
- package/src/lib/asn1/README.md +1 -0
- package/src/lib/asn1/Stream.ts +314 -0
- package/src/lib/asn1/asn1.ts +120 -0
- package/src/lib/asn1/base64.ts +97 -0
- package/src/lib/asn1/hex.ts +60 -0
- package/src/lib/asn1/index.ts +5 -0
- package/src/lib/asn1/int10.ts +103 -0
- package/src/lib/asn1/oids.ts +6164 -0
- package/src/lib/asn1/string-cut.ts +8 -0
- package/src/lib/decode-html.ts +37 -0
- package/src/lib/fetch.ts +70 -0
- package/src/lib/is-element.ts +13 -0
- package/src/lib/jbig/README.md +1 -0
- package/src/lib/jbig/arithmetic_decoder.js +184 -0
- package/src/lib/jbig/base_stream.js +117 -0
- package/src/lib/jbig/ccitt.js +1068 -0
- package/src/lib/jbig/ccitt_stream.js +60 -0
- package/src/lib/jbig/compatibility.js +108 -0
- package/src/lib/jbig/core_utils.js +591 -0
- package/src/lib/jbig/decode_stream.js +184 -0
- package/src/lib/jbig/is_node.js +28 -0
- package/src/lib/jbig/jbig2.js +2582 -0
- package/src/lib/jbig/jbig2_stream.js +78 -0
- package/src/lib/jbig/primitives.js +441 -0
- package/src/lib/jbig/stream.js +101 -0
- package/src/lib/jbig/util.js +1231 -0
- package/src/lib/load-files.ts +26 -0
- package/src/lib/load-opentype.ts +161 -0
- package/src/lib/load-script.ts +33 -0
- package/src/lib/mime.ts +97 -0
- package/src/lib/read-buffer.ts +19 -0
- package/src/lib/toFixeds.ts +56 -0
- package/src/ofd/ConverterDpi.ts +35 -0
- package/src/ofd/OFD.md +38 -0
- package/src/ofd/TODO.md +10 -0
- package/src/ofd/index.ts +1 -0
- package/src/ofd/ofd-utils.ts +627 -0
- package/src/ofd/ofd.demo.md +12 -0
- package/src/ofd/ofd.ts +200 -0
- package/src/ofd/ofdxml.km +162 -0
- package/src/ofd/parse-ofd.ts +103 -0
- package/src/ofd/render.ts +393 -0
- package/src/ofd/svg-image.ts +318 -0
- package/src/ofd/svg-path.ts +283 -0
- package/src/ofd/svg-text.ts +272 -0
- package/src/xml/index.ts +3 -0
- package/src/xml/render.ts +171 -0
- package/src/xml/xml.ts +136 -0
- 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,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;
|