@futpib/parser 1.0.2 → 1.0.4

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 (311) 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 +1 -1
  7. package/build/allSettledStream.test.js +2 -2
  8. package/build/androidPackageParser.d.ts +1 -1
  9. package/build/androidPackageParser.js +5 -3
  10. package/build/androidPackageParser.test.js +7 -7
  11. package/build/androidPackageUnparser.d.ts +2 -2
  12. package/build/androidPackageUnparser.js +18 -14
  13. package/build/androidPackageUnparser.test.js +7 -7
  14. package/build/arbitrarilySlicedAsyncInterator.js +2 -1
  15. package/build/arbitraryDalvikBytecode.d.ts +4 -0
  16. package/build/arbitraryDalvikBytecode.js +640 -0
  17. package/build/arbitraryDalvikExecutable.d.ts +3 -0
  18. package/build/arbitraryDalvikExecutable.js +282 -0
  19. package/build/arbitraryDosDateTime.js +1 -0
  20. package/build/arbitraryZipStream.js +1 -1
  21. package/build/arrayParser.js +2 -2
  22. package/build/arrayUnparser.d.ts +1 -1
  23. package/build/backsmali.d.ts +3 -1
  24. package/build/backsmali.js +31 -3
  25. package/build/bash.d.ts +84 -0
  26. package/build/bash.js +1 -0
  27. package/build/bashParser.d.ts +6 -0
  28. package/build/bashParser.js +294 -0
  29. package/build/bashParser.test.d.ts +1 -0
  30. package/build/bashParser.test.js +181 -0
  31. package/build/customInvariant.d.ts +2 -1
  32. package/build/customInvariant.js +4 -6
  33. package/build/dalvikBytecodeParser/formatParsers.d.ts +76 -2
  34. package/build/dalvikBytecodeParser/formatParsers.js +146 -11
  35. package/build/dalvikBytecodeParser/formatSizes.d.ts +34 -0
  36. package/build/dalvikBytecodeParser/formatSizes.js +34 -0
  37. package/build/dalvikBytecodeParser/operationFormats.d.ts +225 -0
  38. package/build/dalvikBytecodeParser/operationFormats.js +225 -0
  39. package/build/dalvikBytecodeParser.d.ts +1105 -5
  40. package/build/dalvikBytecodeParser.js +658 -205
  41. package/build/dalvikBytecodeUnparser/formatUnparsers.d.ts +152 -0
  42. package/build/dalvikBytecodeUnparser/formatUnparsers.js +225 -0
  43. package/build/dalvikBytecodeUnparser.d.ts +3 -0
  44. package/build/dalvikBytecodeUnparser.js +642 -0
  45. package/build/dalvikBytecodeUnparser.test.d.ts +1 -0
  46. package/build/dalvikBytecodeUnparser.test.js +25 -0
  47. package/build/dalvikExecutable.d.ts +65 -8
  48. package/build/dalvikExecutable.js +36 -0
  49. package/build/dalvikExecutableParser/stringSyntaxParser.d.ts +1 -1
  50. package/build/dalvikExecutableParser/stringSyntaxParser.js +17 -17
  51. package/build/dalvikExecutableParser/typeParsers.d.ts +2 -1
  52. package/build/dalvikExecutableParser/typeParsers.js +16 -11
  53. package/build/dalvikExecutableParser/typedNumbers.d.ts +85 -69
  54. package/build/dalvikExecutableParser/typedNumbers.js +0 -1
  55. package/build/dalvikExecutableParser.d.ts +2 -2
  56. package/build/dalvikExecutableParser.js +655 -337
  57. package/build/dalvikExecutableParser.test.js +24 -22
  58. package/build/dalvikExecutableParserAgainstSmaliParser.test.js +223 -246
  59. package/build/dalvikExecutableUnparser/annotationUnparsers.d.ts +14 -0
  60. package/build/dalvikExecutableUnparser/annotationUnparsers.js +97 -0
  61. package/build/dalvikExecutableUnparser/poolBuilders.d.ts +49 -0
  62. package/build/dalvikExecutableUnparser/poolBuilders.js +140 -0
  63. package/build/dalvikExecutableUnparser/poolScanners.d.ts +4 -0
  64. package/build/dalvikExecutableUnparser/poolScanners.js +220 -0
  65. package/build/dalvikExecutableUnparser/sectionUnparsers.d.ts +25 -0
  66. package/build/dalvikExecutableUnparser/sectionUnparsers.js +581 -0
  67. package/build/dalvikExecutableUnparser/utils.d.ts +10 -0
  68. package/build/dalvikExecutableUnparser/utils.js +108 -0
  69. package/build/dalvikExecutableUnparser.d.ts +4 -0
  70. package/build/dalvikExecutableUnparser.js +406 -0
  71. package/build/dalvikExecutableUnparser.test.d.ts +1 -0
  72. package/build/dalvikExecutableUnparser.test.js +31 -0
  73. package/build/debugLogInputParser.js +1 -1
  74. package/build/disjunctionParser.d.ts +2 -2
  75. package/build/disjunctionParser.js +2 -2
  76. package/build/elementTerminatedArrayParser.d.ts +2 -2
  77. package/build/elementTerminatedArrayParser.js +1 -1
  78. package/build/elementTerminatedArrayParser.test.js +5 -5
  79. package/build/elementTerminatedSequenceArrayParser.d.ts +2 -2
  80. package/build/elementTerminatedSequenceArrayParser.js +1 -1
  81. package/build/elementTerminatedSequenceArrayParser.test.js +2 -2
  82. package/build/elementTerminatedSequenceParser.d.ts +2 -2
  83. package/build/elementTerminatedSequenceParser.js +1 -1
  84. package/build/elementTerminatedSequenceParser.test.js +2 -2
  85. package/build/endOfInputParser.d.ts +1 -1
  86. package/build/exactElementSwitchParser.d.ts +3 -0
  87. package/build/exactElementSwitchParser.js +22 -0
  88. package/build/fetchCid.js +2 -6
  89. package/build/fetchCid.test.d.ts +1 -0
  90. package/build/fetchCid.test.js +16 -0
  91. package/build/fixedLengthSequenceParser.test.js +2 -2
  92. package/build/hasExecutable.js +2 -2
  93. package/build/highResolutionTimer.js +1 -1
  94. package/build/index.d.ts +24 -2
  95. package/build/index.js +22 -1
  96. package/build/inputReader.d.ts +1 -1
  97. package/build/inputReader.test.js +33 -45
  98. package/build/javaKeyStoreParser.test.js +6 -6
  99. package/build/jsonParser.js +8 -8
  100. package/build/lazyMessageError.d.ts +48 -0
  101. package/build/lazyMessageError.js +53 -0
  102. package/build/lazyMessageError.test.d.ts +1 -0
  103. package/build/lazyMessageError.test.js +15 -0
  104. package/build/leb128Parser.d.ts +1 -1
  105. package/build/leb128Parser.js +10 -10
  106. package/build/leb128Parser.test.js +7 -7
  107. package/build/negativeLookaheadParser.js +2 -2
  108. package/build/negativeLookaheadParser.test.js +4 -4
  109. package/build/noStackCaptureOverheadError.d.ts +4 -0
  110. package/build/noStackCaptureOverheadError.js +9 -0
  111. package/build/noStackCaptureOverheadError.test.d.ts +1 -0
  112. package/build/noStackCaptureOverheadError.test.js +15 -0
  113. package/build/nonEmptyArrayParser.js +2 -2
  114. package/build/nonEmptyArrayParser.test.js +2 -1
  115. package/build/optionalParser.js +2 -2
  116. package/build/parser.d.ts +2 -1
  117. package/build/parser.js +23 -8
  118. package/build/parser.test.js +78 -29
  119. package/build/parserConsumedSequenceParser.d.ts +1 -1
  120. package/build/parserConsumedSequenceParser.js +2 -2
  121. package/build/parserContext.d.ts +8 -6
  122. package/build/parserContext.js +60 -33
  123. package/build/parserContext.test.js +7 -3
  124. package/build/parserError.d.ts +603 -44
  125. package/build/parserError.js +98 -53
  126. package/build/parserImplementationInvariant.d.ts +1 -1
  127. package/build/parserImplementationInvariant.js +2 -2
  128. package/build/parserInputCompanion.js +2 -2
  129. package/build/promiseCompose.js +1 -2
  130. package/build/regexpParser.d.ts +2 -0
  131. package/build/regexpParser.js +71 -0
  132. package/build/regexpParser.test.d.ts +1 -0
  133. package/build/regexpParser.test.js +83 -0
  134. package/build/regularExpression.d.ts +63 -0
  135. package/build/regularExpression.js +1 -0
  136. package/build/regularExpressionParser.d.ts +3 -0
  137. package/build/regularExpressionParser.js +580 -0
  138. package/build/regularExpressionParser.test.d.ts +1 -0
  139. package/build/regularExpressionParser.test.js +89 -0
  140. package/build/separatedArrayParser.js +2 -2
  141. package/build/separatedNonEmptyArrayParser.d.ts +2 -0
  142. package/build/separatedNonEmptyArrayParser.js +40 -0
  143. package/build/separatedNonEmptyArrayParser.test.d.ts +1 -0
  144. package/build/separatedNonEmptyArrayParser.test.js +66 -0
  145. package/build/sequenceBuffer.js +1 -1
  146. package/build/sequenceTerminatedSequenceParser.d.ts +2 -2
  147. package/build/sequenceTerminatedSequenceParser.js +3 -3
  148. package/build/sequenceTerminatedSequenceParser.test.js +1 -1
  149. package/build/sequenceUnparser.d.ts +1 -1
  150. package/build/skipToParser.d.ts +1 -1
  151. package/build/skipToParser.js +2 -2
  152. package/build/sliceBoundedParser.test.js +4 -9
  153. package/build/smali.d.ts +1 -1
  154. package/build/smali.js +6 -2
  155. package/build/smaliParser.d.ts +62 -6
  156. package/build/smaliParser.js +1721 -296
  157. package/build/smaliParser.test.js +338 -43
  158. package/build/stringFromAsyncIterable.d.ts +1 -0
  159. package/build/stringFromAsyncIterable.js +7 -0
  160. package/build/terminatedArrayParser.js +4 -4
  161. package/build/terminatedArrayParser.test.js +7 -7
  162. package/build/toAsyncIterator.js +4 -4
  163. package/build/unionParser.d.ts +1 -1
  164. package/build/unionParser.js +2 -2
  165. package/build/unionParser.test.js +3 -3
  166. package/build/unparser.d.ts +3 -3
  167. package/build/unparser.js +6 -4
  168. package/build/unparser.test.js +7 -19
  169. package/build/unparserContext.d.ts +2 -2
  170. package/build/unparserContext.js +2 -3
  171. package/build/unparserError.d.ts +2 -1
  172. package/build/unparserError.js +2 -1
  173. package/build/unparserImplementationInvariant.d.ts +1 -1
  174. package/build/unparserOutputCompanion.d.ts +1 -1
  175. package/build/unparserOutputCompanion.js +1 -1
  176. package/build/zipParser.js +1 -1
  177. package/build/zipUnparser.d.ts +3 -3
  178. package/build/zipUnparser.js +9 -19
  179. package/build/zipUnparser.test.js +1 -1
  180. package/package.json +20 -26
  181. package/src/allSettledStream.test.ts +2 -2
  182. package/src/allSettledStream.ts +3 -3
  183. package/src/androidPackageParser.test.ts +17 -19
  184. package/src/androidPackageParser.ts +129 -171
  185. package/src/androidPackageUnparser.test.ts +19 -21
  186. package/src/androidPackageUnparser.ts +23 -17
  187. package/src/arbitrarilySlicedAsyncInterable.ts +1 -1
  188. package/src/arbitrarilySlicedAsyncInterator.ts +4 -4
  189. package/src/arbitraryDalvikBytecode.ts +992 -0
  190. package/src/arbitraryDalvikExecutable.ts +434 -0
  191. package/src/arbitraryDosDateTime.ts +1 -0
  192. package/src/arbitraryZipStream.ts +1 -1
  193. package/src/arrayParser.ts +2 -2
  194. package/src/arrayUnparser.ts +2 -2
  195. package/src/backsmali.ts +48 -4
  196. package/src/bash.ts +120 -0
  197. package/src/bashParser.test.ts +332 -0
  198. package/src/bashParser.ts +461 -0
  199. package/src/bsonParser.test.ts +12 -14
  200. package/src/customInvariant.ts +8 -12
  201. package/src/dalvikBytecodeParser/formatParsers.ts +376 -17
  202. package/src/dalvikBytecodeParser/formatSizes.ts +35 -0
  203. package/src/dalvikBytecodeParser/operationFormats.ts +226 -0
  204. package/src/dalvikBytecodeParser.ts +1042 -243
  205. package/src/dalvikBytecodeUnparser/formatUnparsers.ts +442 -0
  206. package/src/dalvikBytecodeUnparser.test.ts +44 -0
  207. package/src/dalvikBytecodeUnparser.ts +758 -0
  208. package/src/dalvikExecutable.ts +110 -48
  209. package/src/dalvikExecutableParser/stringSyntaxParser.ts +33 -33
  210. package/src/dalvikExecutableParser/typeParsers.ts +23 -14
  211. package/src/dalvikExecutableParser/typedNumbers.ts +19 -19
  212. package/src/dalvikExecutableParser.test.ts +60 -60
  213. package/src/dalvikExecutableParser.test.ts.md +6 -6
  214. package/src/dalvikExecutableParser.test.ts.snap +0 -0
  215. package/src/dalvikExecutableParser.ts +911 -434
  216. package/src/dalvikExecutableParserAgainstSmaliParser.test.ts +256 -239
  217. package/src/dalvikExecutableUnparser/annotationUnparsers.ts +135 -0
  218. package/src/dalvikExecutableUnparser/poolBuilders.ts +189 -0
  219. package/src/dalvikExecutableUnparser/poolScanners.ts +297 -0
  220. package/src/dalvikExecutableUnparser/sectionUnparsers.ts +683 -0
  221. package/src/dalvikExecutableUnparser/utils.ts +149 -0
  222. package/src/dalvikExecutableUnparser.test.ts +57 -0
  223. package/src/dalvikExecutableUnparser.ts +581 -0
  224. package/src/debugLogInputParser.ts +1 -1
  225. package/src/disjunctionParser.ts +5 -5
  226. package/src/elementTerminatedArrayParser.test.ts +8 -8
  227. package/src/elementTerminatedArrayParser.ts +2 -2
  228. package/src/elementTerminatedSequenceArrayParser.test.ts +4 -6
  229. package/src/elementTerminatedSequenceArrayParser.ts +2 -2
  230. package/src/elementTerminatedSequenceParser.test.ts +4 -6
  231. package/src/elementTerminatedSequenceParser.ts +2 -2
  232. package/src/endOfInputParser.ts +1 -1
  233. package/src/exactElementSwitchParser.ts +41 -0
  234. package/src/fetchCid.test.ts +20 -0
  235. package/src/fetchCid.ts +3 -7
  236. package/src/fixedLengthSequenceParser.test.ts +10 -12
  237. package/src/hasExecutable.ts +2 -2
  238. package/src/highResolutionTimer.ts +1 -1
  239. package/src/index.ts +113 -2
  240. package/src/inputReader.test.ts +39 -52
  241. package/src/inputReader.ts +2 -4
  242. package/src/inputReaderState.ts +1 -1
  243. package/src/inspect.ts +1 -1
  244. package/src/javaKeyStoreParser.test.ts +12 -14
  245. package/src/javaKeyStoreParser.ts +2 -6
  246. package/src/jsonParser.test.ts +2 -4
  247. package/src/jsonParser.ts +34 -38
  248. package/src/lazyMessageError.test.ts +21 -0
  249. package/src/lazyMessageError.ts +88 -0
  250. package/src/leb128Parser.test.ts +25 -23
  251. package/src/leb128Parser.ts +19 -19
  252. package/src/negativeLookaheadParser.test.ts +7 -11
  253. package/src/negativeLookaheadParser.ts +2 -2
  254. package/src/noStackCaptureOverheadError.test.ts +17 -0
  255. package/src/noStackCaptureOverheadError.ts +12 -0
  256. package/src/nonEmptyArrayParser.test.ts +3 -2
  257. package/src/nonEmptyArrayParser.ts +2 -2
  258. package/src/optionalParser.ts +2 -2
  259. package/src/parser.test.ts +96 -43
  260. package/src/parser.test.ts.md +13 -6
  261. package/src/parser.test.ts.snap +0 -0
  262. package/src/parser.ts +35 -12
  263. package/src/parserAccessorParser.ts +1 -1
  264. package/src/parserConsumedSequenceParser.ts +3 -3
  265. package/src/parserContext.test.ts +7 -3
  266. package/src/parserContext.ts +82 -48
  267. package/src/parserError.ts +143 -63
  268. package/src/parserImplementationInvariant.ts +3 -3
  269. package/src/parserInputCompanion.ts +2 -2
  270. package/src/promiseCompose.ts +2 -2
  271. package/src/regexpParser.test.ts +186 -0
  272. package/src/regexpParser.ts +94 -0
  273. package/src/regularExpression.ts +24 -0
  274. package/src/regularExpressionParser.test.ts +102 -0
  275. package/src/regularExpressionParser.ts +921 -0
  276. package/src/separatedArrayParser.ts +3 -3
  277. package/src/separatedNonEmptyArrayParser.test.ts +117 -0
  278. package/src/separatedNonEmptyArrayParser.ts +61 -0
  279. package/src/sequenceBuffer.test.ts +9 -9
  280. package/src/sequenceBuffer.ts +4 -4
  281. package/src/sequenceTerminatedSequenceParser.test.ts +3 -5
  282. package/src/sequenceTerminatedSequenceParser.ts +4 -4
  283. package/src/sequenceUnparser.ts +2 -2
  284. package/src/skipToParser.ts +2 -2
  285. package/src/sliceBoundedParser.test.ts +4 -12
  286. package/src/sliceBoundedParser.ts +2 -2
  287. package/src/smali.ts +8 -3
  288. package/src/smaliParser.test.ts +377 -66
  289. package/src/smaliParser.test.ts.md +1635 -48
  290. package/src/smaliParser.test.ts.snap +0 -0
  291. package/src/smaliParser.ts +2751 -569
  292. package/src/stringFromAsyncIterable.ts +9 -0
  293. package/src/terminatedArrayParser.test.ts +11 -11
  294. package/src/terminatedArrayParser.ts +5 -7
  295. package/src/toAsyncIterator.ts +8 -8
  296. package/src/uint8Array.ts +2 -3
  297. package/src/unionParser.test.ts +22 -23
  298. package/src/unionParser.ts +6 -8
  299. package/src/unparser.test.ts +18 -34
  300. package/src/unparser.ts +13 -9
  301. package/src/unparserContext.ts +9 -13
  302. package/src/unparserError.ts +2 -1
  303. package/src/unparserImplementationInvariant.ts +1 -1
  304. package/src/unparserOutputCompanion.ts +1 -1
  305. package/src/zip.ts +2 -6
  306. package/src/zipParser.ts +10 -18
  307. package/src/zipUnparser.test.ts +1 -1
  308. package/src/zipUnparser.ts +52 -64
  309. package/tsconfig.json +7 -1
  310. package/xo.config.ts +15 -0
  311. package/.yarn/releases/yarn-4.5.3.cjs +0 -934
