@futpib/parser 1.0.1 → 1.0.2

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 (304) hide show
  1. package/build/allSettledStream.js +32 -14
  2. package/build/allSettledStream.test.js +32 -0
  3. package/build/androidPackage.d.ts +39 -0
  4. package/build/androidPackageParser.d.ts +17 -0
  5. package/build/androidPackageParser.js +183 -0
  6. package/build/{apkParser.test.js → androidPackageParser.test.js} +6 -6
  7. package/build/androidPackageUnparser.d.ts +4 -0
  8. package/build/{apkUnparser.js → androidPackageUnparser.js} +23 -23
  9. package/build/androidPackageUnparser.test.js +26 -0
  10. package/build/arbitrarilySlicedAsyncInterable.d.ts +3 -1
  11. package/build/arbitrarilySlicedAsyncInterable.js +3 -3
  12. package/build/arrayParser.test.js +3 -3
  13. package/build/backsmali.d.ts +1 -0
  14. package/build/backsmali.js +22 -0
  15. package/build/bsonParser.js +6 -2
  16. package/build/customInvariant.d.ts +1 -1
  17. package/build/dalvikBytecodeParser/formatParsers.d.ts +97 -0
  18. package/build/dalvikBytecodeParser/formatParsers.js +169 -0
  19. package/build/dalvikBytecodeParser.d.ts +107 -0
  20. package/build/dalvikBytecodeParser.js +836 -0
  21. package/build/dalvikExecutable.d.ts +158 -0
  22. package/build/dalvikExecutable.js +20 -0
  23. package/build/dalvikExecutableParser/stringSyntaxParser.d.ts +4 -0
  24. package/build/dalvikExecutableParser/stringSyntaxParser.js +76 -0
  25. package/build/dalvikExecutableParser/typeParsers.d.ts +10 -0
  26. package/build/dalvikExecutableParser/typeParsers.js +34 -0
  27. package/build/dalvikExecutableParser/typedNumbers.d.ts +90 -0
  28. package/build/dalvikExecutableParser/typedNumbers.js +19 -0
  29. package/build/dalvikExecutableParser.d.ts +5 -0
  30. package/build/dalvikExecutableParser.js +1439 -0
  31. package/build/dalvikExecutableParser.test.js +70 -0
  32. package/build/dalvikExecutableParserAgainstSmaliParser.test.js +298 -0
  33. package/build/debugLogInputParser.d.ts +4 -0
  34. package/build/debugLogInputParser.js +16 -0
  35. package/build/debugLogParser.js +14 -3
  36. package/build/disjunctionParser.d.ts +2 -1
  37. package/build/disjunctionParser.js +4 -2
  38. package/build/elementTerminatedArrayParser.d.ts +3 -0
  39. package/build/elementTerminatedArrayParser.js +18 -0
  40. package/build/elementTerminatedArrayParser.test.js +52 -0
  41. package/build/elementTerminatedSequenceArrayParser.d.ts +3 -0
  42. package/build/elementTerminatedSequenceArrayParser.js +32 -0
  43. package/build/elementTerminatedSequenceArrayParser.test.js +34 -0
  44. package/build/elementTerminatedSequenceParser.d.ts +3 -0
  45. package/build/elementTerminatedSequenceParser.js +27 -0
  46. package/build/elementTerminatedSequenceParser.test.js +34 -0
  47. package/build/exactElementParser.js +10 -5
  48. package/build/exactSequenceParser.d.ts +2 -1
  49. package/build/exactSequenceParser.js +12 -2
  50. package/build/fetchCid.d.ts +1 -0
  51. package/build/fetchCid.js +107 -0
  52. package/build/fixedLengthSequenceParser.d.ts +1 -0
  53. package/build/fixedLengthSequenceParser.js +18 -1
  54. package/build/fixedLengthSequenceParser.test.js +41 -0
  55. package/build/hasExecutable.d.ts +1 -0
  56. package/build/hasExecutable.js +8 -0
  57. package/build/highResolutionTimer.d.ts +16 -0
  58. package/build/highResolutionTimer.js +42 -0
  59. package/build/inputReader.d.ts +11 -0
  60. package/build/inputReader.js +37 -0
  61. package/build/inputReader.test.js +165 -0
  62. package/build/inputReaderState.d.ts +10 -0
  63. package/build/inputReaderState.js +16 -0
  64. package/build/inspect.d.ts +1 -0
  65. package/build/inspect.js +7 -0
  66. package/build/javaKeyStoreParser.test.js +2 -2
  67. package/build/jsonParser.d.ts +2 -0
  68. package/build/jsonParser.js +11 -14
  69. package/build/leb128Parser.d.ts +7 -0
  70. package/build/leb128Parser.js +82 -0
  71. package/build/leb128Parser.test.js +107 -0
  72. package/build/lookaheadParser.d.ts +2 -0
  73. package/build/lookaheadParser.js +14 -0
  74. package/build/negativeLookaheadParser.js +21 -15
  75. package/build/negativeLookaheadParser.test.js +30 -0
  76. package/build/nonEmptyArrayParser.d.ts +2 -0
  77. package/build/nonEmptyArrayParser.js +32 -0
  78. package/build/nonEmptyArrayParser.test.js +16 -0
  79. package/build/parser.d.ts +10 -1
  80. package/build/parser.js +66 -31
  81. package/build/parser.test.js +79 -12
  82. package/build/parserAccessorParser.js +9 -1
  83. package/build/parserConsumedSequenceParser.js +20 -15
  84. package/build/parserContext.d.ts +14 -0
  85. package/build/parserContext.js +56 -27
  86. package/build/parserContext.test.js +27 -0
  87. package/build/parserCreatorCompose.d.ts +1 -0
  88. package/build/parserCreatorCompose.js +8 -2
  89. package/build/parserError.d.ts +6 -0
  90. package/build/parserError.js +6 -6
  91. package/build/parserInputCompanion.d.ts +15 -0
  92. package/build/parserInputCompanion.js +38 -0
  93. package/build/promiseCompose.d.ts +1 -1
  94. package/build/promiseCompose.js +12 -1
  95. package/build/promiseSettled.d.ts +1 -0
  96. package/build/promiseSettled.js +4 -0
  97. package/build/separatedArrayParser.d.ts +2 -0
  98. package/build/separatedArrayParser.js +39 -0
  99. package/build/separatedArrayParser.test.d.ts +1 -0
  100. package/build/separatedArrayParser.test.js +21 -0
  101. package/build/sequenceBuffer.d.ts +10 -0
  102. package/build/sequenceBuffer.js +54 -2
  103. package/build/sequenceBuffer.test.js +57 -0
  104. package/build/sequenceTerminatedSequenceParser.d.ts +5 -0
  105. package/build/sequenceTerminatedSequenceParser.js +32 -0
  106. package/build/sequenceTerminatedSequenceParser.test.d.ts +1 -0
  107. package/build/sequenceTerminatedSequenceParser.test.js +37 -0
  108. package/build/skipParser.d.ts +1 -1
  109. package/build/skipParser.js +4 -2
  110. package/build/skipToParser.d.ts +2 -0
  111. package/build/skipToParser.js +11 -0
  112. package/build/sliceBoundedParser.d.ts +1 -1
  113. package/build/sliceBoundedParser.js +7 -2
  114. package/build/sliceBoundedParser.test.js +35 -1
  115. package/build/smali.d.ts +1 -0
  116. package/build/smali.js +17 -0
  117. package/build/smaliParser.d.ts +12 -0
  118. package/build/smaliParser.js +656 -0
  119. package/build/smaliParser.test.d.ts +1 -0
  120. package/build/smaliParser.test.js +115 -0
  121. package/build/terminatedArrayParser.d.ts +3 -1
  122. package/build/terminatedArrayParser.js +79 -2
  123. package/build/terminatedArrayParser.test.d.ts +1 -0
  124. package/build/terminatedArrayParser.test.js +131 -0
  125. package/build/toAsyncIterable.d.ts +1 -0
  126. package/build/toAsyncIterable.js +7 -0
  127. package/build/toAsyncIterator.d.ts +1 -0
  128. package/build/toAsyncIterator.js +33 -0
  129. package/build/tupleParser.d.ts +4 -0
  130. package/build/tupleParser.js +1 -5
  131. package/build/unionParser.d.ts +2 -1
  132. package/build/unionParser.js +27 -12
  133. package/build/unionParser.test.d.ts +1 -0
  134. package/build/unionParser.test.js +60 -0
  135. package/build/zipParser.d.ts +7 -2
  136. package/build/zipParser.js +36 -12
  137. package/build/zipUnparser.d.ts +4 -1
  138. package/build/zipUnparser.js +55 -26
  139. package/build/zipUnparser.test.js +14 -14
  140. package/package.json +23 -7
  141. package/src/allSettledStream.test.ts +40 -0
  142. package/src/allSettledStream.ts +47 -15
  143. package/src/androidPackage.ts +48 -0
  144. package/src/{apkParser.test.ts → androidPackageParser.test.ts} +6 -7
  145. package/src/{apkParser.test.ts.md → androidPackageParser.test.ts.md} +4 -4
  146. package/src/androidPackageParser.test.ts.snap +0 -0
  147. package/src/androidPackageParser.ts +440 -0
  148. package/src/androidPackageUnparser.test.ts +36 -0
  149. package/src/androidPackageUnparser.ts +120 -0
  150. package/src/arbitrarilySlicedAsyncInterable.ts +7 -2
  151. package/src/arrayParser.test.ts +3 -3
  152. package/src/backsmali.ts +30 -0
  153. package/src/bsonParser.ts +13 -2
  154. package/src/customInvariant.ts +1 -1
  155. package/src/dalvikBytecodeParser/formatParsers.ts +421 -0
  156. package/src/dalvikBytecodeParser.ts +2074 -0
  157. package/src/dalvikExecutable.ts +220 -0
  158. package/src/dalvikExecutableParser/stringSyntaxParser.ts +145 -0
  159. package/src/dalvikExecutableParser/typeParsers.ts +65 -0
  160. package/src/dalvikExecutableParser/typedNumbers.ts +57 -0
  161. package/src/dalvikExecutableParser.test.ts +89 -0
  162. package/src/dalvikExecutableParser.test.ts.md +634 -0
  163. package/src/dalvikExecutableParser.test.ts.snap +0 -0
  164. package/src/dalvikExecutableParser.ts +2768 -0
  165. package/src/dalvikExecutableParserAgainstSmaliParser.test.ts +346 -0
  166. package/src/debugLogInputParser.ts +28 -0
  167. package/src/debugLogParser.ts +19 -3
  168. package/src/disjunctionParser.ts +10 -5
  169. package/src/elementTerminatedArrayParser.test.ts +99 -0
  170. package/src/elementTerminatedArrayParser.ts +31 -0
  171. package/src/elementTerminatedSequenceArrayParser.test.ts +54 -0
  172. package/src/elementTerminatedSequenceArrayParser.ts +52 -0
  173. package/src/elementTerminatedSequenceParser.test.ts +54 -0
  174. package/src/elementTerminatedSequenceParser.ts +43 -0
  175. package/src/exactElementParser.ts +17 -11
  176. package/src/exactSequenceParser.ts +23 -2
  177. package/src/fetchCid.ts +125 -0
  178. package/src/fixedLengthSequenceParser.test.ts +77 -0
  179. package/src/fixedLengthSequenceParser.ts +28 -1
  180. package/src/hasExecutable.ts +11 -0
  181. package/src/highResolutionTimer.ts +49 -0
  182. package/src/inputReader.test.ts +209 -0
  183. package/src/inputReader.ts +75 -0
  184. package/src/inputReaderState.ts +33 -0
  185. package/src/inspect.ts +9 -0
  186. package/src/javaKeyStoreParser.test.ts +2 -3
  187. package/src/jsonParser.ts +13 -25
  188. package/src/leb128Parser.test.ts +171 -0
  189. package/src/leb128Parser.ts +125 -0
  190. package/src/lookaheadParser.ts +19 -0
  191. package/src/negativeLookaheadParser.test.ts +53 -0
  192. package/src/negativeLookaheadParser.ts +26 -14
  193. package/src/nonEmptyArrayParser.test.ts +20 -0
  194. package/src/nonEmptyArrayParser.ts +44 -0
  195. package/src/optionalParser.ts +1 -0
  196. package/src/parser.test.ts +131 -12
  197. package/src/parser.test.ts.md +21 -21
  198. package/src/parser.test.ts.snap +0 -0
  199. package/src/parser.ts +149 -45
  200. package/src/parserAccessorParser.ts +12 -2
  201. package/src/parserConsumedSequenceParser.ts +25 -16
  202. package/src/parserContext.test.ts +31 -0
  203. package/src/parserContext.ts +109 -37
  204. package/src/parserCreatorCompose.ts +20 -2
  205. package/src/parserError.ts +9 -6
  206. package/src/parserInputCompanion.ts +55 -0
  207. package/src/promiseCompose.ts +17 -3
  208. package/src/promiseSettled.ts +6 -0
  209. package/src/separatedArrayParser.test.ts +34 -0
  210. package/src/separatedArrayParser.ts +55 -0
  211. package/src/sequenceBuffer.test.ts +70 -0
  212. package/src/sequenceBuffer.ts +88 -2
  213. package/src/sequenceTerminatedSequenceParser.test.ts +60 -0
  214. package/src/sequenceTerminatedSequenceParser.ts +62 -0
  215. package/src/skipParser.ts +7 -5
  216. package/src/skipToParser.ts +16 -0
  217. package/src/sliceBoundedParser.test.ts +43 -1
  218. package/src/sliceBoundedParser.ts +19 -1
  219. package/src/smali.ts +24 -0
  220. package/src/smaliParser.test.ts +132 -0
  221. package/src/smaliParser.test.ts.md +2320 -0
  222. package/src/smaliParser.test.ts.snap +0 -0
  223. package/src/smaliParser.ts +1166 -0
  224. package/src/terminatedArrayParser.test.ts +258 -0
  225. package/src/terminatedArrayParser.ts +108 -3
  226. package/src/toAsyncIterable.ts +7 -0
  227. package/src/toAsyncIterator.ts +48 -0
  228. package/src/tupleParser.ts +8 -5
  229. package/src/unionParser.test.ts +79 -0
  230. package/src/unionParser.ts +44 -16
  231. package/src/zipParser.ts +77 -18
  232. package/src/zipUnparser.test.ts +18 -18
  233. package/src/zipUnparser.ts +88 -27
  234. package/build/apk.d.ts +0 -39
  235. package/build/apkParser.d.ts +0 -16
  236. package/build/apkParser.js +0 -164
  237. package/build/apkUnparser.d.ts +0 -4
  238. package/build/apkUnparser.test.js +0 -26
  239. package/build/arbitraryDosDate.d.ts +0 -2
  240. package/build/arbitraryDosDate.js +0 -8
  241. package/build/arbitraryZipEntry.d.ts +0 -3
  242. package/build/arbitraryZipEntry.js +0 -26
  243. package/build/createDisjunctionParser.d.ts +0 -2
  244. package/build/createDisjunctionParser.js +0 -47
  245. package/build/createExactParser.d.ts +0 -2
  246. package/build/createExactParser.js +0 -12
  247. package/build/createSequentialUnionParser.d.ts +0 -2
  248. package/build/createSequentialUnionParser.js +0 -69
  249. package/build/fixedLengthChunkParser.d.ts +0 -2
  250. package/build/fixedLengthChunkParser.js +0 -12
  251. package/build/fixedLengthParser.d.ts +0 -2
  252. package/build/fixedLengthParser.js +0 -12
  253. package/build/inputChunkBuffer.d.ts +0 -15
  254. package/build/inputChunkBuffer.js +0 -40
  255. package/build/inputChunkBuffer.test.js +0 -34
  256. package/build/inputCompanion.d.ts +0 -18
  257. package/build/inputCompanion.js +0 -28
  258. package/build/invariantDefined.d.ts +0 -1
  259. package/build/invariantDefined.js +0 -5
  260. package/build/invariantIdentity.d.ts +0 -3
  261. package/build/invariantIdentity.js +0 -5
  262. package/build/javaKeystoreParser.d.ts +0 -2
  263. package/build/javaKeystoreParser.js +0 -7
  264. package/build/jsonParser2.d.ts +0 -3
  265. package/build/jsonParser2.js +0 -52
  266. package/build/jsonParser2.test.js +0 -22
  267. package/build/negativeLookahead.d.ts +0 -2
  268. package/build/negativeLookahead.js +0 -18
  269. package/build/parserCompose.d.ts +0 -3
  270. package/build/parserCompose.js +0 -7
  271. package/build/parserImplementationInvariantInvariant.d.ts +0 -3
  272. package/build/parserImplementationInvariantInvariant.js +0 -15
  273. package/build/parserInvariant.d.ts +0 -4
  274. package/build/parserInvariant.js +0 -11
  275. package/build/promiseFish.d.ts +0 -1
  276. package/build/promiseFish.js +0 -3
  277. package/build/sequenceParser.d.ts +0 -3
  278. package/build/sequenceParser.js +0 -10
  279. package/build/terminatedSequenceParser.d.ts +0 -2
  280. package/build/terminatedSequenceParser.js +0 -24
  281. package/build/unparserInputCompanion.d.ts +0 -15
  282. package/build/unparserInputCompanion.js +0 -13
  283. package/build/zipEntry.d.ts +0 -28
  284. package/build/zipFile.d.ts +0 -32
  285. package/build/zipFileEntry.d.ts +0 -6
  286. package/src/apk.ts +0 -48
  287. package/src/apkParser.test.ts.snap +0 -0
  288. package/src/apkParser.ts +0 -392
  289. package/src/apkUnparser.test.ts +0 -37
  290. package/src/apkUnparser.ts +0 -120
  291. package/src/invariantDefined.ts +0 -6
  292. package/src/invariantIdentity.ts +0 -8
  293. /package/build/{apk.js → androidPackage.js} +0 -0
  294. /package/build/{apkParser.test.d.ts → androidPackageParser.test.d.ts} +0 -0
  295. /package/build/{apkUnparser.test.d.ts → androidPackageUnparser.test.d.ts} +0 -0
  296. /package/build/{arbitraryDosPermissions.d.ts → dalvikExecutableParser.test.d.ts} +0 -0
  297. /package/build/{arbitraryDosPermissions.js → dalvikExecutableParserAgainstSmaliParser.test.d.ts} +0 -0
  298. /package/build/{inputChunkBuffer.test.d.ts → elementTerminatedArrayParser.test.d.ts} +0 -0
  299. /package/build/{jsonParser2.test.d.ts → elementTerminatedSequenceArrayParser.test.d.ts} +0 -0
  300. /package/build/{parserParsingInvariant.d.ts → elementTerminatedSequenceParser.test.d.ts} +0 -0
  301. /package/build/{parserParsingInvariant.js → fixedLengthSequenceParser.test.d.ts} +0 -0
  302. /package/build/{zipEntry.js → leb128Parser.test.d.ts} +0 -0
  303. /package/build/{zipFile.js → negativeLookaheadParser.test.d.ts} +0 -0
  304. /package/build/{zipFileEntry.js → nonEmptyArrayParser.test.d.ts} +0 -0
