@futpib/parser 1.0.1 → 1.0.3

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 (425) hide show
  1. package/.github/copilot-instructions.md +149 -0
  2. package/.github/workflows/copilot-setup-steps.yml +18 -0
  3. package/.github/workflows/main.yml +29 -8
  4. package/.yarn/releases/yarn-4.9.4.cjs +942 -0
  5. package/.yarnrc.yml +1 -1
  6. package/build/allSettledStream.js +32 -14
  7. package/build/allSettledStream.test.js +32 -0
  8. package/build/androidPackage.d.ts +39 -0
  9. package/build/androidPackageParser.d.ts +17 -0
  10. package/build/androidPackageParser.js +185 -0
  11. package/build/androidPackageParser.test.js +22 -0
  12. package/build/androidPackageUnparser.d.ts +4 -0
  13. package/build/androidPackageUnparser.js +94 -0
  14. package/build/androidPackageUnparser.test.js +26 -0
  15. package/build/arbitrarilySlicedAsyncInterable.d.ts +3 -1
  16. package/build/arbitrarilySlicedAsyncInterable.js +3 -3
  17. package/build/arbitrarilySlicedAsyncInterator.js +2 -1
  18. package/build/arbitraryDalvikBytecode.d.ts +4 -0
  19. package/build/arbitraryDalvikBytecode.js +640 -0
  20. package/build/arbitraryDalvikExecutable.d.ts +3 -0
  21. package/build/arbitraryDalvikExecutable.js +282 -0
  22. package/build/arbitraryDosDateTime.js +1 -0
  23. package/build/arbitraryZipStream.js +1 -1
  24. package/build/arrayParser.js +2 -2
  25. package/build/arrayParser.test.js +3 -3
  26. package/build/arrayUnparser.d.ts +1 -1
  27. package/build/backsmali.d.ts +3 -0
  28. package/build/backsmali.js +50 -0
  29. package/build/bsonParser.js +6 -2
  30. package/build/customInvariant.d.ts +2 -1
  31. package/build/customInvariant.js +4 -6
  32. package/build/dalvikBytecodeParser/formatParsers.d.ts +171 -0
  33. package/build/dalvikBytecodeParser/formatParsers.js +304 -0
  34. package/build/dalvikBytecodeParser/formatSizes.d.ts +34 -0
  35. package/build/dalvikBytecodeParser/formatSizes.js +34 -0
  36. package/build/dalvikBytecodeParser/operationFormats.d.ts +225 -0
  37. package/build/dalvikBytecodeParser/operationFormats.js +225 -0
  38. package/build/dalvikBytecodeParser.d.ts +1207 -0
  39. package/build/dalvikBytecodeParser.js +1289 -0
  40. package/build/dalvikBytecodeUnparser/formatUnparsers.d.ts +152 -0
  41. package/build/dalvikBytecodeUnparser/formatUnparsers.js +225 -0
  42. package/build/dalvikBytecodeUnparser.d.ts +3 -0
  43. package/build/dalvikBytecodeUnparser.js +642 -0
  44. package/build/dalvikBytecodeUnparser.test.js +25 -0
  45. package/build/dalvikExecutable.d.ts +215 -0
  46. package/build/dalvikExecutable.js +56 -0
  47. package/build/dalvikExecutableParser/stringSyntaxParser.d.ts +4 -0
  48. package/build/dalvikExecutableParser/stringSyntaxParser.js +76 -0
  49. package/build/dalvikExecutableParser/typeParsers.d.ts +11 -0
  50. package/build/dalvikExecutableParser/typeParsers.js +39 -0
  51. package/build/dalvikExecutableParser/typedNumbers.d.ts +106 -0
  52. package/build/dalvikExecutableParser/typedNumbers.js +18 -0
  53. package/build/dalvikExecutableParser.d.ts +5 -0
  54. package/build/dalvikExecutableParser.js +1757 -0
  55. package/build/dalvikExecutableParser.test.js +72 -0
  56. package/build/dalvikExecutableParserAgainstSmaliParser.test.js +275 -0
  57. package/build/dalvikExecutableUnparser/annotationUnparsers.d.ts +14 -0
  58. package/build/dalvikExecutableUnparser/annotationUnparsers.js +97 -0
  59. package/build/dalvikExecutableUnparser/poolBuilders.d.ts +49 -0
  60. package/build/dalvikExecutableUnparser/poolBuilders.js +140 -0
  61. package/build/dalvikExecutableUnparser/poolScanners.d.ts +4 -0
  62. package/build/dalvikExecutableUnparser/poolScanners.js +220 -0
  63. package/build/dalvikExecutableUnparser/sectionUnparsers.d.ts +25 -0
  64. package/build/dalvikExecutableUnparser/sectionUnparsers.js +581 -0
  65. package/build/dalvikExecutableUnparser/utils.d.ts +10 -0
  66. package/build/dalvikExecutableUnparser/utils.js +108 -0
  67. package/build/dalvikExecutableUnparser.d.ts +4 -0
  68. package/build/dalvikExecutableUnparser.js +406 -0
  69. package/build/dalvikExecutableUnparser.test.js +31 -0
  70. package/build/debugLogInputParser.d.ts +4 -0
  71. package/build/debugLogInputParser.js +16 -0
  72. package/build/debugLogParser.js +14 -3
  73. package/build/disjunctionParser.d.ts +2 -1
  74. package/build/disjunctionParser.js +6 -4
  75. package/build/elementTerminatedArrayParser.d.ts +3 -0
  76. package/build/elementTerminatedArrayParser.js +18 -0
  77. package/build/elementTerminatedArrayParser.test.js +52 -0
  78. package/build/elementTerminatedSequenceArrayParser.d.ts +3 -0
  79. package/build/elementTerminatedSequenceArrayParser.js +32 -0
  80. package/build/elementTerminatedSequenceArrayParser.test.js +34 -0
  81. package/build/elementTerminatedSequenceParser.d.ts +3 -0
  82. package/build/elementTerminatedSequenceParser.js +27 -0
  83. package/build/elementTerminatedSequenceParser.test.js +34 -0
  84. package/build/endOfInputParser.d.ts +1 -1
  85. package/build/exactElementParser.js +10 -5
  86. package/build/exactElementSwitchParser.d.ts +3 -0
  87. package/build/exactElementSwitchParser.js +22 -0
  88. package/build/exactSequenceParser.d.ts +2 -1
  89. package/build/exactSequenceParser.js +12 -2
  90. package/build/fetchCid.d.ts +1 -0
  91. package/build/fetchCid.js +103 -0
  92. package/build/fetchCid.test.js +16 -0
  93. package/build/fixedLengthSequenceParser.d.ts +1 -0
  94. package/build/fixedLengthSequenceParser.js +18 -1
  95. package/build/fixedLengthSequenceParser.test.js +41 -0
  96. package/build/hasExecutable.d.ts +1 -0
  97. package/build/hasExecutable.js +8 -0
  98. package/build/highResolutionTimer.d.ts +16 -0
  99. package/build/highResolutionTimer.js +42 -0
  100. package/build/inputReader.d.ts +11 -0
  101. package/build/inputReader.js +37 -0
  102. package/build/inputReader.test.js +161 -8
  103. package/build/inputReaderState.d.ts +10 -0
  104. package/build/inputReaderState.js +16 -0
  105. package/build/inspect.d.ts +1 -0
  106. package/build/inspect.js +7 -0
  107. package/build/javaKeyStoreParser.test.js +8 -8
  108. package/build/jsonParser.d.ts +2 -0
  109. package/build/jsonParser.js +19 -22
  110. package/build/lazyMessageError.d.ts +48 -0
  111. package/build/lazyMessageError.js +53 -0
  112. package/build/lazyMessageError.test.d.ts +1 -0
  113. package/build/lazyMessageError.test.js +15 -0
  114. package/build/leb128Parser.d.ts +7 -0
  115. package/build/leb128Parser.js +82 -0
  116. package/build/leb128Parser.test.d.ts +1 -0
  117. package/build/leb128Parser.test.js +107 -0
  118. package/build/lookaheadParser.d.ts +2 -0
  119. package/build/lookaheadParser.js +14 -0
  120. package/build/negativeLookaheadParser.js +22 -16
  121. package/build/negativeLookaheadParser.test.d.ts +1 -0
  122. package/build/negativeLookaheadParser.test.js +30 -0
  123. package/build/noStackCaptureOverheadError.d.ts +4 -0
  124. package/build/noStackCaptureOverheadError.js +9 -0
  125. package/build/noStackCaptureOverheadError.test.d.ts +1 -0
  126. package/build/noStackCaptureOverheadError.test.js +15 -0
  127. package/build/nonEmptyArrayParser.d.ts +2 -0
  128. package/build/nonEmptyArrayParser.js +32 -0
  129. package/build/nonEmptyArrayParser.test.d.ts +1 -0
  130. package/build/nonEmptyArrayParser.test.js +17 -0
  131. package/build/optionalParser.js +2 -2
  132. package/build/parser.d.ts +11 -1
  133. package/build/parser.js +82 -32
  134. package/build/parser.test.js +141 -25
  135. package/build/parserAccessorParser.js +9 -1
  136. package/build/parserConsumedSequenceParser.d.ts +1 -1
  137. package/build/parserConsumedSequenceParser.js +21 -16
  138. package/build/parserContext.d.ts +22 -6
  139. package/build/parserContext.js +113 -57
  140. package/build/parserContext.test.js +33 -2
  141. package/build/parserCreatorCompose.d.ts +1 -0
  142. package/build/parserCreatorCompose.js +8 -2
  143. package/build/parserError.d.ts +605 -40
  144. package/build/parserError.js +98 -53
  145. package/build/parserImplementationInvariant.d.ts +1 -1
  146. package/build/parserImplementationInvariant.js +2 -2
  147. package/build/parserInputCompanion.d.ts +15 -0
  148. package/build/parserInputCompanion.js +38 -0
  149. package/build/promiseCompose.d.ts +1 -1
  150. package/build/promiseCompose.js +11 -1
  151. package/build/promiseSettled.d.ts +1 -0
  152. package/build/promiseSettled.js +4 -0
  153. package/build/separatedArrayParser.d.ts +2 -0
  154. package/build/separatedArrayParser.js +39 -0
  155. package/build/separatedArrayParser.test.d.ts +1 -0
  156. package/build/separatedArrayParser.test.js +21 -0
  157. package/build/separatedNonEmptyArrayParser.d.ts +2 -0
  158. package/build/separatedNonEmptyArrayParser.js +40 -0
  159. package/build/separatedNonEmptyArrayParser.test.d.ts +1 -0
  160. package/build/separatedNonEmptyArrayParser.test.js +66 -0
  161. package/build/sequenceBuffer.d.ts +10 -0
  162. package/build/sequenceBuffer.js +54 -2
  163. package/build/sequenceBuffer.test.js +57 -0
  164. package/build/sequenceTerminatedSequenceParser.d.ts +5 -0
  165. package/build/sequenceTerminatedSequenceParser.js +32 -0
  166. package/build/sequenceTerminatedSequenceParser.test.d.ts +1 -0
  167. package/build/sequenceTerminatedSequenceParser.test.js +37 -0
  168. package/build/sequenceUnparser.d.ts +1 -1
  169. package/build/skipParser.d.ts +1 -1
  170. package/build/skipParser.js +4 -2
  171. package/build/skipToParser.d.ts +2 -0
  172. package/build/skipToParser.js +11 -0
  173. package/build/sliceBoundedParser.d.ts +1 -1
  174. package/build/sliceBoundedParser.js +7 -2
  175. package/build/sliceBoundedParser.test.js +30 -1
  176. package/build/smali.d.ts +1 -0
  177. package/build/smali.js +21 -0
  178. package/build/smaliParser.d.ts +68 -0
  179. package/build/smaliParser.js +2081 -0
  180. package/build/smaliParser.test.d.ts +1 -0
  181. package/build/smaliParser.test.js +410 -0
  182. package/build/stringFromAsyncIterable.d.ts +1 -0
  183. package/build/stringFromAsyncIterable.js +7 -0
  184. package/build/terminatedArrayParser.d.ts +3 -1
  185. package/build/terminatedArrayParser.js +79 -2
  186. package/build/terminatedArrayParser.test.d.ts +1 -0
  187. package/build/terminatedArrayParser.test.js +131 -0
  188. package/build/toAsyncIterable.d.ts +1 -0
  189. package/build/toAsyncIterable.js +7 -0
  190. package/build/toAsyncIterator.d.ts +1 -0
  191. package/build/toAsyncIterator.js +33 -0
  192. package/build/tupleParser.d.ts +4 -0
  193. package/build/tupleParser.js +1 -5
  194. package/build/unionParser.d.ts +2 -1
  195. package/build/unionParser.js +29 -14
  196. package/build/unionParser.test.d.ts +1 -0
  197. package/build/unionParser.test.js +60 -0
  198. package/build/unparser.d.ts +3 -3
  199. package/build/unparser.js +6 -4
  200. package/build/unparser.test.js +7 -19
  201. package/build/unparserContext.d.ts +2 -2
  202. package/build/unparserContext.js +2 -3
  203. package/build/unparserError.d.ts +2 -1
  204. package/build/unparserError.js +2 -1
  205. package/build/unparserImplementationInvariant.d.ts +1 -1
  206. package/build/unparserOutputCompanion.d.ts +1 -1
  207. package/build/unparserOutputCompanion.js +1 -1
  208. package/build/zipParser.d.ts +7 -2
  209. package/build/zipParser.js +36 -12
  210. package/build/zipUnparser.d.ts +7 -4
  211. package/build/zipUnparser.js +64 -45
  212. package/build/zipUnparser.test.js +15 -15
  213. package/package.json +33 -24
  214. package/src/allSettledStream.test.ts +40 -0
  215. package/src/allSettledStream.ts +47 -15
  216. package/src/androidPackage.ts +48 -0
  217. package/src/androidPackageParser.test.ts +27 -0
  218. package/src/{apkParser.test.ts.md → androidPackageParser.test.ts.md} +4 -4
  219. package/src/androidPackageParser.test.ts.snap +0 -0
  220. package/src/androidPackageParser.ts +398 -0
  221. package/src/androidPackageUnparser.test.ts +34 -0
  222. package/src/androidPackageUnparser.ts +126 -0
  223. package/src/arbitrarilySlicedAsyncInterable.ts +7 -2
  224. package/src/arbitrarilySlicedAsyncInterator.ts +4 -4
  225. package/src/arbitraryDalvikBytecode.ts +992 -0
  226. package/src/arbitraryDalvikExecutable.ts +434 -0
  227. package/src/arbitraryDosDateTime.ts +1 -0
  228. package/src/arbitraryZipStream.ts +1 -1
  229. package/src/arrayParser.test.ts +3 -3
  230. package/src/arrayParser.ts +2 -2
  231. package/src/arrayUnparser.ts +2 -2
  232. package/src/backsmali.ts +74 -0
  233. package/src/bsonParser.test.ts +12 -14
  234. package/src/bsonParser.ts +13 -2
  235. package/src/customInvariant.ts +8 -12
  236. package/src/dalvikBytecodeParser/formatParsers.ts +780 -0
  237. package/src/dalvikBytecodeParser/formatSizes.ts +35 -0
  238. package/src/dalvikBytecodeParser/operationFormats.ts +226 -0
  239. package/src/dalvikBytecodeParser.ts +2873 -0
  240. package/src/dalvikBytecodeUnparser/formatUnparsers.ts +442 -0
  241. package/src/dalvikBytecodeUnparser.test.ts +44 -0
  242. package/src/dalvikBytecodeUnparser.ts +758 -0
  243. package/src/dalvikExecutable.ts +282 -0
  244. package/src/dalvikExecutableParser/stringSyntaxParser.ts +145 -0
  245. package/src/dalvikExecutableParser/typeParsers.ts +74 -0
  246. package/src/dalvikExecutableParser/typedNumbers.ts +57 -0
  247. package/src/dalvikExecutableParser.test.ts +89 -0
  248. package/src/dalvikExecutableParser.test.ts.md +634 -0
  249. package/src/dalvikExecutableParser.test.ts.snap +0 -0
  250. package/src/dalvikExecutableParser.ts +3245 -0
  251. package/src/dalvikExecutableParserAgainstSmaliParser.test.ts +363 -0
  252. package/src/dalvikExecutableUnparser/annotationUnparsers.ts +135 -0
  253. package/src/dalvikExecutableUnparser/poolBuilders.ts +189 -0
  254. package/src/dalvikExecutableUnparser/poolScanners.ts +297 -0
  255. package/src/dalvikExecutableUnparser/sectionUnparsers.ts +683 -0
  256. package/src/dalvikExecutableUnparser/utils.ts +149 -0
  257. package/src/dalvikExecutableUnparser.test.ts +57 -0
  258. package/src/dalvikExecutableUnparser.ts +581 -0
  259. package/src/debugLogInputParser.ts +28 -0
  260. package/src/debugLogParser.ts +19 -3
  261. package/src/disjunctionParser.ts +12 -7
  262. package/src/elementTerminatedArrayParser.test.ts +99 -0
  263. package/src/elementTerminatedArrayParser.ts +31 -0
  264. package/src/elementTerminatedSequenceArrayParser.test.ts +52 -0
  265. package/src/elementTerminatedSequenceArrayParser.ts +52 -0
  266. package/src/elementTerminatedSequenceParser.test.ts +52 -0
  267. package/src/elementTerminatedSequenceParser.ts +43 -0
  268. package/src/endOfInputParser.ts +1 -1
  269. package/src/exactElementParser.ts +17 -11
  270. package/src/exactElementSwitchParser.ts +41 -0
  271. package/src/exactSequenceParser.ts +23 -2
  272. package/src/fetchCid.test.ts +20 -0
  273. package/src/fetchCid.ts +121 -0
  274. package/src/fixedLengthSequenceParser.test.ts +75 -0
  275. package/src/fixedLengthSequenceParser.ts +28 -1
  276. package/src/hasExecutable.ts +11 -0
  277. package/src/highResolutionTimer.ts +49 -0
  278. package/src/inputReader.test.ts +204 -8
  279. package/src/inputReader.ts +76 -3
  280. package/src/inputReaderState.ts +33 -0
  281. package/src/inspect.ts +9 -0
  282. package/src/javaKeyStoreParser.test.ts +12 -15
  283. package/src/javaKeyStoreParser.ts +2 -6
  284. package/src/jsonParser.test.ts +2 -4
  285. package/src/jsonParser.ts +46 -62
  286. package/src/lazyMessageError.test.ts +21 -0
  287. package/src/lazyMessageError.ts +88 -0
  288. package/src/leb128Parser.test.ts +173 -0
  289. package/src/leb128Parser.ts +125 -0
  290. package/src/lookaheadParser.ts +19 -0
  291. package/src/negativeLookaheadParser.test.ts +49 -0
  292. package/src/negativeLookaheadParser.ts +27 -15
  293. package/src/noStackCaptureOverheadError.test.ts +17 -0
  294. package/src/noStackCaptureOverheadError.ts +12 -0
  295. package/src/nonEmptyArrayParser.test.ts +21 -0
  296. package/src/nonEmptyArrayParser.ts +44 -0
  297. package/src/optionalParser.ts +3 -2
  298. package/src/parser.test.ts +203 -31
  299. package/src/parser.test.ts.md +34 -27
  300. package/src/parser.test.ts.snap +0 -0
  301. package/src/parser.ts +172 -45
  302. package/src/parserAccessorParser.ts +12 -2
  303. package/src/parserConsumedSequenceParser.ts +26 -17
  304. package/src/parserContext.test.ts +37 -2
  305. package/src/parserContext.ts +185 -79
  306. package/src/parserCreatorCompose.ts +20 -2
  307. package/src/parserError.ts +144 -61
  308. package/src/parserImplementationInvariant.ts +3 -3
  309. package/src/parserInputCompanion.ts +55 -0
  310. package/src/promiseCompose.ts +17 -3
  311. package/src/promiseSettled.ts +6 -0
  312. package/src/separatedArrayParser.test.ts +34 -0
  313. package/src/separatedArrayParser.ts +55 -0
  314. package/src/separatedNonEmptyArrayParser.test.ts +117 -0
  315. package/src/separatedNonEmptyArrayParser.ts +61 -0
  316. package/src/sequenceBuffer.test.ts +70 -0
  317. package/src/sequenceBuffer.ts +88 -2
  318. package/src/sequenceTerminatedSequenceParser.test.ts +58 -0
  319. package/src/sequenceTerminatedSequenceParser.ts +62 -0
  320. package/src/sequenceUnparser.ts +2 -2
  321. package/src/skipParser.ts +7 -5
  322. package/src/skipToParser.ts +16 -0
  323. package/src/sliceBoundedParser.test.ts +35 -1
  324. package/src/sliceBoundedParser.ts +19 -1
  325. package/src/smali.ts +29 -0
  326. package/src/smaliParser.test.ts +443 -0
  327. package/src/smaliParser.test.ts.md +3907 -0
  328. package/src/smaliParser.test.ts.snap +0 -0
  329. package/src/smaliParser.ts +3348 -0
  330. package/src/stringFromAsyncIterable.ts +9 -0
  331. package/src/terminatedArrayParser.test.ts +258 -0
  332. package/src/terminatedArrayParser.ts +109 -6
  333. package/src/toAsyncIterable.ts +7 -0
  334. package/src/toAsyncIterator.ts +48 -0
  335. package/src/tupleParser.ts +8 -5
  336. package/src/uint8Array.ts +2 -3
  337. package/src/unionParser.test.ts +78 -0
  338. package/src/unionParser.ts +47 -21
  339. package/src/unparser.test.ts +18 -34
  340. package/src/unparser.ts +13 -9
  341. package/src/unparserContext.ts +9 -13
  342. package/src/unparserError.ts +2 -1
  343. package/src/unparserImplementationInvariant.ts +1 -1
  344. package/src/unparserOutputCompanion.ts +1 -1
  345. package/src/zip.ts +2 -6
  346. package/src/zipParser.ts +71 -20
  347. package/src/zipUnparser.test.ts +19 -19
  348. package/src/zipUnparser.ts +139 -90
  349. package/tsconfig.json +7 -1
  350. package/xo.config.ts +15 -0
  351. package/.yarn/releases/yarn-4.5.3.cjs +0 -934
  352. package/build/apk.d.ts +0 -39
  353. package/build/apkParser.d.ts +0 -16
  354. package/build/apkParser.js +0 -164
  355. package/build/apkParser.test.js +0 -22
  356. package/build/apkUnparser.d.ts +0 -4
  357. package/build/apkUnparser.js +0 -90
  358. package/build/apkUnparser.test.js +0 -26
  359. package/build/arbitraryDosDate.d.ts +0 -2
  360. package/build/arbitraryDosDate.js +0 -8
  361. package/build/arbitraryZipEntry.d.ts +0 -3
  362. package/build/arbitraryZipEntry.js +0 -26
  363. package/build/createDisjunctionParser.d.ts +0 -2
  364. package/build/createDisjunctionParser.js +0 -47
  365. package/build/createExactParser.d.ts +0 -2
  366. package/build/createExactParser.js +0 -12
  367. package/build/createSequentialUnionParser.d.ts +0 -2
  368. package/build/createSequentialUnionParser.js +0 -69
  369. package/build/fixedLengthChunkParser.d.ts +0 -2
  370. package/build/fixedLengthChunkParser.js +0 -12
  371. package/build/fixedLengthParser.d.ts +0 -2
  372. package/build/fixedLengthParser.js +0 -12
  373. package/build/inputChunkBuffer.d.ts +0 -15
  374. package/build/inputChunkBuffer.js +0 -40
  375. package/build/inputChunkBuffer.test.js +0 -34
  376. package/build/inputCompanion.d.ts +0 -18
  377. package/build/inputCompanion.js +0 -28
  378. package/build/invariantDefined.d.ts +0 -1
  379. package/build/invariantDefined.js +0 -5
  380. package/build/invariantIdentity.d.ts +0 -3
  381. package/build/invariantIdentity.js +0 -5
  382. package/build/javaKeystoreParser.d.ts +0 -2
  383. package/build/javaKeystoreParser.js +0 -7
  384. package/build/jsonParser2.d.ts +0 -3
  385. package/build/jsonParser2.js +0 -52
  386. package/build/jsonParser2.test.js +0 -22
  387. package/build/negativeLookahead.d.ts +0 -2
  388. package/build/negativeLookahead.js +0 -18
  389. package/build/parserCompose.d.ts +0 -3
  390. package/build/parserCompose.js +0 -7
  391. package/build/parserImplementationInvariantInvariant.d.ts +0 -3
  392. package/build/parserImplementationInvariantInvariant.js +0 -15
  393. package/build/parserInvariant.d.ts +0 -4
  394. package/build/parserInvariant.js +0 -11
  395. package/build/promiseFish.d.ts +0 -1
  396. package/build/promiseFish.js +0 -3
  397. package/build/sequenceParser.d.ts +0 -3
  398. package/build/sequenceParser.js +0 -10
  399. package/build/terminatedSequenceParser.d.ts +0 -2
  400. package/build/terminatedSequenceParser.js +0 -24
  401. package/build/unparserInputCompanion.d.ts +0 -15
  402. package/build/unparserInputCompanion.js +0 -13
  403. package/build/zipEntry.d.ts +0 -28
  404. package/build/zipFile.d.ts +0 -32
  405. package/build/zipFileEntry.d.ts +0 -6
  406. package/src/apk.ts +0 -48
  407. package/src/apkParser.test.ts +0 -30
  408. package/src/apkParser.test.ts.snap +0 -0
  409. package/src/apkParser.ts +0 -392
  410. package/src/apkUnparser.test.ts +0 -37
  411. package/src/apkUnparser.ts +0 -120
  412. package/src/invariantDefined.ts +0 -6
  413. package/src/invariantIdentity.ts +0 -8
  414. /package/build/{apk.js → androidPackage.js} +0 -0
  415. /package/build/{apkParser.test.d.ts → androidPackageParser.test.d.ts} +0 -0
  416. /package/build/{apkUnparser.test.d.ts → androidPackageUnparser.test.d.ts} +0 -0
  417. /package/build/{arbitraryDosPermissions.d.ts → dalvikBytecodeUnparser.test.d.ts} +0 -0
  418. /package/build/{arbitraryDosPermissions.js → dalvikExecutableParser.test.d.ts} +0 -0
  419. /package/build/{inputChunkBuffer.test.d.ts → dalvikExecutableParserAgainstSmaliParser.test.d.ts} +0 -0
  420. /package/build/{jsonParser2.test.d.ts → dalvikExecutableUnparser.test.d.ts} +0 -0
  421. /package/build/{parserParsingInvariant.d.ts → elementTerminatedArrayParser.test.d.ts} +0 -0
  422. /package/build/{parserParsingInvariant.js → elementTerminatedSequenceArrayParser.test.d.ts} +0 -0
  423. /package/build/{zipEntry.js → elementTerminatedSequenceParser.test.d.ts} +0 -0
  424. /package/build/{zipFile.js → fetchCid.test.d.ts} +0 -0
  425. /package/build/{zipFileEntry.js → fixedLengthSequenceParser.test.d.ts} +0 -0