@@ -9,15 +9,17 @@ import {
9
9
  zip64EndOfCentralDirectoryRecordParser,
10
10
  zipArchiveDecryptionHeaderParser,
11
11
  zipArchiveExtraDataRecordParser,
12
- ZipCentralDirectoryHeader,
12
+ type ZipCentralDirectoryHeader,
13
13
  zipCentralDirectoryHeaderParser,
14
- ZipEndOfCentralDirectoryRecord,
14
+ type ZipEndOfCentralDirectoryRecord,
15
15
  zipEndOfCentralDirectoryRecordParser,
16
16
  zipFromZipSegments,
17
- ZipLocalFile,
17
+ type ZipLocalFile,
18
18
  zipLocalFileParser,
19
19
  } from './zipParser.js';
20
- import { AndroidPackageSignatureV2AdditionalAttribute, AndroidPackageSignatureV2Digest, AndroidPackageSignatureV2Signature, AndroidPackageSignatureV2SignedData, AndroidPackageSignatureV2Signer, type AndroidPackage, type AndroidPackageSigningBlock, type AndroidPackageSigningBlockPair } from './androidPackage.js';
20
+ import {
21
+ type AndroidPackageSignatureV2AdditionalAttribute, type AndroidPackageSignatureV2Digest, type AndroidPackageSignatureV2Signature, type AndroidPackageSignatureV2SignedData, type AndroidPackageSignatureV2Signer, type AndroidPackage, type AndroidPackageSigningBlock, type AndroidPackageSigningBlockPair,
22
+ } from './androidPackage.js';
21
23
  import { createFixedLengthSequenceParser } from './fixedLengthSequenceParser.js';