@@ -1,32 +0,0 @@
1
- export type ZipStoreCompression = {
2
- type: 'store';
3
- };
4
- export type ZipDeflateCompression = {
5
- type: 'deflate';
6
- level: number;
7
- };
8
- export type ZipCompression = ZipStoreCompression | ZipDeflateCompression;
9
- export type ZipFileEntry = {
10
- type: 'file';
11
- name: string;
12
- date: Date;
13
- comment: Uint8Array;
14
- unixPermissions: number;
15
- dosPermissions: number;
16
- compression: ZipCompression;
17
- content: Uint8Array;
18
- };
19
- export type ZipDirectoryEntry = {
20
- type: 'directory';
21
- name: string;
22
- date: Date;
23
- comment: Uint8Array;
24
- unixPermissions: number;
25
- dosPermissions: number;
26
- entries: ZipEntry[];
27
- };
28
- export type ZipEntry = ZipFileEntry | ZipDirectoryEntry;
29
- export type ZipFile = {
30
- root: ZipDirectoryEntry;
31
- comment: Uint8Array;
32
- };
@@ -1,6 +0,0 @@
1
- export type ZipFileEntry = {
2
- type: 'file';
3
- name: string;
4
- date: Date;
5
- content: Uint8Array;
6
- };
package/src/apk.ts DELETED
@@ -1,48 +0,0 @@
1
- import { type Zip } from './zip.js';
2
-
3
- export type ApkSigningBlockPair = {
4
- id: number;
5
- value: Uint8Array;
6
- };
7
-
8
- export type ApkSignatureV2Digest = {
9
- signatureAlgorithmId: number;
10
- digest: Uint8Array;
11
- };
12
-
13
- export type ApkSignatureV2AdditionalAttribute = {
14
- id: number;
15
- value: Uint8Array;
16
- };
17
-
18
- export type ApkSignatureV2SignedData = {
19
- digests: ApkSignatureV2Digest[];
20
- certificates: Uint8Array[];
21
- additionalAttributes: ApkSignatureV2AdditionalAttribute[];
22
- zeroPaddingLength?: number;
23
- };
24
-
25
- export type ApkSignatureV2Signature = {
26
- signatureAlgorithmId: number;
27
- signature: Uint8Array;
28
- };
29
-
30
- export type ApkSignatureV2Signer = {
31
- signedData: ApkSignatureV2SignedData;
32
- signatures: ApkSignatureV2Signature[];
33
- publicKey: Uint8Array;
34
- };
35
-
36
- export type ApkSignatureV2 = {
37
- signers: ApkSignatureV2Signer[];
38
- };
39
-
40
- export type ApkSigningBlock = {
41
- pairs: ApkSigningBlockPair[];
42
- signatureV2?: ApkSignatureV2;
43
- zeroPaddingLength?: number;
44
- };
45
-
46
- export type Apk = Zip & {
47
- signingBlock?: ApkSigningBlock;
48
- };
Binary file
package/src/apkParser.ts DELETED
@@ -1,392 +0,0 @@
1
- import invariant from 'invariant';
2
- import { createArrayParser } from './arrayParser.js';
3
- import { createOptionalParser } from './optionalParser.js';
4
- import { type Parser, setParserName } from './parser.js';
5
- import { promiseCompose } from './promiseCompose.js';
6
- import { createTupleParser } from './tupleParser.js';
7
- import {
8
- zip64EndOfCentralDirectoryLocatorParser,
9
- zip64EndOfCentralDirectoryRecordParser,
10
- zipArchiveDecryptionHeaderParser,
11
- zipArchiveExtraDataRecordParser,
12
- ZipCentralDirectoryHeader,
13
- zipCentralDirectoryHeaderParser,
14
- ZipEndOfCentralDirectoryRecord,
15
- zipEndOfCentralDirectoryRecordParser,
16
- zipFromZipSegments,
17
- ZipLocalFile,
18
- zipLocalFileParser,
19
- } from './zipParser.js';
20
- import { ApkSignatureV2AdditionalAttribute, ApkSignatureV2Digest, ApkSignatureV2Signature, ApkSignatureV2SignedData, ApkSignatureV2Signer, type Apk, type ApkSigningBlock, type ApkSigningBlockPair } from './apk.js';
21
- import { createFixedLengthSequenceParser } from './fixedLengthSequenceParser.js';
22
- import { parserCreatorCompose } from './parserCreatorCompose.js';
23
- import { createExactSequenceParser } from './exactSequenceParser.js';
24
- import { createSliceBoundedParser } from './sliceBoundedParser.js';
25
- import { createDisjunctionParser } from './disjunctionParser.js';
26
- import { createExactElementParser } from './exactElementParser.js';
27
- import { createParserConsumedSequenceParser } from './parserConsumedSequenceParser.js';
28
-
29
- // https://source.android.com/docs/security/features/apksigning/v2#apk-signing-block
30
-
31
- const uint32LEParser: Parser<number, Uint8Array> = promiseCompose(
32
- createFixedLengthSequenceParser(4),
33
- array => Buffer.from(array).readUInt32LE(),
34
- );
35
-
36
- setParserName(uint32LEParser, 'uint32LEParser');
37
-
38
- const uint64LEParser: Parser<bigint, Uint8Array> = promiseCompose(
39
- createFixedLengthSequenceParser(8),
40
- array => Buffer.from(array).readBigUInt64LE(),
41
- );
42
-
43
- setParserName(uint64LEParser, 'uint64LEParser');
44
-
45
- const createUint32LengthPrefixedParser = <T>(createInnerParser: (length: number) => Parser<T, Uint8Array>): Parser<T, Uint8Array> => parserCreatorCompose(
46
- () => uint32LEParser,
47
- length => createInnerParser(length),
48
- )();
49
-
50
- const createUint64LengthPrefixedParser = <T>(createInnerParser: (length: bigint) => Parser<T, Uint8Array>): Parser<T, Uint8Array> => parserCreatorCompose(
51
- () => uint64LEParser,
52
- length => createInnerParser(length),
53
- )();
54
-
55
- const createUint32LengthPrefixedSliceBoundedParser = <T>(innerParser: Parser<T, Uint8Array>): Parser<T, Uint8Array> => createUint32LengthPrefixedParser(
56
- length => createSliceBoundedParser(innerParser, length),
57
- );
58
-
59
- const createUint32LengthPrefixedSliceBoundedArrayParser = <T>(innerParser: Parser<T, Uint8Array>): Parser<T[], Uint8Array> => createUint32LengthPrefixedSliceBoundedParser(createArrayParser(innerParser));
60
-
61
- type ApkSigningBlockZeroPaddingPair = {
62
- type: 'zeroPadding';
63
- length: number;
64
- };
65
-
66
- const createApkSigningBlockZeroPaddingPairInnerParser = (length: number): Parser<ApkSigningBlockZeroPaddingPair, Uint8Array> => promiseCompose(
67
- createTupleParser([
68
- createExactSequenceParser<Uint8Array>(Buffer.from('77657242', 'hex')),
69
- createFixedLengthSequenceParser(length - 4),
70
- ]),
71
- ([ _magic, zeroPadding ]) => ({ type: 'zeroPadding', length: zeroPadding.length }),
72
- );
73
-
74
- type ApkSigningBlockSignatureV2Pair = {
75
- type: 'signatureV2';
76
- signers: ApkSignatureV2Signer[];
77
- };
78
-
79
- const createApkSigningBlockSignatureV2PairInnerParser = (length: number): Parser<ApkSigningBlockSignatureV2Pair, Uint8Array> => {
80
- const apkSigningBlockSignatureV2PairInnerParser = promiseCompose(
81
- createTupleParser([
82
- createExactSequenceParser<Uint8Array>(Buffer.from('1a870971', 'hex')),
83
- apkSignatureV2SignersParser,
84
- ]),
85
- ([ _magic, signers = [] ]) => ({ type: 'signatureV2' as const, signers }),
86
- );
87
-
88
- return setParserName(apkSigningBlockSignatureV2PairInnerParser, 'apkSigningBlockSignatureV2PairInnerParser');
89
- };
90
-
91
- type ApkSigningBlockGenericPair = {
92
- type: 'generic';
93
- pair: ApkSigningBlockPair;
94
- };
95
-
96
- const createApkSigningBlockGenericPairInnerParser = (length: number): Parser<ApkSigningBlockGenericPair, Uint8Array> => promiseCompose(
97
- createTupleParser([
98
- uint32LEParser,
99
- createFixedLengthSequenceParser(length - 4),
100
- ]),
101
- ([ id, value ]) => ({ type: 'generic', pair: { id, value } }),
102
- );
103
-
104
- type ApkSigningBlockPairType =
105
- | ApkSigningBlockZeroPaddingPair
106
- | ApkSigningBlockSignatureV2Pair
107
- | ApkSigningBlockGenericPair
108
- ;
109
-
110
- const createApkSigningBlockPairInnerParser = (length: number): Parser<ApkSigningBlockPairType, Uint8Array> => createDisjunctionParser([
111
- createApkSigningBlockZeroPaddingPairInnerParser(length),
112
- createApkSigningBlockSignatureV2PairInnerParser(length),
113
- createApkSigningBlockGenericPairInnerParser(length),
114
- ]);
115
-
116
- const apkSigningBlockPairParser: Parser<ApkSigningBlockPairType, Uint8Array> = createUint64LengthPrefixedParser(
117
- length => createApkSigningBlockPairInnerParser(Number(length)),
118
- );
119
-
120
- setParserName(apkSigningBlockPairParser, 'apkSigningBlockPairParser');
121
-
122
- const apkSigningBlockPairsParser: Parser<ApkSigningBlockPairType[], Uint8Array> = createArrayParser(apkSigningBlockPairParser);
123
-
124
- export const apkSigningBlockParser: Parser<ApkSigningBlock, Uint8Array> = createUint64LengthPrefixedParser(
125
- sizeOfBlock => promiseCompose(
126
- createTupleParser([
127
- apkSigningBlockPairsParser,
128
- uint64LEParser,
129
- createExactSequenceParser<Uint8Array>(Buffer.from('APK Sig Block 42', 'utf8')),
130
- ]),
131
- async ([ pairs, sizeOfBlockRepeated, _magic ]): Promise<ApkSigningBlock> => {
132
- invariant(sizeOfBlock === sizeOfBlockRepeated, 'Size of block mismatch: %s !== %s.', sizeOfBlock, sizeOfBlockRepeated);
133
-
134
- const zeroPaddingPair = pairs.find(pair => pair.type === 'zeroPadding');
135
- const signatureV2Pair = pairs.find(pair => pair.type === 'signatureV2');
136
-
137
- const genericPairs = (
138
- pairs
139
- .filter(pair => (
140
- pair !== zeroPaddingPair
141
- && pair !== signatureV2Pair
142
- ))
143
- .map(pair => {
144
- invariant(pair.type === 'generic', 'Expected generic pair, got %s.', pair.type);
145
- return pair.pair;
146
- })
147
- );
148
-
149
- return {
150
- zeroPaddingLength: zeroPaddingPair?.length,
151
- signatureV2: signatureV2Pair ? {
152
- signers: signatureV2Pair?.signers,
153
- } : undefined,
154
- pairs: genericPairs,
155
- };
156
- },
157
- ),
158
- );
159
-
160
- const apkSignatureV2DigestParser = createUint32LengthPrefixedParser<ApkSignatureV2Digest>(
161
- pairLength => promiseCompose(
162
- createTupleParser([
163
- uint32LEParser,
164
- createUint32LengthPrefixedParser(
165
- digestLength => createFixedLengthSequenceParser(digestLength),
166
- ),
167
- ]),
168
- ([ signatureAlgorithmId, digest ]) => ({ signatureAlgorithmId, digest }),
169
- ),
170
- );
171
-
172
- const apkSignatureV2DigestsParser = createUint32LengthPrefixedSliceBoundedArrayParser(
173
- apkSignatureV2DigestParser,
174
- );
175
-
176
- const apkSignatureV2CertificateParser = createUint32LengthPrefixedParser(
177
- certificateLength => createFixedLengthSequenceParser(certificateLength),
178
- );
179
-
180
- const apkSignatureV2CertificatesParser = createUint32LengthPrefixedSliceBoundedArrayParser(
181
- apkSignatureV2CertificateParser,
182
- );
183
-
184
- const apkSignatureV2AdditionalAttributeParser = createUint32LengthPrefixedParser<ApkSignatureV2AdditionalAttribute>(
185
- pairLength => promiseCompose(
186
- createTupleParser([
187
- uint32LEParser,
188
- createFixedLengthSequenceParser(pairLength - 4),
189
- ]),
190
- ([ id, value ]) => ({ id, value }),
191
- ),
192
- );
193
-
194
- setParserName(apkSignatureV2AdditionalAttributeParser, 'apkSignatureV2AdditionalAttributeParser');
195
-
196
- const apkSignatureV2AdditionalAttributesParser = createUint32LengthPrefixedSliceBoundedArrayParser(
197
- apkSignatureV2AdditionalAttributeParser,
198
- );
199
-
200
- setParserName(apkSignatureV2AdditionalAttributesParser, 'apkSignatureV2AdditionalAttributesParser');
201
-
202
- const apkSignatureV2SignedDataParser = createUint32LengthPrefixedSliceBoundedParser(
203
- promiseCompose(
204
- createTupleParser([
205
- apkSignatureV2DigestsParser,
206
- apkSignatureV2CertificatesParser,
207
- apkSignatureV2AdditionalAttributesParser,
208
- createArrayParser(createExactElementParser(0)),
209
- ]),
210
- ([
211
- digests,
212
- certificates,
213
- additionalAttributes,
214
- zeroPadding,
215
- ]): ApkSignatureV2SignedData => ({
216
- digests,
217
- certificates,
218
- additionalAttributes,
219
- zeroPaddingLength: zeroPadding.length,
220
- }),
221
- ),
222
- );
223
-
224
- setParserName(apkSignatureV2SignedDataParser, 'apkSignatureV2SignedDataParser');
225
-
226
- const apkSignatureV2SignatureParser = createUint32LengthPrefixedParser(
227
- signatureLength => promiseCompose(
228
- createTupleParser([
229
- uint32LEParser,
230
- createUint32LengthPrefixedParser(
231
- signatureLength => createFixedLengthSequenceParser(signatureLength),
232
- ),
233
- ]),
234
- ([
235
- signatureAlgorithmId,
236
- signature,
237
- ]): ApkSignatureV2Signature => ({
238
- signatureAlgorithmId,
239
- signature,
240
- }),
241
- ),
242
- );
243
-
244
- const apkSignatureV2SignaturesParser = createUint32LengthPrefixedSliceBoundedArrayParser(
245
- apkSignatureV2SignatureParser,
246
- );
247
-
248
- setParserName(apkSignatureV2SignaturesParser, 'apkSignatureV2SignaturesParser');
249
-
250
- const apkSignatureV2PublicKeyParser = createUint32LengthPrefixedParser(
251
- publicKeyLength => createFixedLengthSequenceParser(publicKeyLength),
252
- );
253
-
254
- setParserName(apkSignatureV2PublicKeyParser, 'apkSignatureV2PublicKeyParser');
255
-
256
- const apkSignatureV2SignerParser = createUint32LengthPrefixedSliceBoundedParser(
257
- promiseCompose(
258
- createTupleParser([
259
- apkSignatureV2SignedDataParser,
260
- apkSignatureV2SignaturesParser,
261
- apkSignatureV2PublicKeyParser,
262
- ]),
263
- ([
264
- signedData,
265
- signatures = [],
266
- publicKey,
267
- ]): ApkSignatureV2Signer => ({
268
- signedData,
269
- signatures,
270
- publicKey,
271
- }),
272
- ),
273
- );
274
-
275
- setParserName(apkSignatureV2SignerParser, 'apkSignatureV2SignerParser');
276
-
277
- const apkSignatureV2SignersParser = createUint32LengthPrefixedSliceBoundedArrayParser(
278
- apkSignatureV2SignerParser,
279
- );
280
-
281
- setParserName(apkSignatureV2SignersParser, 'apkSignatureV2SignersParser');
282
-
283
- const apkParser_ = createTupleParser([
284
- createArrayParser(zipLocalFileParser),
285
- createOptionalParser(zipArchiveDecryptionHeaderParser),
286
- createOptionalParser(zipArchiveExtraDataRecordParser),
287
- createOptionalParser(apkSigningBlockParser),
288
- createArrayParser(zipCentralDirectoryHeaderParser),
289
- createOptionalParser(zip64EndOfCentralDirectoryRecordParser),
290
- createOptionalParser(zip64EndOfCentralDirectoryLocatorParser),
291
- zipEndOfCentralDirectoryRecordParser,
292
- ]);
293
-
294
- setParserName(apkParser_, 'apkParser_');
295
-
296
- export const apkParser: Parser<Apk, Uint8Array> = promiseCompose(
297
- apkParser_,
298
- async ([
299
- zipLocalFiles,
300
- zipArchiveDecryptionHeader,
301
- zipArchiveExtraDataRecord,
302
- apkSigningBlock,
303
- zipCentralDirectoryHeaders,
304
- zip64EndOfCentralDirectoryRecord,
305
- zip64EndOfCentralDirectoryLocator,
306
- zipEndOfCentralDirectoryRecord,
307
- ]) => {
308
- const zip = await zipFromZipSegments({
309
- zipLocalFiles,
310
- zipCentralDirectoryHeaders,
311
- zipEndOfCentralDirectoryRecord,
312
- });
313
-
314
- return {
315
- ...zip,
316
- signingBlock: apkSigningBlock,
317
- };
318
- },
319
- );
320
-
321
- setParserName(apkParser, 'apkParser');
322
-
323
- export type ApkSignableSections = {
324
- zipLocalFiles: ZipLocalFile[];
325
- apkSigningBlock?: ApkSigningBlock;
326
- zipCentralDirectory: ZipCentralDirectoryHeader[];
327
- zipEndOfCentralDirectory: ZipEndOfCentralDirectoryRecord;
328
-
329
- zipLocalFilesUint8Array: Uint8Array;
330
- apkSigningBlockUint8Array?: Uint8Array;
331
- zipCentralDirectoryUint8Array: Uint8Array;
332
- zipEndOfCentralDirectoryUint8Array: Uint8Array;
333
- }
334
-
335
- export const apkSignableSectionsParser: Parser<ApkSignableSections, Uint8Array> = promiseCompose(
336
- createTupleParser([
337
- createParserConsumedSequenceParser(
338
- createTupleParser([
339
- createArrayParser(zipLocalFileParser),
340
- createOptionalParser(zipArchiveDecryptionHeaderParser),
341
- createOptionalParser(zipArchiveExtraDataRecordParser),
342
- ]),
343
- ),
344
- createOptionalParser(
345
- createParserConsumedSequenceParser(
346
- apkSigningBlockParser
347
- ),
348
- ),
349
- createParserConsumedSequenceParser(
350
- createTupleParser([
351
- createArrayParser(zipCentralDirectoryHeaderParser),
352
- createOptionalParser(zip64EndOfCentralDirectoryRecordParser),
353
- createOptionalParser(zip64EndOfCentralDirectoryLocatorParser),
354
- ]),
355
- ),
356
- createParserConsumedSequenceParser(
357
- zipEndOfCentralDirectoryRecordParser,
358
- ),
359
- ]),
360
- async ([
361
- [
362
- [
363
- zipLocalFiles,
364
- ],
365
- zipLocalFilesUint8Array,
366
- ],
367
- [
368
- apkSigningBlock = undefined,
369
- apkSigningBlockUint8Array = undefined,
370
- ] = [],
371
- [
372
- [
373
- zipCentralDirectory,
374
- ],
375
- zipCentralDirectoryUint8Array,
376
- ],
377
- [
378
- zipEndOfCentralDirectory,
379
- zipEndOfCentralDirectoryUint8Array,
380
- ],
381
- ]) => ({
382
- zipLocalFiles,
383
- apkSigningBlock,
384
- zipCentralDirectory,
385
- zipEndOfCentralDirectory,
386
-
387
- zipLocalFilesUint8Array,
388
- apkSigningBlockUint8Array,
389
- zipCentralDirectoryUint8Array,
390
- zipEndOfCentralDirectoryUint8Array,
391
- }),
392
- );
@@ -1,37 +0,0 @@
1
- import test from 'ava';
2
- import { uint8ArrayParserInputCompanion } from './parserInputCompanion.js';
3
- import { runParser } from './parser.js';
4
- import { apkParser, apkSigningBlockParser } from './apkParser.js';
5
- import { runUnparser } from './unparser.js';
6
- import { apkSigningBlockUnparser } from './apkUnparser.js';
7
- import { uint8ArrayUnparserOutputCompanion } from './unparserOutputCompanion.js';
8
- import invariant from 'invariant';
9
-
10
- for (const apkCid of [
11
- 'bafkreicckcmzrdxwoc3w2in3tivpyxrdtcfpct4zwauq3igew3nkpvfapu',
12
- ]) {
13
- test(
14
- 'apk ' + apkCid,
15
- async t => {
16
- const apkResponse = await fetch('https://ipfs.io/ipfs/' + apkCid);
17
-
18
- const apkStream = apkResponse.body!;
19
-
20
- const apk = await runParser(apkParser, apkStream, uint8ArrayParserInputCompanion, {
21
- errorJoinMode: 'all',
22
- });
23
-
24
- const apkSigningBlock = apk.signingBlock;
25
-
26
- invariant(apkSigningBlock, 'APK has no signing block');
27
-
28
- const apkSigningBlockStream = runUnparser(apkSigningBlockUnparser, apkSigningBlock, uint8ArrayUnparserOutputCompanion);
29
-
30
- const actual = await runParser(apkSigningBlockParser, apkSigningBlockStream, uint8ArrayParserInputCompanion, {
31
- errorJoinMode: 'all',
32
- });
33
-
34
- t.deepEqual(actual, apkSigningBlock);
35
- },
36
- );
37
- }
@@ -1,120 +0,0 @@
1
- import { ApkSignatureV2AdditionalAttribute, ApkSignatureV2Digest, ApkSignatureV2Signature, ApkSignatureV2SignedData, ApkSignatureV2Signer, ApkSigningBlock } from "./apk.js";
2
- import { createArrayUnparser } from "./arrayUnparser.js";
3
- import { createSequenceUnparser } from "./sequenceUnparser.js";
4
- import { Unparser } from "./unparser.js";
5
-
6
- const uint8ArrayUnparser = createSequenceUnparser<Uint8Array>();
7
-
8
- const uint32LEUnparser: Unparser<number, Uint8Array> = async function * (input) {
9
- const buffer = Buffer.alloc(4);
10
- buffer.writeUInt32LE(input);
11
- yield buffer;
12
- }
13
-
14
- const uint64LEUnparser: Unparser<number | bigint, Uint8Array> = async function * (input) {
15
- const buffer = Buffer.alloc(8);
16
- buffer.writeBigUInt64LE(BigInt(input));
17
- yield buffer;
18
- };
19
-
20
- const createUint32LengthPrefixedUnparser = <T>(innerUnparser: Unparser<T, Uint8Array>): Unparser<T, Uint8Array> => async function * (input, unparserContext) {
21
- const length = yield * unparserContext.writeLater(4);
22
- yield * innerUnparser(input, unparserContext);
23
- yield * unparserContext.writeEarlier(length, uint32LEUnparser, unparserContext.position - length.positionEnd);
24
- };
25
-
26
- const createUint64LengthPrefixedUnparser = <T>(innerUnparser: Unparser<T, Uint8Array>): Unparser<T, Uint8Array> => async function * (input, unparserContext) {
27
- const length = yield * unparserContext.writeLater(8);
28
- yield * innerUnparser(input, unparserContext);
29
- yield * unparserContext.writeEarlier(length, uint64LEUnparser, unparserContext.position - length.positionEnd);
30
- };
31
-
32
- const apkSignatureV2DigestUnparser: Unparser<ApkSignatureV2Digest, Uint8Array> = createUint32LengthPrefixedUnparser(async function * (input, unparserContext) {
33
- yield * uint32LEUnparser(input.signatureAlgorithmId, unparserContext);
34
- yield * uint32LEUnparser(input.digest.length, unparserContext);
35
- yield input.digest;
36
- });
37
-
38
- const apkSignatureV2DigestsUnparser = createUint32LengthPrefixedUnparser(createArrayUnparser(apkSignatureV2DigestUnparser));
39
-
40
- const apkSignatureV2CertificateUnparser = createUint32LengthPrefixedUnparser(uint8ArrayUnparser);
41
-
42
- const apkSignatureV2CertificatesUnparser = createUint32LengthPrefixedUnparser(createArrayUnparser(apkSignatureV2CertificateUnparser));
43
-
44
- const apkSignatureV2AdditionalAttributeUnparser: Unparser<ApkSignatureV2AdditionalAttribute, Uint8Array> = createUint32LengthPrefixedUnparser(async function * (input, unparserContext) {
45
- yield * uint32LEUnparser(input.id, unparserContext);
46
- yield input.value;
47
- });
48
-
49
- const apkSignatureV2AdditionalAttributesUnparser = createUint32LengthPrefixedUnparser(createArrayUnparser(apkSignatureV2AdditionalAttributeUnparser));
50
-
51
- export const apkSignatureV2SignedDataUnparser: Unparser<ApkSignatureV2SignedData, Uint8Array> = createUint32LengthPrefixedUnparser(async function * (input, unparserContext) {
52
- yield * apkSignatureV2DigestsUnparser(input.digests, unparserContext);
53
- yield * apkSignatureV2CertificatesUnparser(input.certificates, unparserContext);
54
- yield * apkSignatureV2AdditionalAttributesUnparser(input.additionalAttributes, unparserContext);
55
- if (input.zeroPaddingLength) {
56
- yield Buffer.alloc(input.zeroPaddingLength);
57
- }
58
- });
59
-
60
- const apkSignatureV2SignatureUnparser: Unparser<ApkSignatureV2Signature, Uint8Array> = createUint32LengthPrefixedUnparser(async function * (input, unparserContext) {
61
- yield * uint32LEUnparser(input.signatureAlgorithmId, unparserContext);
62
- yield * uint32LEUnparser(input.signature.length, unparserContext);
63
- yield input.signature;
64
- });
65
-
66
- const apkSignatureV2SignaturesUnparser = createUint32LengthPrefixedUnparser(createArrayUnparser(apkSignatureV2SignatureUnparser));
67
-
68
- const apkSignatureV2PublicKeyUnparser = createUint32LengthPrefixedUnparser(uint8ArrayUnparser);
69
-
70
- const apkSignatureV2SignerUnparser: Unparser<ApkSignatureV2Signer, Uint8Array> = createUint32LengthPrefixedUnparser(async function * (input, unparserContext) {
71
- yield * apkSignatureV2SignedDataUnparser(input.signedData, unparserContext);
72
- yield * apkSignatureV2SignaturesUnparser(input.signatures, unparserContext);
73
- yield * apkSignatureV2PublicKeyUnparser(input.publicKey, unparserContext);
74
- });
75
-
76
- const apkSignatureV2SignersUnparser = createUint32LengthPrefixedUnparser(createArrayUnparser(apkSignatureV2SignerUnparser));
77
-
78
- type ApkSigningBlockPair = {
79
- id: number;
80
- value: Uint8Array | ApkSignatureV2Signer[];
81
- };
82
-
83
- const apkSigningBlockPairUnparser: Unparser<ApkSigningBlockPair, Uint8Array> = createUint64LengthPrefixedUnparser(async function * (input, unparserContext) {
84
- yield * uint32LEUnparser(input.id, unparserContext);
85
- if (input.value instanceof Uint8Array) {
86
- yield input.value;
87
- } else {
88
- yield * apkSignatureV2SignersUnparser(input.value, unparserContext);
89
- }
90
- });
91
-
92
- const apkSigningBlockPairsUnparser = createArrayUnparser(apkSigningBlockPairUnparser);
93
-
94
- export const apkSigningBlockUnparser: Unparser<ApkSigningBlock, Uint8Array> = async function * (
95
- input,
96
- unparserContext,
97
- ) {
98
- const pairs = [
99
- ...input.pairs,
100
- ...(input.signatureV2 ? [
101
- {
102
- id: 0x7109871a,
103
- value: input.signatureV2!.signers,
104
- },
105
- ] : []),
106
- ...(input.zeroPaddingLength ? [
107
- {
108
- id: 0x42726577,
109
- value: Buffer.alloc(input.zeroPaddingLength),
110
- },
111
- ] : []),
112
- ];
113
-
114
- const sizeOfBlockWriteLater = yield * unparserContext.writeLater(8);
115
- yield * apkSigningBlockPairsUnparser(pairs, unparserContext);
116
- const sizeOfBlock = unparserContext.position - sizeOfBlockWriteLater.position + 16;
117
- yield * uint64LEUnparser(sizeOfBlock, unparserContext);
118
- yield * unparserContext.writeEarlier(sizeOfBlockWriteLater, uint64LEUnparser, sizeOfBlock);
119
- yield Buffer.from('APK Sig Block 42', 'utf8');
120
- };
@@ -1,6 +0,0 @@
1
- import invariant from 'invariant';
2
-
3
- export function invariantDefined<T>(value: T, format: string, ...extra: any[]): Exclude<T, undefined> {
4
- invariant(value !== undefined, format, ...extra);
5
- return value as any;
6
- }
@@ -1,8 +0,0 @@
1
- import invariant from 'invariant';
2
-
3
- type Falsy = '' | 0 | false | undefined ;
4
-
5
- export function invariantIdentity<T>(value: T, format: string, ...extra: any[]): Exclude<T, Falsy> {
6
- invariant(value, format, ...extra);
7
- return value as any;
8
- }
File without changes
File without changes