@@ -0,0 +1,398 @@
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
+ type ZipCentralDirectoryHeader,
13
+ zipCentralDirectoryHeaderParser,
14
+ type ZipEndOfCentralDirectoryRecord,
15
+ zipEndOfCentralDirectoryRecordParser,
16
+ zipFromZipSegments,
17
+ type ZipLocalFile,
18
+ zipLocalFileParser,
19
+ } from './zipParser.js';
20
+ import {
21
+ type AndroidPackageSignatureV2AdditionalAttribute, type AndroidPackageSignatureV2Digest, type AndroidPackageSignatureV2Signature, type AndroidPackageSignatureV2SignedData, type AndroidPackageSignatureV2Signer, type AndroidPackage, type AndroidPackageSigningBlock, type AndroidPackageSigningBlockPair,
22
+ } from './androidPackage.js';
23
+ import { createFixedLengthSequenceParser } from './fixedLengthSequenceParser.js';
24
+ import { parserCreatorCompose } from './parserCreatorCompose.js';
25
+ import { createExactSequenceParser } from './exactSequenceParser.js';
26
+ import { createSliceBoundedParser } from './sliceBoundedParser.js';
27
+ import { createDisjunctionParser } from './disjunctionParser.js';
28
+ import { createExactElementParser } from './exactElementParser.js';
29
+ import { createParserConsumedSequenceParser } from './parserConsumedSequenceParser.js';
30
+ import { createDebugLogInputParser } from './debugLogInputParser.js';
31
+ import { createDebugLogParser } from './debugLogParser.js';
32
+ import { createElementParser } from './elementParser.js';
33
+
34
+ // https://source.android.com/docs/security/features/androidPackagesigning/v2#androidPackage-signing-block
35
+
36
+ const uint32LEParser: Parser<number, Uint8Array> = promiseCompose(
37
+ createFixedLengthSequenceParser(4),
38
+ array => Buffer.from(array).readUInt32LE(),
39
+ );
40
+
41
+ setParserName(uint32LEParser, 'uint32LEParser');
42
+
43
+ const uint64LEParser: Parser<bigint, Uint8Array> = promiseCompose(
44
+ createFixedLengthSequenceParser(8),
45
+ array => Buffer.from(array).readBigUInt64LE(),
46
+ );
47
+
48
+ setParserName(uint64LEParser, 'uint64LEParser');
49
+
50
+ const createUint32LengthPrefixedParser = <T>(createInnerParser: (length: number) => Parser<T, Uint8Array>): Parser<T, Uint8Array> => parserCreatorCompose(
51
+ () => uint32LEParser,
52
+ length => createInnerParser(length),
53
+ )();
54
+
55
+ const createUint64LengthPrefixedParser = <T>(createInnerParser: (length: bigint) => Parser<T, Uint8Array>): Parser<T, Uint8Array> => parserCreatorCompose(
56
+ () => uint64LEParser,
57
+ length => createInnerParser(length),
58
+ )();
59
+
60
+ const createUint32LengthPrefixedSliceBoundedParser = <T>(innerParser: Parser<T, Uint8Array>): Parser<T, Uint8Array> => createUint32LengthPrefixedParser(length => createSliceBoundedParser(innerParser, length));
61
+
62
+ const createUint32LengthPrefixedSliceBoundedArrayParser = <T>(innerParser: Parser<T, Uint8Array>): Parser<T[], Uint8Array> => createUint32LengthPrefixedSliceBoundedParser(createArrayParser(innerParser));
63
+
64
+ type AndroidPackageSigningBlockZeroPaddingPair = {
65
+ type: 'zeroPadding';
66
+ length: number;
67
+ };
68
+
69
+ const createAndroidPackageSigningBlockZeroPaddingPairInnerParser = (length: number): Parser<AndroidPackageSigningBlockZeroPaddingPair, Uint8Array> => {
70
+ const androidPackageSigningBlockZeroPaddingPairInnerParser: Parser<AndroidPackageSigningBlockZeroPaddingPair, Uint8Array> = promiseCompose(
71
+ createTupleParser([
72
+ createExactSequenceParser<Uint8Array>(Buffer.from('77657242', 'hex')),
73
+ createFixedLengthSequenceParser(length - 4),
74
+ ]),
75
+ ([ _magic, zeroPadding ]) => ({ type: 'zeroPadding', length: zeroPadding.length }),
76
+ );
77
+
78
+ setParserName(androidPackageSigningBlockZeroPaddingPairInnerParser, 'androidPackageSigningBlockZeroPaddingPairInnerParser');
79
+
80
+ return androidPackageSigningBlockZeroPaddingPairInnerParser;
81
+ };
82
+
83
+ type AndroidPackageSigningBlockSignatureV2Pair = {
84
+ type: 'signatureV2';
85
+ signers: AndroidPackageSignatureV2Signer[];
86
+ };
87
+
88
+ const createAndroidPackageSigningBlockSignatureV2PairInnerParser = (length: number): Parser<AndroidPackageSigningBlockSignatureV2Pair, Uint8Array> => {
89
+ const androidPackageSigningBlockSignatureV2PairInnerParser = promiseCompose(
90
+ createTupleParser([
91
+ createExactSequenceParser<Uint8Array>(Buffer.from('1a870971', 'hex')),
92
+ androidPackageSignatureV2SignersParser,
93
+ ]),
94
+ ([ _magic, signers = [] ]) => ({ type: 'signatureV2' as const, signers }),
95
+ );
96
+
97
+ return setParserName(androidPackageSigningBlockSignatureV2PairInnerParser, 'androidPackageSigningBlockSignatureV2PairInnerParser');
98
+ };
99
+
100
+ type AndroidPackageSigningBlockGenericPair = {
101
+ type: 'generic';
102
+ pair: AndroidPackageSigningBlockPair;
103
+ };
104
+
105
+ const createAndroidPackageSigningBlockGenericPairInnerParser = (length: number): Parser<AndroidPackageSigningBlockGenericPair, Uint8Array> => promiseCompose(
106
+ createTupleParser([
107
+ uint32LEParser,
108
+ createFixedLengthSequenceParser(length - 4),
109
+ ]),
110
+ ([ id, value ]) => ({ type: 'generic', pair: { id, value } }),
111
+ );
112
+
113
+ type AndroidPackageSigningBlockPairType =
114
+ | AndroidPackageSigningBlockZeroPaddingPair
115
+ | AndroidPackageSigningBlockSignatureV2Pair
116
+ | AndroidPackageSigningBlockGenericPair
117
+ ;
118
+
119
+ const createAndroidPackageSigningBlockPairInnerParser = (length: number): Parser<AndroidPackageSigningBlockPairType, Uint8Array> => {
120
+ const androidPackageSigningBlockPairInnerParser: Parser<AndroidPackageSigningBlockPairType, Uint8Array> = promiseCompose(
121
+ createTupleParser([
122
+ parserContext => {
123
+ parserContext.invariant(
124
+ Number.isSafeInteger(length),
125
+ 'Signing block length is unreasonable: %s.',
126
+ length,
127
+ );
128
+ },
129
+ createDisjunctionParser<AndroidPackageSigningBlockPairType, Uint8Array>([
130
+ createAndroidPackageSigningBlockZeroPaddingPairInnerParser(length),
131
+ createAndroidPackageSigningBlockSignatureV2PairInnerParser(length),
132
+ createAndroidPackageSigningBlockGenericPairInnerParser(length),
133
+ ]),
134
+ ]),
135
+ ([
136
+ _lengthInvariant,
137
+ pair,
138
+ ]) => pair,
139
+ );
140
+
141
+ setParserName(androidPackageSigningBlockPairInnerParser, 'androidPackageSigningBlockPairInnerParser');
142
+
143
+ return androidPackageSigningBlockPairInnerParser;
144
+ };
145
+
146
+ const androidPackageSigningBlockPairParser: Parser<AndroidPackageSigningBlockPairType, Uint8Array> = createUint64LengthPrefixedParser(length => createAndroidPackageSigningBlockPairInnerParser(Number(length)));
147
+
148
+ setParserName(androidPackageSigningBlockPairParser, 'androidPackageSigningBlockPairParser');
149
+
150
+ const androidPackageSigningBlockPairsParser: Parser<AndroidPackageSigningBlockPairType[], Uint8Array> = createArrayParser(androidPackageSigningBlockPairParser);
151
+
152
+ export const androidPackageSigningBlockParser: Parser<AndroidPackageSigningBlock, Uint8Array> = createUint64LengthPrefixedParser(sizeOfBlock => promiseCompose(
153
+ createTupleParser([
154
+ androidPackageSigningBlockPairsParser,
155
+ uint64LEParser,
156
+ createExactSequenceParser<Uint8Array>(Buffer.from('APK Sig Block 42', 'utf8')),
157
+ ]),
158
+ async ([
159
+ pairs,
160
+ sizeOfBlockRepeated,
161
+ _magic,
162
+ ]): Promise<AndroidPackageSigningBlock> => {
163
+ invariant(sizeOfBlock === sizeOfBlockRepeated, 'Size of block mismatch: %s !== %s.', sizeOfBlock, sizeOfBlockRepeated);
164
+
165
+ const zeroPaddingPair = pairs.find(pair => pair.type === 'zeroPadding');
166
+ const signatureV2Pair = pairs.find(pair => pair.type === 'signatureV2');
167
+
168
+ const genericPairs = (
169
+ pairs
170
+ .filter(pair => (
171
+ pair !== zeroPaddingPair
172
+ && pair !== signatureV2Pair
173
+ ))
174
+ .map(pair => {
175
+ invariant(pair.type === 'generic', 'Expected generic pair, got %s.', pair.type);
176
+ return pair.pair;
177
+ })
178
+ );
179
+
180
+ return {
181
+ zeroPaddingLength: zeroPaddingPair?.length,
182
+ signatureV2: signatureV2Pair
183
+ ? {
184
+ signers: signatureV2Pair?.signers,
185
+ }
186
+ : undefined,
187
+ pairs: genericPairs,
188
+ };
189
+ },
190
+ ));
191
+
192
+ const androidPackageSignatureV2DigestParser = createUint32LengthPrefixedParser<AndroidPackageSignatureV2Digest>(pairLength => promiseCompose(
193
+ createTupleParser([
194
+ uint32LEParser,
195
+ createUint32LengthPrefixedParser(digestLength => createFixedLengthSequenceParser(digestLength)),
196
+ ]),
197
+ ([ signatureAlgorithmId, digest ]) => ({ signatureAlgorithmId, digest }),
198
+ ));
199
+
200
+ const androidPackageSignatureV2DigestsParser = createUint32LengthPrefixedSliceBoundedArrayParser(androidPackageSignatureV2DigestParser);
201
+
202
+ setParserName(androidPackageSignatureV2DigestsParser, 'androidPackageSignatureV2DigestsParser');
203
+
204
+ const androidPackageSignatureV2CertificateParser = createUint32LengthPrefixedParser(certificateLength => createFixedLengthSequenceParser(certificateLength));
205
+
206
+ setParserName(androidPackageSignatureV2CertificateParser, 'androidPackageSignatureV2CertificateParser');
207
+
208
+ const androidPackageSignatureV2CertificatesParser = createUint32LengthPrefixedSliceBoundedArrayParser(androidPackageSignatureV2CertificateParser);
209
+
210
+ setParserName(androidPackageSignatureV2CertificatesParser, 'androidPackageSignatureV2CertificatesParser');
211
+
212
+ const androidPackageSignatureV2AdditionalAttributeParser = createUint32LengthPrefixedParser<AndroidPackageSignatureV2AdditionalAttribute>(pairLength => promiseCompose(
213
+ createTupleParser([
214
+ uint32LEParser,
215
+ createFixedLengthSequenceParser(pairLength - 4),
216
+ ]),
217
+ ([ id, value ]) => ({ id, value }),
218
+ ));
219
+
220
+ setParserName(androidPackageSignatureV2AdditionalAttributeParser, 'androidPackageSignatureV2AdditionalAttributeParser');
221
+
222
+ const androidPackageSignatureV2AdditionalAttributesParser = createUint32LengthPrefixedSliceBoundedArrayParser(androidPackageSignatureV2AdditionalAttributeParser);
223
+
224
+ setParserName(androidPackageSignatureV2AdditionalAttributesParser, 'androidPackageSignatureV2AdditionalAttributesParser');
225
+
226
+ const androidPackageSignatureV2SignedDataParser = createUint32LengthPrefixedSliceBoundedParser(promiseCompose(
227
+ createTupleParser([
228
+ androidPackageSignatureV2DigestsParser,
229
+ androidPackageSignatureV2CertificatesParser,
230
+ androidPackageSignatureV2AdditionalAttributesParser,
231
+ createArrayParser(createExactElementParser(0)),
232
+ ]),
233
+ ([
234
+ digests,
235
+ certificates,
236
+ additionalAttributes,
237
+ zeroPadding,
238
+ ]): AndroidPackageSignatureV2SignedData => ({
239
+ digests,
240
+ certificates,
241
+ additionalAttributes,
242
+ zeroPaddingLength: zeroPadding.length,
243
+ }),
244
+ ));
245
+
246
+ setParserName(androidPackageSignatureV2SignedDataParser, 'androidPackageSignatureV2SignedDataParser');
247
+
248
+ const androidPackageSignatureV2SignatureParser = createUint32LengthPrefixedParser(signatureLength => promiseCompose(
249
+ createTupleParser([
250
+ uint32LEParser,
251
+ createUint32LengthPrefixedParser(signatureLength => createFixedLengthSequenceParser(signatureLength)),
252
+ ]),
253
+ ([
254
+ signatureAlgorithmId,
255
+ signature,
256
+ ]): AndroidPackageSignatureV2Signature => ({
257
+ signatureAlgorithmId,
258
+ signature,
259
+ }),
260
+ ));
261
+
262
+ const androidPackageSignatureV2SignaturesParser = createUint32LengthPrefixedSliceBoundedArrayParser(androidPackageSignatureV2SignatureParser);
263
+
264
+ setParserName(androidPackageSignatureV2SignaturesParser, 'androidPackageSignatureV2SignaturesParser');
265
+
266
+ const androidPackageSignatureV2PublicKeyParser = createUint32LengthPrefixedParser(publicKeyLength => createFixedLengthSequenceParser(publicKeyLength));
267
+
268
+ setParserName(androidPackageSignatureV2PublicKeyParser, 'androidPackageSignatureV2PublicKeyParser');
269
+
270
+ const androidPackageSignatureV2SignerParser = createUint32LengthPrefixedSliceBoundedParser(promiseCompose(
271
+ createTupleParser([
272
+ androidPackageSignatureV2SignedDataParser,
273
+ androidPackageSignatureV2SignaturesParser,
274
+ androidPackageSignatureV2PublicKeyParser,
275
+ ]),
276
+ ([
277
+ signedData,
278
+ signatures = [],
279
+ publicKey,
280
+ ]): AndroidPackageSignatureV2Signer => ({
281
+ signedData,
282
+ signatures,
283
+ publicKey,
284
+ }),
285
+ ));
286
+
287
+ setParserName(androidPackageSignatureV2SignerParser, 'androidPackageSignatureV2SignerParser');
288
+
289
+ const androidPackageSignatureV2SignersParser = createUint32LengthPrefixedSliceBoundedArrayParser(androidPackageSignatureV2SignerParser);
290
+
291
+ setParserName(androidPackageSignatureV2SignersParser, 'androidPackageSignatureV2SignersParser');
292
+
293
+ const androidPackageParser_ = createTupleParser([
294
+ createArrayParser(zipLocalFileParser),
295
+ createOptionalParser(zipArchiveDecryptionHeaderParser),
296
+ createOptionalParser(zipArchiveExtraDataRecordParser),
297
+ createOptionalParser(androidPackageSigningBlockParser),
298
+ createArrayParser(zipCentralDirectoryHeaderParser),
299
+ createOptionalParser(zip64EndOfCentralDirectoryRecordParser),
300
+ createOptionalParser(zip64EndOfCentralDirectoryLocatorParser),
301
+ zipEndOfCentralDirectoryRecordParser,
302
+ ]);
303
+
304
+ setParserName(androidPackageParser_, 'androidPackageParser_');
305
+
306
+ export const androidPackageParser: Parser<AndroidPackage, Uint8Array> = promiseCompose(
307
+ androidPackageParser_,
308
+ async ([
309
+ zipLocalFiles,
310
+ zipArchiveDecryptionHeader,
311
+ zipArchiveExtraDataRecord,
312
+ androidPackageSigningBlock,
313
+ zipCentralDirectoryHeaders,
314
+ zip64EndOfCentralDirectoryRecord,
315
+ zip64EndOfCentralDirectoryLocator,
316
+ zipEndOfCentralDirectoryRecord,
317
+ ]) => {
318
+ const zip = await zipFromZipSegments({
319
+ zipLocalFiles,
320
+ zipCentralDirectoryHeaders,
321
+ zipEndOfCentralDirectoryRecord,
322
+ });
323
+
324
+ return {
325
+ ...zip,
326
+ signingBlock: androidPackageSigningBlock,
327
+ };
328
+ },
329
+ );
330
+
331
+ setParserName(androidPackageParser, 'androidPackageParser');
332
+
333
+ export type AndroidPackageSignableSections = {
334
+ zipLocalFiles: ZipLocalFile[];
335
+ zipLocalFilesZeroPaddingLength: number;
336
+ androidPackageSigningBlock?: AndroidPackageSigningBlock;
337
+ zipCentralDirectory: ZipCentralDirectoryHeader[];
338
+ zipEndOfCentralDirectory: ZipEndOfCentralDirectoryRecord;
339
+
340
+ zipLocalFilesUint8Array: Uint8Array;
341
+ androidPackageSigningBlockUint8Array?: Uint8Array;
342
+ zipCentralDirectoryUint8Array: Uint8Array;
343
+ zipEndOfCentralDirectoryUint8Array: Uint8Array;
344
+ };
345
+
346
+ export const androidPackageSignableSectionsParser: Parser<AndroidPackageSignableSections, Uint8Array> = promiseCompose(
347
+ createTupleParser([
348
+ createParserConsumedSequenceParser(createTupleParser([
349
+ createArrayParser(zipLocalFileParser),
350
+ createOptionalParser(zipArchiveDecryptionHeaderParser),
351
+ createOptionalParser(zipArchiveExtraDataRecordParser),
352
+ ])),
353
+ createArrayParser(createExactElementParser(0)),
354
+ createOptionalParser(createParserConsumedSequenceParser(androidPackageSigningBlockParser)),
355
+ createParserConsumedSequenceParser(createTupleParser([
356
+ createArrayParser(zipCentralDirectoryHeaderParser),
357
+ createOptionalParser(zip64EndOfCentralDirectoryRecordParser),
358
+ createOptionalParser(zip64EndOfCentralDirectoryLocatorParser),
359
+ ])),
360
+ createParserConsumedSequenceParser(zipEndOfCentralDirectoryRecordParser),
361
+ ]),
362
+ async ([
363
+ [
364
+ [
365
+ zipLocalFiles,
366
+ ],
367
+ zipLocalFilesUint8Array,
368
+ ],
369
+ zipLocalFilesZeroPadding,
370
+ [
371
+ androidPackageSigningBlock = undefined,
372
+ androidPackageSigningBlockUint8Array = undefined,
373
+ ] = [],
374
+ [
375
+ [
376
+ zipCentralDirectory,
377
+ ],
378
+ zipCentralDirectoryUint8Array,
379
+ ],
380
+ [
381
+ zipEndOfCentralDirectory,
382
+ zipEndOfCentralDirectoryUint8Array,
383
+ ],
384
+ ]) => ({
385
+ zipLocalFiles,
386
+ zipLocalFilesZeroPaddingLength: zipLocalFilesZeroPadding.length,
387
+ androidPackageSigningBlock,
388
+ zipCentralDirectory,
389
+ zipEndOfCentralDirectory,
390
+
391
+ zipLocalFilesUint8Array,
392
+ androidPackageSigningBlockUint8Array,
393
+ zipCentralDirectoryUint8Array,
394
+ zipEndOfCentralDirectoryUint8Array,
395
+ }),
396
+ );
397
+
398
+ setParserName(androidPackageSignableSectionsParser, 'androidPackageSignableSectionsParser');
@@ -0,0 +1,34 @@
1
+ import test from 'ava';
2
+ import invariant from 'invariant';
3
+ import { uint8ArrayParserInputCompanion } from './parserInputCompanion.js';
4
+ import { runParser } from './parser.js';
5
+ import { androidPackageParser, androidPackageSigningBlockParser } from './androidPackageParser.js';
6
+ import { runUnparser } from './unparser.js';
7
+ import { androidPackageSigningBlockUnparser } from './androidPackageUnparser.js';
8
+ import { uint8ArrayUnparserOutputCompanion } from './unparserOutputCompanion.js';
9
+ import { fetchCid } from './fetchCid.js';
10
+
11
+ const androidPackageUnparserMacro = test.macro({
12
+ title: (providedTitle, androidPackageCid: string) => providedTitle ?? `androidPackage ${androidPackageCid}`,
13
+ async exec(t, androidPackageCid: string) {
14
+ const androidPackageStream = await fetchCid(androidPackageCid);
15
+
16
+ const androidPackage = await runParser(androidPackageParser, androidPackageStream, uint8ArrayParserInputCompanion, {
17
+ errorJoinMode: 'all',
18
+ });
19
+
20
+ const androidPackageSigningBlock = androidPackage.signingBlock;
21
+
22
+ invariant(androidPackageSigningBlock, 'APK has no signing block');
23
+
24
+ const androidPackageSigningBlockStream = runUnparser(androidPackageSigningBlockUnparser, androidPackageSigningBlock, uint8ArrayUnparserOutputCompanion);
25
+
26
+ const actual = await runParser(androidPackageSigningBlockParser, androidPackageSigningBlockStream, uint8ArrayParserInputCompanion, {
27
+ errorJoinMode: 'all',
28
+ });
29
+
30
+ t.deepEqual(actual, androidPackageSigningBlock);
31
+ },
32
+ });
33
+
34
+ test(androidPackageUnparserMacro, 'bafkreicckcmzrdxwoc3w2in3tivpyxrdtcfpct4zwauq3igew3nkpvfapu');
@@ -0,0 +1,126 @@
1
+ import {
2
+ type AndroidPackageSignatureV2AdditionalAttribute, type AndroidPackageSignatureV2Digest, type AndroidPackageSignatureV2Signature, type AndroidPackageSignatureV2SignedData, type AndroidPackageSignatureV2Signer, type AndroidPackageSigningBlock,
3
+ } from './androidPackage.js';
4
+ import { createArrayUnparser } from './arrayUnparser.js';
5
+ import { createSequenceUnparser } from './sequenceUnparser.js';
6
+ import { type Unparser } from './unparser.js';
7
+
8
+ const uint8ArrayUnparser = createSequenceUnparser<Uint8Array>();
9
+
10
+ const uint32LEUnparser: Unparser<number, Uint8Array> = async function * (input) {
11
+ const buffer = Buffer.alloc(4);
12
+ buffer.writeUInt32LE(input);
13
+ yield buffer;
14
+ };
15
+
16
+ const uint64LEUnparser: Unparser<number | bigint, Uint8Array> = async function * (input) {
17
+ const buffer = Buffer.alloc(8);
18
+ buffer.writeBigUInt64LE(BigInt(input));
19
+ yield buffer;
20
+ };
21
+
22
+ const createUint32LengthPrefixedUnparser = <T>(innerUnparser: Unparser<T, Uint8Array>): Unparser<T, Uint8Array> => async function * (input, unparserContext) {
23
+ const length = yield * unparserContext.writeLater(4);
24
+ yield * innerUnparser(input, unparserContext);
25
+ yield * unparserContext.writeEarlier(length, uint32LEUnparser, unparserContext.position - length.positionEnd);
26
+ };
27
+
28
+ const createUint64LengthPrefixedUnparser = <T>(innerUnparser: Unparser<T, Uint8Array>): Unparser<T, Uint8Array> => async function * (input, unparserContext) {
29
+ const length = yield * unparserContext.writeLater(8);
30
+ yield * innerUnparser(input, unparserContext);
31
+ yield * unparserContext.writeEarlier(length, uint64LEUnparser, unparserContext.position - length.positionEnd);
32
+ };
33
+
34
+ const androidPackageSignatureV2DigestUnparser: Unparser<AndroidPackageSignatureV2Digest, Uint8Array> = createUint32LengthPrefixedUnparser(async function * (input, unparserContext) {
35
+ yield * uint32LEUnparser(input.signatureAlgorithmId, unparserContext);
36
+ yield * uint32LEUnparser(input.digest.length, unparserContext);
37
+ yield input.digest;
38
+ });
39
+
40
+ const androidPackageSignatureV2DigestsUnparser = createUint32LengthPrefixedUnparser(createArrayUnparser(androidPackageSignatureV2DigestUnparser));
41
+
42
+ const androidPackageSignatureV2CertificateUnparser = createUint32LengthPrefixedUnparser(uint8ArrayUnparser);
43
+
44
+ const androidPackageSignatureV2CertificatesUnparser = createUint32LengthPrefixedUnparser(createArrayUnparser(androidPackageSignatureV2CertificateUnparser));
45
+
46
+ const androidPackageSignatureV2AdditionalAttributeUnparser: Unparser<AndroidPackageSignatureV2AdditionalAttribute, Uint8Array> = createUint32LengthPrefixedUnparser(async function * (input, unparserContext) {
47
+ yield * uint32LEUnparser(input.id, unparserContext);
48
+ yield input.value;
49
+ });
50
+
51
+ const androidPackageSignatureV2AdditionalAttributesUnparser = createUint32LengthPrefixedUnparser(createArrayUnparser(androidPackageSignatureV2AdditionalAttributeUnparser));
52
+
53
+ export const androidPackageSignatureV2SignedDataUnparser: Unparser<AndroidPackageSignatureV2SignedData, Uint8Array> = createUint32LengthPrefixedUnparser(async function * (input, unparserContext) {
54
+ yield * androidPackageSignatureV2DigestsUnparser(input.digests, unparserContext);
55
+ yield * androidPackageSignatureV2CertificatesUnparser(input.certificates, unparserContext);
56
+ yield * androidPackageSignatureV2AdditionalAttributesUnparser(input.additionalAttributes, unparserContext);
57
+ if (input.zeroPaddingLength) {
58
+ yield Buffer.alloc(input.zeroPaddingLength);
59
+ }
60
+ });
61
+
62
+ const androidPackageSignatureV2SignatureUnparser: Unparser<AndroidPackageSignatureV2Signature, Uint8Array> = createUint32LengthPrefixedUnparser(async function * (input, unparserContext) {
63
+ yield * uint32LEUnparser(input.signatureAlgorithmId, unparserContext);
64
+ yield * uint32LEUnparser(input.signature.length, unparserContext);
65
+ yield input.signature;
66
+ });
67
+
68
+ const androidPackageSignatureV2SignaturesUnparser = createUint32LengthPrefixedUnparser(createArrayUnparser(androidPackageSignatureV2SignatureUnparser));
69
+
70
+ const androidPackageSignatureV2PublicKeyUnparser = createUint32LengthPrefixedUnparser(uint8ArrayUnparser);
71
+
72
+ const androidPackageSignatureV2SignerUnparser: Unparser<AndroidPackageSignatureV2Signer, Uint8Array> = createUint32LengthPrefixedUnparser(async function * (input, unparserContext) {
73
+ yield * androidPackageSignatureV2SignedDataUnparser(input.signedData, unparserContext);
74
+ yield * androidPackageSignatureV2SignaturesUnparser(input.signatures, unparserContext);
75
+ yield * androidPackageSignatureV2PublicKeyUnparser(input.publicKey, unparserContext);
76
+ });
77
+
78
+ const androidPackageSignatureV2SignersUnparser = createUint32LengthPrefixedUnparser(createArrayUnparser(androidPackageSignatureV2SignerUnparser));
79
+
80
+ type AndroidPackageSigningBlockPair = {
81
+ id: number;
82
+ value: Uint8Array | AndroidPackageSignatureV2Signer[];
83
+ };
84
+
85
+ const androidPackageSigningBlockPairUnparser: Unparser<AndroidPackageSigningBlockPair, Uint8Array> = createUint64LengthPrefixedUnparser(async function * (input, unparserContext) {
86
+ yield * uint32LEUnparser(input.id, unparserContext);
87
+ if (input.value instanceof Uint8Array) {
88
+ yield input.value;
89
+ } else {
90
+ yield * androidPackageSignatureV2SignersUnparser(input.value, unparserContext);
91
+ }
92
+ });
93
+
94
+ const androidPackageSigningBlockPairsUnparser = createArrayUnparser(androidPackageSigningBlockPairUnparser);
95
+
96
+ export const androidPackageSigningBlockUnparser: Unparser<AndroidPackageSigningBlock, Uint8Array> = async function * (
97
+ input,
98
+ unparserContext,
99
+ ) {
100
+ const pairs = [
101
+ ...input.pairs,
102
+ ...(input.signatureV2
103
+ ? [
104
+ {
105
+ id: 0x71_09_87_1A,
106
+ value: input.signatureV2.signers,
107
+ },
108
+ ]
109
+ : []),
110
+ ...(input.zeroPaddingLength
111
+ ? [
112
+ {
113
+ id: 0x42_72_65_77,
114
+ value: Buffer.alloc(input.zeroPaddingLength),
115
+ },
116
+ ]
117
+ : []),
118
+ ];
119
+
120
+ const sizeOfBlockWriteLater = yield * unparserContext.writeLater(8);
121
+ yield * androidPackageSigningBlockPairsUnparser(pairs, unparserContext);
122
+ const sizeOfBlock = unparserContext.position - sizeOfBlockWriteLater.position + 16;
123
+ yield * uint64LEUnparser(sizeOfBlock, unparserContext);
124
+ yield * unparserContext.writeEarlier(sizeOfBlockWriteLater, uint64LEUnparser, sizeOfBlock);
125
+ yield Buffer.from('APK Sig Block 42', 'utf8');
126
+ };
@@ -1,7 +1,7 @@
1
- import { inspect } from 'node:util';
2
1
  import * as fc from 'fast-check';