22
24
  import { parserCreatorCompose } from './parserCreatorCompose.js';
23
25
  import { createExactSequenceParser } from './exactSequenceParser.js';
@@ -55,9 +57,7 @@ const createUint64LengthPrefixedParser = <T>(createInnerParser: (length: bigint)
55
57
  length => createInnerParser(length),
56
58
  )();
57
59
 
58
- const createUint32LengthPrefixedSliceBoundedParser = <T>(innerParser: Parser<T, Uint8Array>): Parser<T, Uint8Array> => createUint32LengthPrefixedParser(
59
- length => createSliceBoundedParser(innerParser, length),
60
- );
60
+ const createUint32LengthPrefixedSliceBoundedParser = <T>(innerParser: Parser<T, Uint8Array>): Parser<T, Uint8Array> => createUint32LengthPrefixedParser(length => createSliceBoundedParser(innerParser, length));
61
61
 
62
62
  const createUint32LengthPrefixedSliceBoundedArrayParser = <T>(innerParser: Parser<T, Uint8Array>): Parser<T[], Uint8Array> => createUint32LengthPrefixedSliceBoundedParser(createArrayParser(innerParser));
63
63
 
@@ -143,180 +143,150 @@ const createAndroidPackageSigningBlockPairInnerParser = (length: number): Parser
143
143
  return androidPackageSigningBlockPairInnerParser;
