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