3
2
  import { type Arbitrary } from 'fast-check';
4
3
  import invariant from 'invariant';
4
+ import { inspect } from './inspect.js';
5
5
 
6
6
  function concat<Sliceable extends string | Uint8Array>(slices: Sliceable[]): Sliceable {
7
7
  const firstSlice = slices.at(0);
@@ -23,9 +23,14 @@ function equals<Sliceable extends string | Uint8Array>(a: Sliceable, b: Sliceabl
23
23
 
24
24
  export function arbitrarilySlicedAsyncIterable<Sliceable extends string | Uint8Array>(
25
25
  arbitrarySliceable: Arbitrary<Sliceable>,
26
+ {
27
+ minSlices = 1,
28
+ }: {
29
+ minSlices?: number;
30
+ } = {},
26
31
  ): Arbitrary<[ Sliceable, AsyncIterable<Sliceable> ]> {
27
32
  return (
28
- fc.tuple(arbitrarySliceable, fc.array(fc.nat(), { minLength: 1 }))
33
+ fc.tuple(arbitrarySliceable, fc.array(fc.nat(), { minLength: Math.max(1, minSlices) }))
29
34
  .map(([ sliceable, sliceSizes ]) => {
30
35
  let start = 0;
31
36
 
@@ -1,19 +1,19 @@
1
1
  import { type Arbitrary } from 'fast-check';
2
2
  import { arbitrarilySlicedAsyncIterable } from './arbitrarilySlicedAsyncInterable.js';
3
3
 
4
- export function arbitrarilySlicedAsyncIterator<Sliceable extends string | Uint8Array>(
5
- arbitrarySliceable: Arbitrary<Sliceable>,
6
- ): Arbitrary<[ Sliceable, AsyncIterator<Sliceable> ]> {
4
+ export function arbitrarilySlicedAsyncIterator<Sliceable extends string | Uint8Array>(arbitrarySliceable: Arbitrary<Sliceable>): Arbitrary<[ Sliceable, AsyncIterator<Sliceable> ]> {
7
5
  return (
8
6
  arbitrarilySlicedAsyncIterable(arbitrarySliceable)
9
7
  .map(([ sliceable, asyncIterable ]) => {
10
8
  const asyncIterator_ = asyncIterable[Symbol.asyncIterator]();
11
9
 
10
+ const asyncIterableWithTag = asyncIterable as AsyncIterable<Sliceable> & { [Symbol.toStringTag]?: string };
11
+
12
12
  const asyncIterator = {
13
13
  next: asyncIterator_.next.bind(asyncIterator_),
14
14
  return: asyncIterator_.return?.bind(asyncIterator_),
15
15
  throw: asyncIterator_.throw?.bind(asyncIterator_),
16
- [Symbol.toStringTag]: 'ArbitrarilySlicedAsyncIterator ' + (asyncIterable as any)[Symbol.toStringTag],
16
+ [Symbol.toStringTag]: 'ArbitrarilySlicedAsyncIterator ' + (asyncIterableWithTag[Symbol.toStringTag] ?? ''),
17
17
  };
18
18
 
19
19
  return [