144
144
  };
145
145
 
146
- const androidPackageSigningBlockPairParser: Parser<AndroidPackageSigningBlockPairType, Uint8Array> = createUint64LengthPrefixedParser(
147
- length => createAndroidPackageSigningBlockPairInnerParser(Number(length)),
148
- );
146
+ const androidPackageSigningBlockPairParser: Parser<AndroidPackageSigningBlockPairType, Uint8Array> = createUint64LengthPrefixedParser(length => createAndroidPackageSigningBlockPairInnerParser(Number(length)));
149
147
 
150
148
  setParserName(androidPackageSigningBlockPairParser, 'androidPackageSigningBlockPairParser');
151
149
 
152
150
  const androidPackageSigningBlockPairsParser: Parser<AndroidPackageSigningBlockPairType[], Uint8Array> = createArrayParser(androidPackageSigningBlockPairParser);
153
151
 
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 ? {
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
+ ? {
186
184
  signers: signatureV2Pair?.signers,
187
- } : undefined,
188
- pairs: genericPairs,
189
- };
190
- },
191
- ),
192
- );
185
+ }
186
+ : undefined,
187
+ pairs: genericPairs,
188
+ };
189
+ },
190
+ ));
193
191
 
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
- );
192
+ const androidPackageSignatureV2DigestParser = createUint32LengthPrefixedParser<AndroidPackageSignatureV2Digest>(pairLength => promiseCompose(
193
+ createTupleParser([
194
+ uint32LEParser,
195
+ createUint32LengthPrefixedParser(digestLength => createFixedLengthSequenceParser(digestLength)),
196
+ ]),
197
+ ([ signatureAlgorithmId, digest ]) => ({ signatureAlgorithmId, digest }),
198
+ ));
205
199
 
206
- const androidPackageSignatureV2DigestsParser = createUint32LengthPrefixedSliceBoundedArrayParser(
207
- androidPackageSignatureV2DigestParser,
208
- );
200
+ const androidPackageSignatureV2DigestsParser = createUint32LengthPrefixedSliceBoundedArrayParser(androidPackageSignatureV2DigestParser);
209
201
 
210
202
  setParserName(androidPackageSignatureV2DigestsParser, 'androidPackageSignatureV2DigestsParser');
211
203
 
212
- const androidPackageSignatureV2CertificateParser = createUint32LengthPrefixedParser(
213
- certificateLength => createFixedLengthSequenceParser(certificateLength),
214
- );
204
+ const androidPackageSignatureV2CertificateParser = createUint32LengthPrefixedParser(certificateLength => createFixedLengthSequenceParser(certificateLength));
215
205
 
216
206
  setParserName(androidPackageSignatureV2CertificateParser, 'androidPackageSignatureV2CertificateParser');
217
207
 
218
- const androidPackageSignatureV2CertificatesParser = createUint32LengthPrefixedSliceBoundedArrayParser(
219
- androidPackageSignatureV2CertificateParser,
220
- );
208
+ const androidPackageSignatureV2CertificatesParser = createUint32LengthPrefixedSliceBoundedArrayParser(androidPackageSignatureV2CertificateParser);
221
209
 
222
210
  setParserName(androidPackageSignatureV2CertificatesParser, 'androidPackageSignatureV2CertificatesParser');
223
211
 
224
- const androidPackageSignatureV2AdditionalAttributeParser = createUint32LengthPrefixedParser<AndroidPackageSignatureV2AdditionalAttribute>(
225
- pairLength => promiseCompose(
226
- createTupleParser([
227
- uint32LEParser,
228
- createFixedLengthSequenceParser(pairLength - 4),
229
- ]),
230
- ([ id, value ]) => ({ id, value }),
231
- ),
232
- );
212
+ const androidPackageSignatureV2AdditionalAttributeParser = createUint32LengthPrefixedParser<AndroidPackageSignatureV2AdditionalAttribute>(pairLength => promiseCompose(
213
+ createTupleParser([
214
+ uint32LEParser,
215
+ createFixedLengthSequenceParser(pairLength - 4),
216
+ ]),
217
+ ([ id, value ]) => ({ id, value }),
218
+ ));
233
219
 
234
220
  setParserName(androidPackageSignatureV2AdditionalAttributeParser, 'androidPackageSignatureV2AdditionalAttributeParser');
235
221
 
236
- const androidPackageSignatureV2AdditionalAttributesParser = createUint32LengthPrefixedSliceBoundedArrayParser(
237
- androidPackageSignatureV2AdditionalAttributeParser,
238
- );
222
+ const androidPackageSignatureV2AdditionalAttributesParser = createUint32LengthPrefixedSliceBoundedArrayParser(androidPackageSignatureV2AdditionalAttributeParser);
239
223
 
240
224
  setParserName(androidPackageSignatureV2AdditionalAttributesParser, 'androidPackageSignatureV2AdditionalAttributesParser');
241
225
 
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
- );
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
+ ));
263
245
 
264
246
  setParserName(androidPackageSignatureV2SignedDataParser, 'androidPackageSignatureV2SignedDataParser');
265
247
 
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
- );
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
+ ));
283
261
 
284
- const androidPackageSignatureV2SignaturesParser = createUint32LengthPrefixedSliceBoundedArrayParser(
285
- androidPackageSignatureV2SignatureParser,
286
- );
262
+ const androidPackageSignatureV2SignaturesParser = createUint32LengthPrefixedSliceBoundedArrayParser(androidPackageSignatureV2SignatureParser);
287
263
 
288
264
  setParserName(androidPackageSignatureV2SignaturesParser, 'androidPackageSignatureV2SignaturesParser');
289
265
 
290
- const androidPackageSignatureV2PublicKeyParser = createUint32LengthPrefixedParser(
291
- publicKeyLength => createFixedLengthSequenceParser(publicKeyLength),
292
- );
266
+ const androidPackageSignatureV2PublicKeyParser = createUint32LengthPrefixedParser(publicKeyLength => createFixedLengthSequenceParser(publicKeyLength));
293
267
 
294
268
  setParserName(androidPackageSignatureV2PublicKeyParser, 'androidPackageSignatureV2PublicKeyParser');
295
269
 
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
- );
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
+ ));
314
286
 
315
287
  setParserName(androidPackageSignatureV2SignerParser, 'androidPackageSignatureV2SignerParser');
316
288
 
317
- const androidPackageSignatureV2SignersParser = createUint32LengthPrefixedSliceBoundedArrayParser(
318
- androidPackageSignatureV2SignerParser,
319
- );
289
+ const androidPackageSignatureV2SignersParser = createUint32LengthPrefixedSliceBoundedArrayParser(androidPackageSignatureV2SignerParser);
320
290
 
321
291
  setParserName(androidPackageSignatureV2SignersParser, 'androidPackageSignatureV2SignersParser');
322
292
 
@@ -371,35 +341,23 @@ export type AndroidPackageSignableSections = {
371
341
  androidPackageSigningBlockUint8Array?: Uint8Array;
372
342
  zipCentralDirectoryUint8Array: Uint8Array;
373
343
  zipEndOfCentralDirectoryUint8Array: Uint8Array;
374
- }
344
+ };
375
345
 
376
346
  export const androidPackageSignableSectionsParser: Parser<AndroidPackageSignableSections, Uint8Array> = promiseCompose(
377
347
  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
- ),
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),
403
361
  ]),
404
362
  async ([
405
363
  [
@@ -1,36 +1,34 @@
1
1
  import test from 'ava';
2
+ import invariant from 'invariant';
2
3
  import { uint8ArrayParserInputCompanion } from './parserInputCompanion.js';
3
4
  import { runParser } from './parser.js';
4
5
  import { androidPackageParser, androidPackageSigningBlockParser } from './androidPackageParser.js';
5
6
  import { runUnparser } from './unparser.js';
6
7
  import { androidPackageSigningBlockUnparser } from './androidPackageUnparser.js';
7
8
  import { uint8ArrayUnparserOutputCompanion } from './unparserOutputCompanion.js';
8
- import invariant from 'invariant';
9
9
  import { fetchCid } from './fetchCid.js';
10
10
 
11
- for (const androidPackageCid of [
12
- 'bafkreicckcmzrdxwoc3w2in3tivpyxrdtcfpct4zwauq3igew3nkpvfapu',
13
- ]) {
14
- test(
15
- 'androidPackage ' + androidPackageCid,
16
- async t => {
17
- const androidPackageStream = await fetchCid(androidPackageCid);
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
+ });
18
19
 
19
- const androidPackage = await runParser(androidPackageParser, androidPackageStream, uint8ArrayParserInputCompanion, {
20
- errorJoinMode: 'all',
21
- });
20
+ const androidPackageSigningBlock = androidPackage.signingBlock;
22
21
 
23
- const androidPackageSigningBlock = androidPackage.signingBlock;
22
+ invariant(androidPackageSigningBlock, 'APK has no signing block');
24
23
 
25
- invariant(androidPackageSigningBlock, 'APK has no signing block');
24
+ const androidPackageSigningBlockStream = runUnparser(androidPackageSigningBlockUnparser, androidPackageSigningBlock, uint8ArrayUnparserOutputCompanion);
26
25
 
27
- const androidPackageSigningBlockStream = runUnparser(androidPackageSigningBlockUnparser, androidPackageSigningBlock, uint8ArrayUnparserOutputCompanion);
26
+ const actual = await runParser(androidPackageSigningBlockParser, androidPackageSigningBlockStream, uint8ArrayParserInputCompanion, {
27
+ errorJoinMode: 'all',
28
+ });
28
29
 
29
- const actual = await runParser(androidPackageSigningBlockParser, androidPackageSigningBlockStream, uint8ArrayParserInputCompanion, {
30
- errorJoinMode: 'all',
31
- });
30
+ t.deepEqual(actual, androidPackageSigningBlock);
31
+ },
32
+ });
32
33
 
33
- t.deepEqual(actual, androidPackageSigningBlock);
34
- },
35
- );
36
- }
34
+ test(androidPackageUnparserMacro, 'bafkreicckcmzrdxwoc3w2in3tivpyxrdtcfpct4zwauq3igew3nkpvfapu');
@@ -1,7 +1,9 @@
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";
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';
5
7
 
6
8
  const uint8ArrayUnparser = createSequenceUnparser<Uint8Array>();
7
9
 
@@ -9,7 +11,7 @@ const uint32LEUnparser: Unparser<number, Uint8Array> = async function * (input)
9
11
  const buffer = Buffer.alloc(4);
10
12
  buffer.writeUInt32LE(input);
11
13
  yield buffer;
12
- }
14
+ };
13
15
 
14
16
  const uint64LEUnparser: Unparser<number | bigint, Uint8Array> = async function * (input) {
15
17
  const buffer = Buffer.alloc(8);
@@ -97,18 +99,22 @@ export const androidPackageSigningBlockUnparser: Unparser<AndroidPackageSigningB
97
99
  ) {
98
100
  const pairs = [
99
101
  ...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
- ] : []),
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
+ : []),
112
118
  ];
113
119
 
114
120
  const sizeOfBlockWriteLater = yield * unparserContext.writeLater(8);
@@ -26,7 +26,7 @@ export function arbitrarilySlicedAsyncIterable<Sliceable extends string | Uint8A
26
26
  {
27
27
  minSlices = 1,
28
28
  }: {
29
- minSlices?: number,
29
+ minSlices?: number;
30
30
  } = {},
31
31
  ): Arbitrary<[ Sliceable, AsyncIterable<Sliceable> ]> {
32
32
  return (
@@ -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 [