From ac71e332ea2b115ce2caded24140dd1d32ab3cfc Mon Sep 17 00:00:00 2001 From: becominginsane Date: Fri, 20 Oct 2023 23:27:03 +0800 Subject: [PATCH 01/24] refactor: zcashtools as ts package --- zcashtools/neon/build/index.js | 35 ++++++++++ zcashtools/neon/build/native.js | 4 ++ zcashtools/neon/lib/index.d.ts | 3 - zcashtools/neon/lib/index.js | 115 -------------------------------- zcashtools/neon/lib/index.ts | 35 ++++++++++ zcashtools/neon/lib/native.ts | 90 +++++++++++++++++++++++++ zcashtools/neon/package.json | 7 +- zcashtools/neon/tsconfig.json | 109 ++++++++++++++++++++++++++++++ 8 files changed, 279 insertions(+), 119 deletions(-) create mode 100644 zcashtools/neon/build/index.js create mode 100644 zcashtools/neon/build/native.js delete mode 100644 zcashtools/neon/lib/index.d.ts delete mode 100644 zcashtools/neon/lib/index.js create mode 100644 zcashtools/neon/lib/index.ts create mode 100644 zcashtools/neon/lib/native.ts create mode 100644 zcashtools/neon/tsconfig.json diff --git a/zcashtools/neon/build/index.js b/zcashtools/neon/build/index.js new file mode 100644 index 00000000..07a8c37c --- /dev/null +++ b/zcashtools/neon/build/index.js @@ -0,0 +1,35 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ZcashBuilderBridge = exports.get_inittx_data = void 0; +const native_1 = __importDefault(require("./native")); +exports.get_inittx_data = native_1.default.get_inittx_data; +class ZcashBuilderBridge { + constructor(fee) { + this.boxed = native_1.default.builderNew(fee); + } + add_transparent_input(t_input) { + return native_1.default.builderAddTransparentInput.call(this.boxed, t_input); + } + add_transparent_output(t_output) { + return native_1.default.builderAddTransparentOutput.call(this.boxed, t_output); + } + add_sapling_spend(z_spend) { + return native_1.default.builderAddSaplingSpend.call(this.boxed, z_spend); + } + add_sapling_output(z_output) { + return native_1.default.builderAddSaplingOutput.call(this.boxed, z_output); + } + build(spend_path, output_path, tx_version) { + return native_1.default.builderBuild.call(this.boxed, spend_path, output_path, tx_version); + } + add_signatures(signatures) { + return native_1.default.builderAddSignatures.call(this.boxed, signatures); + } + finalize() { + return native_1.default.builderFinalize.call(this.boxed); + } +} +exports.ZcashBuilderBridge = ZcashBuilderBridge; diff --git a/zcashtools/neon/build/native.js b/zcashtools/neon/build/native.js new file mode 100644 index 00000000..ab20f189 --- /dev/null +++ b/zcashtools/neon/build/native.js @@ -0,0 +1,4 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const addon = require("../native/index.node"); +exports.default = addon; diff --git a/zcashtools/neon/lib/index.d.ts b/zcashtools/neon/lib/index.d.ts deleted file mode 100644 index da3282fc..00000000 --- a/zcashtools/neon/lib/index.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -declare module '@zondax/zcashtools'{ - export {ZcashBuilderBridge, get_inittx_data} -} \ No newline at end of file diff --git a/zcashtools/neon/lib/index.js b/zcashtools/neon/lib/index.js deleted file mode 100644 index 8f086af5..00000000 --- a/zcashtools/neon/lib/index.js +++ /dev/null @@ -1,115 +0,0 @@ -var addon = require('../native'); -const { get_inittx_data, builderNew, builderAddTransparentInput, builderAddTransparentOutput, - builderAddSaplingSpend, builderAddSaplingOutput, builderBuild, builderAddSignatures, - builderFinalize} = require("../native/index.node"); - -// Here we can write some simple tests for play around -console.log("--------------------------------------") -console.log("- Zcash Tools Scratch Tests -") -console.log("--------------------------------------\n\n") - - -function addr_to_script(addr) { - const begin = Buffer.from("1976a914", 'hex'); - const end = Buffer.from("88ac", 'hex'); - var x = Buffer.concat([begin, addr, end]); - return x; -} - -class ZcashBuilderBridge{ - constructor(fee) { - this.boxed = builderNew(fee) - } - // Wrap each method with a delegate to `this.db` - // This could be done in several other ways, for example binding assignment - // in the constructor - add_transparent_input(t_input){ - return builderAddTransparentInput.call(this.boxed, t_input); - } - add_transparent_output(t_output){ - return builderAddTransparentOutput.call(this.boxed, t_output); - } - add_sapling_spend(z_spend){ - return builderAddSaplingSpend.call(this.boxed, z_spend); - } - add_sapling_output(z_output){ - return builderAddSaplingOutput.call(this.boxed, z_output); - } - build(spend_path, output_path, tx_version){ - return builderBuild.call(this.boxed, spend_path, output_path, tx_version); - } - add_signatures(signatures){ - return builderAddSignatures.call(this.boxed, signatures); - } - - finalize(signatures){ - return builderFinalize.call(this.boxed); - } - -} -module.exports = {ZcashBuilderBridge,get_inittx_data} -/* -const Resolve = require("path").resolve; -const SPEND_PATH = Resolve("../zcashtools/src/sapling-spend.params"); -const OUTPUT_PATH = Resolve("../zcashtools/src/sapling-output.params"); - -outp = Buffer.alloc(36); //get this from blockchain -script = Buffer.from("76a9140f71709c4b828df00f93d20aa2c34ae987195b3388ac",'hex'); -valuet = U64ToBuf(100); -pk = Buffer.from("031f6d238009787c20d5d7becb6b6ad54529fc0a3fd35088e85c2c3966bfec050e",'hex'); - -//send to ledger to check: [HDPATH (120), script (33), value (8)] -//check by: computing pk from HDPATH -> convert to scriptthing -//check value in the hash - -//send ledger to check: [outaddr, value] -//check by: the outputhash - -tbuf = Buffer.concat([outp, pk, valuet,script]); -console.log(builder.add_transparent_input(tbuf)) - -valuetout = U64ToBuf(50); -outaddr = Buffer.alloc(20); -obuf = Buffer.concat([outaddr,valuetout]); - -console.log(builder.add_transparent_output(obuf)); - - -proofkey = Buffer.from("4e005f180dab2f445ab109574fd2695e705631cd274b4f58e2b53bb3bc73ed5a3caddba8e4daddf42f11ca89e4961ae3ddc41b3bdd08c36d5a7dfcc30839d405",'hex'); -rcv = Buffer.from("f802b07c85afb64a271f8e9641ce04ca75f255ba1d52d7a889a4fb38ea03bb09",'hex'); -alpha = Buffer.from("78770181665b6142dcd104fe1f9b9c8788ea46b90192df144cdca3e5f0560002",'hex'); -ovk = Buffer.from("6fc01eaa665e03a53c1e033ed0d77b670cf075ede4ada769997a2ed2ec225fca",'hex'); -address = Buffer.from("c69e979c6763c1b09238dc6bd5dcbf35360df95dcadf8c0fa25dcbedaaf6057538b812d06656726ea27667",'hex'); -value = Buffer.from("0100100000000000",'hex'); - -buf = Buffer.concat([proofkey,rcv,alpha,ovk,address,value, rcv]); - -builder.add_sapling_spend(buf); -xx = Buffer.concat([rcv,rcv,alpha,ovk,address]); -builder.add_change_address(xx); - -rcn = Buffer.from("f802b07c85afb64a271f8e9641ce04ca75f255ba1d52d7a889a4fb38ea03bb09",'hex'); -esk = Buffer.from("f802b07c85afb64a271f8e9641ce04ca75f255ba1d52d7a889a4fb38ea03bb09",'hex'); -ovk = Buffer.from("0000000000000000000000000000000000000000000000000000000000000000",'hex'); -address = Buffer.from("c69e979c6763c1b09238dc6bd5dcbf35360df95dcadf8c0fa25dcbedaaf6057538b812d06656726ea27667",'hex'); -value = Buffer.from("0100000000000000",'hex'); -memo = Buffer.from("f600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",'hex'); - -outputbuf = Buffer.concat([rcv,rcn,esk,ovk,address,value,memo]); - -builder.add_sapling_output(outputbuf); - -buf = Buffer.alloc(320 + 948 * 2 + 220); - -console.log(builder.build(SPEND_PATH, OUTPUT_PATH, buf)); -builder.add_signatures(Buffer.concat([rcv,alpha]));//should fail -console.log(buf); - - - */ -console.log("\n\n--------------------------------------") -/* -- get_shielded_address -- make transaction: -1. send #spends | #outputs | spenddata (pos + value + address) | outputdata (address/value + value) - */ diff --git a/zcashtools/neon/lib/index.ts b/zcashtools/neon/lib/index.ts new file mode 100644 index 00000000..e834d121 --- /dev/null +++ b/zcashtools/neon/lib/index.ts @@ -0,0 +1,35 @@ +import addon, { OutputInfo, SpendInfo, TransactionSignatures, TransparentInputInfo, TransparentOutputInfo, ZcashBuilder } from './native'; + +export type { InitData } from './native' +export const get_inittx_data = addon.get_inittx_data; + +export class ZcashBuilderBridge { + private boxed: ZcashBuilder; + + constructor(fee: number) { + this.boxed = addon.builderNew(fee) + } + + add_transparent_input(t_input: TransparentInputInfo) { + return addon.builderAddTransparentInput.call(this.boxed, t_input); + } + add_transparent_output(t_output: TransparentOutputInfo) { + return addon.builderAddTransparentOutput.call(this.boxed, t_output); + } + add_sapling_spend(z_spend: SpendInfo) { + return addon.builderAddSaplingSpend.call(this.boxed, z_spend); + } + add_sapling_output(z_output: OutputInfo) { + return addon.builderAddSaplingOutput.call(this.boxed, z_output); + } + build(spend_path: string, output_path: string, tx_version: number) { + return addon.builderBuild.call(this.boxed, spend_path, output_path, tx_version); + } + add_signatures(signatures: TransactionSignatures) { + return addon.builderAddSignatures.call(this.boxed, signatures); + } + + finalize() { + return addon.builderFinalize.call(this.boxed); + } +} diff --git a/zcashtools/neon/lib/native.ts b/zcashtools/neon/lib/native.ts new file mode 100644 index 00000000..a60d815f --- /dev/null +++ b/zcashtools/neon/lib/native.ts @@ -0,0 +1,90 @@ +export interface TinData { + path: Uint32Array[]; + address: string, + value: number, +} + +export interface ToutData { + address: string, + value: number +} + +export interface ShieldedSpendData { + path: number, + address: string, + value: number, +} + +export interface ShieldedOutputData { + address: string, + value: number, + memo_type: number, + ovk?: string, +} + +export interface InitData { + t_in: TinData[], + t_out: ToutData[], + s_spend: ShieldedSpendData[], + s_output: ShieldedOutputData[], +} + +export type ZcashBuilder = { + readonly __brand: unique symbol; +}; + +export interface TransparentInputInfo { + outp: string, + pk: string, + address: string, + value: number +} + +export interface TransparentOutputInfo { + address: string + value: number +} + +export interface SpendInfo { + proofkey: string; + rcv: string; + alpha: string; + address: string, + value: number, + witness: string, + rseed: string, +} + +export interface OutputInfo { + rcv: string, + rseed: string, + ovk?: string, + address: string, + value: number, + memo?: string, + hash_seed?: Uint8Array, +} + +export interface TransactionSignatures { + transparent_sigs: string[], + spend_sigs: string[] +} + +interface NativeModule { + get_inittx_data(_: InitData): Buffer; + + builderNew(fee: number): ZcashBuilder; + + builderAddTransparentInput(this: ZcashBuilder, tin: TransparentInputInfo): boolean; + builderAddTransparentOutput(this: ZcashBuilder, tout: TransparentOutputInfo): boolean; + builderAddSaplingSpend(this: ZcashBuilder, spend: SpendInfo): boolean; + builderAddSaplingOutput(this: ZcashBuilder, out: OutputInfo): boolean; + + builderBuild(this: ZcashBuilder, spend_path: string, output_path: string, tx_version: number): Uint8Array; + + builderAddSignatures(this: ZcashBuilder, sigs: TransactionSignatures): boolean; + builderFinalize(this: ZcashBuilder): Uint8Array; +} + +const addon: NativeModule = require("../native/index.node") +export default addon; diff --git a/zcashtools/neon/package.json b/zcashtools/neon/package.json index 1b362043..f17fa6eb 100644 --- a/zcashtools/neon/package.json +++ b/zcashtools/neon/package.json @@ -3,7 +3,7 @@ "type": "commonjs", "version": "0.1.0", "description": "", - "main": "lib/index.js", + "main": "build/index.js", "author": "Zondax AG ", "license": "Apache-2.0", "dependencies": { @@ -11,6 +11,11 @@ }, "scripts": { "install": "./node_modules/.bin/neon build", + "build": "tsc", "test": "node -e 'require(\"./\")'" + }, + "devDependencies": { + "@types/node": "^20.8.7", + "typescript": "^5.2.2" } } diff --git a/zcashtools/neon/tsconfig.json b/zcashtools/neon/tsconfig.json new file mode 100644 index 00000000..88684531 --- /dev/null +++ b/zcashtools/neon/tsconfig.json @@ -0,0 +1,109 @@ +{ + "compilerOptions": { + /* Visit https://aka.ms/tsconfig to read more about this file */ + + /* Projects */ + // "incremental": true, /* Save .tsbuildinfo files to allow for incremental compilation of projects. */ + // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */ + // "tsBuildInfoFile": "./.tsbuildinfo", /* Specify the path to .tsbuildinfo incremental compilation file. */ + // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects. */ + // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */ + // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ + + /* Language and Environment */ + "target": "es2016", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ + // "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ + // "jsx": "preserve", /* Specify what JSX code is generated. */ + // "experimentalDecorators": true, /* Enable experimental support for legacy experimental decorators. */ + // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ + // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */ + // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */ + // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */ + // "reactNamespace": "", /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */ + // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */ + // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */ + // "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */ + + /* Modules */ + "module": "commonjs", /* Specify what module code is generated. */ + "rootDir": "lib", /* Specify the root folder within your source files. */ + // "moduleResolution": "node10", /* Specify how TypeScript looks up a file from a given module specifier. */ + // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ + // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */ + // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ + // "typeRoots": [], /* Specify multiple folders that act like './node_modules/@types'. */ + // "types": [], /* Specify type package names to be included without being referenced in a source file. */ + // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ + // "moduleSuffixes": [], /* List of file name suffixes to search when resolving a module. */ + // "allowImportingTsExtensions": true, /* Allow imports to include TypeScript file extensions. Requires '--moduleResolution bundler' and either '--noEmit' or '--emitDeclarationOnly' to be set. */ + // "resolvePackageJsonExports": true, /* Use the package.json 'exports' field when resolving package imports. */ + // "resolvePackageJsonImports": true, /* Use the package.json 'imports' field when resolving imports. */ + // "customConditions": [], /* Conditions to set in addition to the resolver-specific defaults when resolving imports. */ + // "resolveJsonModule": true, /* Enable importing .json files. */ + // "allowArbitraryExtensions": true, /* Enable importing files with any extension, provided a declaration file is present. */ + // "noResolve": true, /* Disallow 'import's, 'require's or ''s from expanding the number of files TypeScript should add to a project. */ + + /* JavaScript Support */ + // "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */ + // "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */ + // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */ + + /* Emit */ + // "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */ + // "declarationMap": true, /* Create sourcemaps for d.ts files. */ + // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */ + // "sourceMap": true, /* Create source map files for emitted JavaScript files. */ + // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */ + // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */ + "outDir": "build", /* Specify an output folder for all emitted files. */ + // "removeComments": true, /* Disable emitting comments. */ + // "noEmit": true, /* Disable emitting files from a compilation. */ + // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ + // "importsNotUsedAsValues": "remove", /* Specify emit/checking behavior for imports that are only used for types. */ + // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */ + // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */ + // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ + // "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */ + // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */ + // "newLine": "crlf", /* Set the newline character for emitting files. */ + // "stripInternal": true, /* Disable emitting declarations that have '@internal' in their JSDoc comments. */ + // "noEmitHelpers": true, /* Disable generating custom helper functions like '__extends' in compiled output. */ + // "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */ + // "preserveConstEnums": true, /* Disable erasing 'const enum' declarations in generated code. */ + // "declarationDir": "./", /* Specify the output directory for generated declaration files. */ + // "preserveValueImports": true, /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */ + + /* Interop Constraints */ + // "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */ + // "verbatimModuleSyntax": true, /* Do not transform or elide any imports or exports not marked as type-only, ensuring they are written in the output file's format based on the 'module' setting. */ + // "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */ + "esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */ + // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ + "forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */ + + /* Type Checking */ + "strict": true, /* Enable all strict type-checking options. */ + // "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied 'any' type. */ + // "strictNullChecks": true, /* When type checking, take into account 'null' and 'undefined'. */ + // "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ + // "strictBindCallApply": true, /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */ + // "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */ + // "noImplicitThis": true, /* Enable error reporting when 'this' is given the type 'any'. */ + // "useUnknownInCatchVariables": true, /* Default catch clause variables as 'unknown' instead of 'any'. */ + // "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */ + // "noUnusedLocals": true, /* Enable error reporting when local variables aren't read. */ + // "noUnusedParameters": true, /* Raise an error when a function parameter isn't read. */ + // "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */ + // "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */ + // "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */ + // "noUncheckedIndexedAccess": true, /* Add 'undefined' to a type when accessed using an index. */ + // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */ + // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type. */ + // "allowUnusedLabels": true, /* Disable error reporting for unused labels. */ + // "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */ + + /* Completeness */ + // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ + "skipLibCheck": true /* Skip type checking all .d.ts files. */ + } +} From d6ea5797df73539c7bc7a95dbd32df5fe1064380 Mon Sep 17 00:00:00 2001 From: becominginsane Date: Fri, 20 Oct 2023 23:48:10 +0800 Subject: [PATCH 02/24] fix(zcashtools:ts): emit declaration files --- zcashtools/neon/build/index.d.ts | 15 +++++++ zcashtools/neon/build/native.d.ts | 75 +++++++++++++++++++++++++++++++ zcashtools/neon/tsconfig.json | 4 +- 3 files changed, 92 insertions(+), 2 deletions(-) create mode 100644 zcashtools/neon/build/index.d.ts create mode 100644 zcashtools/neon/build/native.d.ts diff --git a/zcashtools/neon/build/index.d.ts b/zcashtools/neon/build/index.d.ts new file mode 100644 index 00000000..b174e035 --- /dev/null +++ b/zcashtools/neon/build/index.d.ts @@ -0,0 +1,15 @@ +/// +import { OutputInfo, SpendInfo, TransactionSignatures, TransparentInputInfo, TransparentOutputInfo } from './native'; +export type { InitData } from './native'; +export declare const get_inittx_data: (_: import("./native").InitData) => Buffer; +export declare class ZcashBuilderBridge { + private boxed; + constructor(fee: number); + add_transparent_input(t_input: TransparentInputInfo): boolean; + add_transparent_output(t_output: TransparentOutputInfo): boolean; + add_sapling_spend(z_spend: SpendInfo): boolean; + add_sapling_output(z_output: OutputInfo): boolean; + build(spend_path: string, output_path: string, tx_version: number): Uint8Array; + add_signatures(signatures: TransactionSignatures): boolean; + finalize(): Uint8Array; +} diff --git a/zcashtools/neon/build/native.d.ts b/zcashtools/neon/build/native.d.ts new file mode 100644 index 00000000..43413e55 --- /dev/null +++ b/zcashtools/neon/build/native.d.ts @@ -0,0 +1,75 @@ +/// +export interface TinData { + path: Uint32Array[]; + address: string; + value: number; +} +export interface ToutData { + address: string; + value: number; +} +export interface ShieldedSpendData { + path: number; + address: string; + value: number; +} +export interface ShieldedOutputData { + address: string; + value: number; + memo_type: number; + ovk?: string; +} +export interface InitData { + t_in: TinData[]; + t_out: ToutData[]; + s_spend: ShieldedSpendData[]; + s_output: ShieldedOutputData[]; +} +export type ZcashBuilder = { + readonly __brand: unique symbol; +}; +export interface TransparentInputInfo { + outp: string; + pk: string; + address: string; + value: number; +} +export interface TransparentOutputInfo { + address: string; + value: number; +} +export interface SpendInfo { + proofkey: string; + rcv: string; + alpha: string; + address: string; + value: number; + witness: string; + rseed: string; +} +export interface OutputInfo { + rcv: string; + rseed: string; + ovk?: string; + address: string; + value: number; + memo?: string; + hash_seed?: Uint8Array; +} +export interface TransactionSignatures { + transparent_sigs: string[]; + spend_sigs: string[]; +} +interface NativeModule { + get_inittx_data(_: InitData): Buffer; + builderNew(fee: number): ZcashBuilder; + builderAddTransparentInput(this: ZcashBuilder, tin: TransparentInputInfo): boolean; + builderAddTransparentOutput(this: ZcashBuilder, tout: TransparentOutputInfo): boolean; + builderAddSaplingSpend(this: ZcashBuilder, spend: SpendInfo): boolean; + builderAddSaplingOutput(this: ZcashBuilder, out: OutputInfo): boolean; + builderBuild(this: ZcashBuilder, spend_path: string, output_path: string, tx_version: number): Uint8Array; + builderAddSignatures(this: ZcashBuilder, sigs: TransactionSignatures): boolean; + builderFinalize(this: ZcashBuilder): Uint8Array; +} +declare const addon: NativeModule; +export default addon; diff --git a/zcashtools/neon/tsconfig.json b/zcashtools/neon/tsconfig.json index 88684531..11ce3c10 100644 --- a/zcashtools/neon/tsconfig.json +++ b/zcashtools/neon/tsconfig.json @@ -49,7 +49,7 @@ // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */ /* Emit */ - // "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */ + "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */ // "declarationMap": true, /* Create sourcemaps for d.ts files. */ // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */ // "sourceMap": true, /* Create source map files for emitted JavaScript files. */ @@ -70,7 +70,7 @@ // "noEmitHelpers": true, /* Disable generating custom helper functions like '__extends' in compiled output. */ // "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */ // "preserveConstEnums": true, /* Disable erasing 'const enum' declarations in generated code. */ - // "declarationDir": "./", /* Specify the output directory for generated declaration files. */ + "declarationDir": "build", /* Specify the output directory for generated declaration files. */ // "preserveValueImports": true, /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */ /* Interop Constraints */ From 4271b9d66db78f7345a2a69502bacada97ece5aa Mon Sep 17 00:00:00 2001 From: becominginsane Date: Fri, 27 Oct 2023 00:58:12 +0800 Subject: [PATCH 03/24] fix(zcashtools:ts): TinData.path to normal array tests: import types from package --- tests_zemu/tests/vectors.ts | 318 +++++++++++++++--------------- zcashtools/neon/build/native.d.ts | 2 +- zcashtools/neon/lib/native.ts | 2 +- zcashtools/neon/yarn.lock | 17 ++ 4 files changed, 182 insertions(+), 157 deletions(-) diff --git a/tests_zemu/tests/vectors.ts b/tests_zemu/tests/vectors.ts index fe391472..7b3513cb 100644 --- a/tests_zemu/tests/vectors.ts +++ b/tests_zemu/tests/vectors.ts @@ -1,178 +1,186 @@ -export type TIn = { - path: number[], - address: string, - value: number -} -export type TOut = { - address: string, - value: number -} -export type SSpend = { - path: number, - address: string, - value: number -} -export type SOut = { - address: string, - value: number, - memo_type: number, - ovk?: string | null -} - -export type TxInputData = { - t_in: TIn[], - t_out: TOut[], - s_spend: SSpend[], - s_output: SOut[], -} +import type { InitData as TxInputData } from '@zondax/zcashtools' const zero: TxInputData = { t_in: [], t_out: [], - s_spend: [{ - path: 1000, - address: 'c69e979c6763c1b09238dc6bd5dcbf35360df95dcadf8c0fa25dcbedaaf6057538b812d06656726ea27667', - value: 50000, - }, { - path: 1000, - address: 'c69e979c6763c1b09238dc6bd5dcbf35360df95dcadf8c0fa25dcbedaaf6057538b812d06656726ea27667', - value: 50000, - }], - s_output: [{ - address: '15eae700e01e24e2137d554d67bb0da64eee0bf1c2c392c5f1173a979baeb899663808cd22ed8df27566cc', - value: 55000, - memo_type: 0xf6, - ovk: null - }, - { - address: 'c69e979c6763c1b09238dc6bd5dcbf35360df95dcadf8c0fa25dcbedaaf6057538b812d06656726ea27667', - value: 100000 - 1000 - 55000, - memo_type: 0xf6, - ovk: '6fc01eaa665e03a53c1e033ed0d77b670cf075ede4ada769997a2ed2ec225fca', - }] -}; + s_spend: [ + { + path: 1000, + address: 'c69e979c6763c1b09238dc6bd5dcbf35360df95dcadf8c0fa25dcbedaaf6057538b812d06656726ea27667', + value: 50000, + }, + { + path: 1000, + address: 'c69e979c6763c1b09238dc6bd5dcbf35360df95dcadf8c0fa25dcbedaaf6057538b812d06656726ea27667', + value: 50000, + }, + ], + s_output: [ + { + address: '15eae700e01e24e2137d554d67bb0da64eee0bf1c2c392c5f1173a979baeb899663808cd22ed8df27566cc', + value: 55000, + memo_type: 0xf6, + }, + { + address: 'c69e979c6763c1b09238dc6bd5dcbf35360df95dcadf8c0fa25dcbedaaf6057538b812d06656726ea27667', + value: 100000 - 1000 - 55000, + memo_type: 0xf6, + ovk: '6fc01eaa665e03a53c1e033ed0d77b670cf075ede4ada769997a2ed2ec225fca', + }, + ], +} const one: TxInputData = { - t_in: [{ - path: [44 + 0x80000000, 133 + 0x80000000, 5 + 0x80000000, 0, 0], - address: '1976a9140f71709c4b828df00f93d20aa2c34ae987195b3388ac', - value: 60000, - }], + t_in: [ + { + path: Uint32Array.from([44 + 0x80000000, 133 + 0x80000000, 5 + 0x80000000, 0, 0]), + address: '1976a9140f71709c4b828df00f93d20aa2c34ae987195b3388ac', + value: 60000, + }, + ], t_out: [], - s_spend: [{ - path: 1000, - address: 'c69e979c6763c1b09238dc6bd5dcbf35360df95dcadf8c0fa25dcbedaaf6057538b812d06656726ea27667', - value: 40000, - }], - s_output: [{ - address: '15eae700e01e24e2137d554d67bb0da64eee0bf1c2c392c5f1173a979baeb899663808cd22ed8df27566cc', - value: 65000, - memo_type: 0xf6, - ovk: null, - }, { - address: 'c69e979c6763c1b09238dc6bd5dcbf35360df95dcadf8c0fa25dcbedaaf6057538b812d06656726ea27667', - value: 100000 - 1000 - 55000 - 10000, - memo_type: 0xf6, - ovk: '6fc01eaa665e03a53c1e033ed0d77b670cf075ede4ada769997a2ed2ec225fca', - }] + s_spend: [ + { + path: 1000, + address: 'c69e979c6763c1b09238dc6bd5dcbf35360df95dcadf8c0fa25dcbedaaf6057538b812d06656726ea27667', + value: 40000, + }, + ], + s_output: [ + { + address: '15eae700e01e24e2137d554d67bb0da64eee0bf1c2c392c5f1173a979baeb899663808cd22ed8df27566cc', + value: 65000, + memo_type: 0xf6, + }, + { + address: 'c69e979c6763c1b09238dc6bd5dcbf35360df95dcadf8c0fa25dcbedaaf6057538b812d06656726ea27667', + value: 100000 - 1000 - 55000 - 10000, + memo_type: 0xf6, + ovk: '6fc01eaa665e03a53c1e033ed0d77b670cf075ede4ada769997a2ed2ec225fca', + }, + ], } const two: TxInputData = { t_in: [], - t_out: [{ - address: '1976a914000000000000000000000000000000000000000088ac', - value: 10000, - }], - s_spend: [{ - path: 1000, - address: 'c69e979c6763c1b09238dc6bd5dcbf35360df95dcadf8c0fa25dcbedaaf6057538b812d06656726ea27667', - value: 100000, - }], - s_output: [{ - address: '15eae700e01e24e2137d554d67bb0da64eee0bf1c2c392c5f1173a979baeb899663808cd22ed8df27566cc', - value: 55000, - memo_type: 0xf6, - ovk: null, - }, { - address: 'c69e979c6763c1b09238dc6bd5dcbf35360df95dcadf8c0fa25dcbedaaf6057538b812d06656726ea27667', - value: 100000 - 1000 - 55000 - 10000, - memo_type: 0xf6, - ovk: '6fc01eaa665e03a53c1e033ed0d77b670cf075ede4ada769997a2ed2ec225fca', - }] + t_out: [ + { + address: '1976a914000000000000000000000000000000000000000088ac', + value: 10000, + }, + ], + s_spend: [ + { + path: 1000, + address: 'c69e979c6763c1b09238dc6bd5dcbf35360df95dcadf8c0fa25dcbedaaf6057538b812d06656726ea27667', + value: 100000, + }, + ], + s_output: [ + { + address: '15eae700e01e24e2137d554d67bb0da64eee0bf1c2c392c5f1173a979baeb899663808cd22ed8df27566cc', + value: 55000, + memo_type: 0xf6, + }, + { + address: 'c69e979c6763c1b09238dc6bd5dcbf35360df95dcadf8c0fa25dcbedaaf6057538b812d06656726ea27667', + value: 100000 - 1000 - 55000 - 10000, + memo_type: 0xf6, + ovk: '6fc01eaa665e03a53c1e033ed0d77b670cf075ede4ada769997a2ed2ec225fca', + }, + ], } const three: TxInputData = { - t_in: [{ - path: [44 + 0x80000000, 133 + 0x80000000, 5 + 0x80000000, 0, 0], - address: '1976a9140f71709c4b828df00f93d20aa2c34ae987195b3388ac', - value: 60000, - }], - t_out: [{ - address: '1976a914000000000000000000000000000000000000000088ac', - value: 10000, - }], - s_spend: [{ - path: 1000, - address: 'c69e979c6763c1b09238dc6bd5dcbf35360df95dcadf8c0fa25dcbedaaf6057538b812d06656726ea27667', - value: 40000, - }], - s_output: [{ - address: '15eae700e01e24e2137d554d67bb0da64eee0bf1c2c392c5f1173a979baeb899663808cd22ed8df27566cc', - value: 55000, - memo_type: 0xf6, - ovk: null, - }, { - address: 'c69e979c6763c1b09238dc6bd5dcbf35360df95dcadf8c0fa25dcbedaaf6057538b812d06656726ea27667', - value: 100000 - 1000 - 55000 - 10000, - memo_type: 0xf6, - ovk: '6fc01eaa665e03a53c1e033ed0d77b670cf075ede4ada769997a2ed2ec225fca', - }] + t_in: [ + { + path: Uint32Array.from([44 + 0x80000000, 133 + 0x80000000, 5 + 0x80000000, 0, 0]), + address: '1976a9140f71709c4b828df00f93d20aa2c34ae987195b3388ac', + value: 60000, + }, + ], + t_out: [ + { + address: '1976a914000000000000000000000000000000000000000088ac', + value: 10000, + }, + ], + s_spend: [ + { + path: 1000, + address: 'c69e979c6763c1b09238dc6bd5dcbf35360df95dcadf8c0fa25dcbedaaf6057538b812d06656726ea27667', + value: 40000, + }, + ], + s_output: [ + { + address: '15eae700e01e24e2137d554d67bb0da64eee0bf1c2c392c5f1173a979baeb899663808cd22ed8df27566cc', + value: 55000, + memo_type: 0xf6, + }, + { + address: 'c69e979c6763c1b09238dc6bd5dcbf35360df95dcadf8c0fa25dcbedaaf6057538b812d06656726ea27667', + value: 100000 - 1000 - 55000 - 10000, + memo_type: 0xf6, + ovk: '6fc01eaa665e03a53c1e033ed0d77b670cf075ede4ada769997a2ed2ec225fca', + }, + ], } const four: TxInputData = { - t_in: [{ - path: [44 + 0x80000000, 133 + 0x80000000, 5 + 0x80000000, 0, 0], - address: '1976a9140f71709c4b828df00f93d20aa2c34ae987195b3388ac', - value: 50000, - }, { - path: [44 + 0x80000000, 133 + 0x80000000, 5 + 0x80000000, 0, 0], - address: '1976a9140f71709c4b828df00f93d20aa2c34ae987195b3388ac', - value: 50000, - }], - t_out: [{ - address: '1976a914000000000000000000000000000000000000000088ac', - value: 10000, - }, { - address: '1976a9140f71709c4b828df00f93d20aa2c34ae987195b3388ac', - value: 100000 - 1000 - 10000, - }], + t_in: [ + { + path: Uint32Array.from([44 + 0x80000000, 133 + 0x80000000, 5 + 0x80000000, 0, 0]), + address: '1976a9140f71709c4b828df00f93d20aa2c34ae987195b3388ac', + value: 50000, + }, + { + path: Uint32Array.from([44 + 0x80000000, 133 + 0x80000000, 5 + 0x80000000, 0, 0]), + address: '1976a9140f71709c4b828df00f93d20aa2c34ae987195b3388ac', + value: 50000, + }, + ], + t_out: [ + { + address: '1976a914000000000000000000000000000000000000000088ac', + value: 10000, + }, + { + address: '1976a9140f71709c4b828df00f93d20aa2c34ae987195b3388ac', + value: 100000 - 1000 - 10000, + }, + ], s_spend: [], - s_output: [] -}; + s_output: [], +} const five: TxInputData = { t_in: [], t_out: [], - s_spend: [{ - path: 1000, - address: 'c69e979c6763c1b09238dc6bd5dcbf35360df95dcadf8c0fa25dcbedaaf6057538b812d06656726ea27667', - value: 50000, - }, { - path: 1000, - address: 'c69e979c6763c1b09238dc6bd5dcbf35360df95dcadf8c0fa25dcbedaaf6057538b812d06656726ea27667', - value: 50000, - }], - s_output: [{ - address: '15eae700e01e24e2137d554d67bb0da64eee0bf1c2c392c5f1173a979baeb899663808cd22ed8df27566cc', - value: 55000, - memo_type: 0xf6, - ovk: null, - }, { - address: 'c69e979c6763c1b09238dc6bd5dcbf35360df95dcadf8c0fa25dcbedaaf6057538b812d06656726ea27667', - value: 100000 - 1000 - 55000, - memo_type: 0xf6, - ovk: null, - }] -}; + s_spend: [ + { + path: 1000, + address: 'c69e979c6763c1b09238dc6bd5dcbf35360df95dcadf8c0fa25dcbedaaf6057538b812d06656726ea27667', + value: 50000, + }, + { + path: 1000, + address: 'c69e979c6763c1b09238dc6bd5dcbf35360df95dcadf8c0fa25dcbedaaf6057538b812d06656726ea27667', + value: 50000, + }, + ], + s_output: [ + { + address: '15eae700e01e24e2137d554d67bb0da64eee0bf1c2c392c5f1173a979baeb899663808cd22ed8df27566cc', + value: 55000, + memo_type: 0xf6, + }, + { + address: 'c69e979c6763c1b09238dc6bd5dcbf35360df95dcadf8c0fa25dcbedaaf6057538b812d06656726ea27667', + value: 100000 - 1000 - 55000, + memo_type: 0xf6, + }, + ], +} -export const TX_INPUT_DATA: TxInputData[] = [zero, one, two, three, four, five]; +export const TX_INPUT_DATA: TxInputData[] = [zero, one, two, three, four, five] diff --git a/zcashtools/neon/build/native.d.ts b/zcashtools/neon/build/native.d.ts index 43413e55..fe97262d 100644 --- a/zcashtools/neon/build/native.d.ts +++ b/zcashtools/neon/build/native.d.ts @@ -1,6 +1,6 @@ /// export interface TinData { - path: Uint32Array[]; + path: Uint32Array; address: string; value: number; } diff --git a/zcashtools/neon/lib/native.ts b/zcashtools/neon/lib/native.ts index a60d815f..b89ec4b4 100644 --- a/zcashtools/neon/lib/native.ts +++ b/zcashtools/neon/lib/native.ts @@ -1,5 +1,5 @@ export interface TinData { - path: Uint32Array[]; + path: Uint32Array; address: string, value: number, } diff --git a/zcashtools/neon/yarn.lock b/zcashtools/neon/yarn.lock index ed221efa..39711289 100644 --- a/zcashtools/neon/yarn.lock +++ b/zcashtools/neon/yarn.lock @@ -2,6 +2,13 @@ # yarn lockfile v1 +"@types/node@^20.8.7": + version "20.8.7" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.8.7.tgz#ad23827850843de973096edfc5abc9e922492a25" + integrity sha512-21TKHHh3eUHIi2MloeptJWALuCu5H7HQTdTrWIFReA8ad+aggoX+lRes3ex7/FtpC+sVUpFMQ+QTfYr74mruiQ== + dependencies: + undici-types "~5.25.1" + ansi-escapes@^4.2.1: version "4.3.1" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.1.tgz#a5c47cc43181f1f38ffd7076837700d395522a61" @@ -515,6 +522,11 @@ type-fest@^0.11.0: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.11.0.tgz#97abf0872310fed88a5c466b25681576145e33f1" integrity sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ== +typescript@^5.2.2: + version "5.2.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.2.2.tgz#5ebb5e5a5b75f085f22bc3f8460fba308310fa78" + integrity sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w== + typical@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/typical/-/typical-4.0.0.tgz#cbeaff3b9d7ae1e2bbfaf5a4e6f11eccfde94fc4" @@ -530,6 +542,11 @@ uglify-js@^3.1.4: resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.13.5.tgz#5d71d6dbba64cf441f32929b1efce7365bb4f113" integrity sha512-xtB8yEqIkn7zmOyS2zUNBsYCBRhDkvlNxMMY2smuJ/qA8NCHeQvKCF3i9Z4k8FJH4+PJvZRtMrPynfZ75+CSZw== +undici-types@~5.25.1: + version "5.25.3" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.25.3.tgz#e044115914c85f0bcbb229f346ab739f064998c3" + integrity sha512-Ga1jfYwRn7+cP9v8auvEXN1rX3sWqlayd4HP7OKk4mZWylEmu3KzXDUGrQUN6Ol7qo1gPvB2e5gX6udnyEPgdA== + validate-npm-package-license@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" From 0ecdd34f19c653ddc9ab53a682c9fec5d4d0fb93 Mon Sep 17 00:00:00 2001 From: becominginsane Date: Fri, 27 Oct 2023 00:58:50 +0800 Subject: [PATCH 04/24] feat(zcashtools): bundle zcash params --- tests_zemu/tests/common.ts | 3 -- tests_zemu/tests/zcashtool.test.ts | 36 +++++++++--------- zcashtools/neon/build/index.d.ts | 2 + zcashtools/neon/build/index.js | 5 ++- zcashtools/neon/lib/index.ts | 5 +++ zcashtools/neon/package.json | 1 + .../{ => neon}/params/sapling-output.params | Bin .../{ => neon}/params/sapling-spend.params | Bin 8 files changed, 30 insertions(+), 22 deletions(-) rename zcashtools/{ => neon}/params/sapling-output.params (100%) rename zcashtools/{ => neon}/params/sapling-spend.params (100%) diff --git a/tests_zemu/tests/common.ts b/tests_zemu/tests/common.ts index 39208957..e7dad6af 100644 --- a/tests_zemu/tests/common.ts +++ b/tests_zemu/tests/common.ts @@ -16,9 +16,6 @@ export const models: IDeviceModel[] = [ { name: 'stax', prefix: 'ST', path: APP_PATH_ST }, ] -export const SPEND_PATH = Resolve('../zcashtools/params/sapling-spend.params') -export const OUTPUT_PATH = Resolve('../zcashtools/params/sapling-output.params') - export const TX_TESTS = { parser_unshielded_tests: [ { diff --git a/tests_zemu/tests/zcashtool.test.ts b/tests_zemu/tests/zcashtool.test.ts index 2f9bb8fc..25c2ef7b 100644 --- a/tests_zemu/tests/zcashtool.test.ts +++ b/tests_zemu/tests/zcashtool.test.ts @@ -16,11 +16,10 @@ import Zemu, { ButtonKind, DEFAULT_START_OPTIONS } from '@zondax/zemu' import ZCashApp from '@zondax/ledger-zcash' -import { APP_SEED, models, OUTPUT_PATH, SPEND_PATH } from './common' -import { ZcashBuilderBridge } from '@zondax/zcashtools' +import { APP_SEED, models } from './common' +import addon, { ZcashBuilderBridge, SPEND_PATH, OUTPUT_PATH } from '@zondax/zcashtools' import { TX_INPUT_DATA } from './vectors' -const addon = require('@zondax/zcashtools') const crypto = require('crypto') const tx_version = 0x05 @@ -258,8 +257,11 @@ describe('End to end transactions', function () { All this info is gathered from the UI and put in the correct jsons. */ - const tx_input_data = TX_INPUT_DATA[0]; - const { s_spend: [s_spend1, s_spend2], s_output: [s_out1, s_out2] } = tx_input_data; + const tx_input_data = TX_INPUT_DATA[0] + const { + s_spend: [s_spend1, s_spend2], + s_output: [s_out1, s_out2], + } = tx_input_data /* The inputs to the get_inittx_data function are the inputs to the transaction. @@ -525,7 +527,7 @@ describe('End to end transactions', function () { All this info is gathered from the UI and put in the correct jsons. */ - const tx_input_data = TX_INPUT_DATA[1]; + const tx_input_data = TX_INPUT_DATA[1] const { t_in: [tin1], s_spend: [s_spend1], @@ -790,7 +792,7 @@ describe('End to end transactions', function () { All this info is gathered from the UI and put in the correct jsons. */ - const tx_input_data = TX_INPUT_DATA[2]; + const tx_input_data = TX_INPUT_DATA[2] const { t_in: [], @@ -1044,14 +1046,13 @@ describe('End to end transactions', function () { All this info is gathered from the UI and put in the correct jsons. */ - const tx_input_data = TX_INPUT_DATA[3] const { t_in: [tin1], t_out: [tout1], s_spend: [s_spend1], s_output: [s_out1, s_out2], - } = tx_input_data; + } = tx_input_data /* The inputs to the get_inittx_data function are the inputs to the transaction. @@ -1314,7 +1315,7 @@ describe('End to end transactions', function () { In this test, Alice wants to send 10000 ZEC to Bob transparent and send the change back to herself. */ - const tx_input_data = TX_INPUT_DATA[4]; + const tx_input_data = TX_INPUT_DATA[4] const { t_in: [tin1, tin2], t_out: [tout1, tout2], @@ -1570,7 +1571,7 @@ describe('Failing transactions', function () { All this info is gathered from the UI and put in the correct jsons. */ - const tx_input_data = TX_INPUT_DATA[3]; + const tx_input_data = TX_INPUT_DATA[3] const { t_in: [tin1], t_out: [tout1], @@ -1817,7 +1818,7 @@ describe('Failing transactions', function () { All this info is gathered from the UI and put in the correct jsons. */ - const tx_input_data = TX_INPUT_DATA[3]; + const tx_input_data = TX_INPUT_DATA[3] const { t_in: [tin1], t_out: [tout1], @@ -1825,7 +1826,6 @@ describe('Failing transactions', function () { s_output: [s_out1, s_out2], } = tx_input_data - /* The inputs to the get_inittx_data function are the inputs to the transaction. The output is a blob that can be send to the ledger device. @@ -2071,7 +2071,7 @@ describe('Failing transactions', function () { // ovk: null, // } - const tx_input_data = TX_INPUT_DATA[3]; + const tx_input_data = TX_INPUT_DATA[3] const { t_in: [tin1], t_out: [tout1], @@ -2282,14 +2282,14 @@ describe('Failing transactions', function () { */ //use stringify+parse for deep copy - const tx_input_data = JSON.parse(JSON.stringify(TX_INPUT_DATA[3])); + const tx_input_data = JSON.parse(JSON.stringify(TX_INPUT_DATA[3])) tx_input_data.s_output[1].value -= 9000 //extra fee over base 1000 const { t_in: [tin1], t_out: [tout1], s_spend: [s_spend1], s_output: [s_out1, s_out2], - } = tx_input_data; + } = tx_input_data /* The inputs to the get_inittx_data function are the inputs to the transaction. @@ -2334,7 +2334,7 @@ describe('Failing transactions', function () { All this info is gathered from the UI and put in the correct jsons. */ - const tx_input_data = TX_INPUT_DATA[5]; + const tx_input_data = TX_INPUT_DATA[5] const { t_in: [], t_out: [], @@ -2396,7 +2396,7 @@ describe('Failing transactions', function () { // here 1000 represents the fee const builder = new ZcashBuilderBridge(1000) - const tx_input_data = TX_INPUT_DATA[5]; + const tx_input_data = TX_INPUT_DATA[5] const { t_in: [], t_out: [], diff --git a/zcashtools/neon/build/index.d.ts b/zcashtools/neon/build/index.d.ts index b174e035..2bd1fbc7 100644 --- a/zcashtools/neon/build/index.d.ts +++ b/zcashtools/neon/build/index.d.ts @@ -2,6 +2,8 @@ import { OutputInfo, SpendInfo, TransactionSignatures, TransparentInputInfo, TransparentOutputInfo } from './native'; export type { InitData } from './native'; export declare const get_inittx_data: (_: import("./native").InitData) => Buffer; +export declare var SPEND_PATH: string; +export declare var OUTPUT_PATH: string; export declare class ZcashBuilderBridge { private boxed; constructor(fee: number); diff --git a/zcashtools/neon/build/index.js b/zcashtools/neon/build/index.js index 07a8c37c..8c41154e 100644 --- a/zcashtools/neon/build/index.js +++ b/zcashtools/neon/build/index.js @@ -3,9 +3,12 @@ var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); -exports.ZcashBuilderBridge = exports.get_inittx_data = void 0; +exports.ZcashBuilderBridge = exports.OUTPUT_PATH = exports.SPEND_PATH = exports.get_inittx_data = void 0; +const path_1 = require("path"); const native_1 = __importDefault(require("./native")); exports.get_inittx_data = native_1.default.get_inittx_data; +exports.SPEND_PATH = (0, path_1.resolve)("../params/sapling-spend.params"); +exports.OUTPUT_PATH = (0, path_1.resolve)("../params/sapling-output.params"); class ZcashBuilderBridge { constructor(fee) { this.boxed = native_1.default.builderNew(fee); diff --git a/zcashtools/neon/lib/index.ts b/zcashtools/neon/lib/index.ts index e834d121..c2b08bb7 100644 --- a/zcashtools/neon/lib/index.ts +++ b/zcashtools/neon/lib/index.ts @@ -1,8 +1,13 @@ +import { resolve } from 'path' + import addon, { OutputInfo, SpendInfo, TransactionSignatures, TransparentInputInfo, TransparentOutputInfo, ZcashBuilder } from './native'; export type { InitData } from './native' export const get_inittx_data = addon.get_inittx_data; +export var SPEND_PATH = resolve("../params/sapling-spend.params"); +export var OUTPUT_PATH = resolve("../params/sapling-output.params"); + export class ZcashBuilderBridge { private boxed: ZcashBuilder; diff --git a/zcashtools/neon/package.json b/zcashtools/neon/package.json index f17fa6eb..9f4729ed 100644 --- a/zcashtools/neon/package.json +++ b/zcashtools/neon/package.json @@ -6,6 +6,7 @@ "main": "build/index.js", "author": "Zondax AG ", "license": "Apache-2.0", + "files": ["params/*"], "dependencies": { "neon-cli": "^0.10.1" }, diff --git a/zcashtools/params/sapling-output.params b/zcashtools/neon/params/sapling-output.params similarity index 100% rename from zcashtools/params/sapling-output.params rename to zcashtools/neon/params/sapling-output.params diff --git a/zcashtools/params/sapling-spend.params b/zcashtools/neon/params/sapling-spend.params similarity index 100% rename from zcashtools/params/sapling-spend.params rename to zcashtools/neon/params/sapling-spend.params From 1782c0088b067ae7275c22658e326378f0481d9c Mon Sep 17 00:00:00 2001 From: becominginsane Date: Fri, 27 Oct 2023 03:14:31 +0800 Subject: [PATCH 05/24] style: clang-format --- app/rust/include/rslib.h | 75 +- app/src/addr.c | 130 +- app/src/addr.h | 35 +- app/src/apdu_handler.c | 1499 ++++++++++---------- app/src/c_api/rust.c | 244 ++-- app/src/chacha.c | 182 +-- app/src/chacha.h | 10 +- app/src/coin.h | 156 +-- app/src/common/actions.c | 28 +- app/src/common/actions.h | 78 +- app/src/common/main.c | 61 +- app/src/common/tx.c | 133 +- app/src/common/tx.h | 37 +- app/src/constants.h | 201 ++- app/src/crypto.c | 2627 ++++++++++++++++++----------------- app/src/crypto.h | 124 +- app/src/index_NU5.h | 57 +- app/src/index_sapling.c | 48 +- app/src/index_sapling.h | 151 +- app/src/jubjub.c | 574 ++++---- app/src/jubjub.h | 83 +- app/src/key.c | 151 +- app/src/key.h | 35 +- app/src/nvdata.c | 532 ++++--- app/src/nvdata.h | 136 +- app/src/parser.c | 719 +++++----- app/src/parser.h | 63 +- app/src/parser_common.h | 121 +- app/src/parser_impl.c | 148 +- app/src/parser_impl.h | 167 ++- app/src/parser_txdef.h | 34 +- app/src/sighash.c | 318 +++-- app/src/sighash.h | 47 +- app/src/txid.c | 708 +++++----- app/src/txid.h | 32 +- app/src/zcash_apdu_errors.h | 58 +- 36 files changed, 5045 insertions(+), 4757 deletions(-) diff --git a/app/rust/include/rslib.h b/app/rust/include/rslib.h index d4f36879..05254517 100644 --- a/app/rust/include/rslib.h +++ b/app/rust/include/rslib.h @@ -8,26 +8,39 @@ /****************************** others * ********************************************************************************/ -//ZIP32 functions -void get_pkd(const uint8_t *seed_ptr, const uint32_t pos, const uint8_t *diversifier_ptr, uint8_t *pkd); +// ZIP32 functions +void get_pkd(const uint8_t *seed_ptr, const uint32_t pos, + const uint8_t *diversifier_ptr, uint8_t *pkd); -void get_pkd_from_seed(const uint8_t *seed_ptr, const uint32_t pos, const uint8_t *start_index, uint8_t *diversifier_ptr, uint8_t *pkd); +void get_pkd_from_seed(const uint8_t *seed_ptr, const uint32_t pos, + const uint8_t *start_index, uint8_t *diversifier_ptr, + uint8_t *pkd); void get_diversifier_list(const uint8_t *sk_ptr, uint8_t *diversifier_list); -void get_diversifier_fromlist(const uint8_t *diversifier_list, uint8_t *diversifier); +void get_diversifier_fromlist(const uint8_t *diversifier_list, + uint8_t *diversifier); bool is_valid_diversifier(const uint8_t *diversifier); -void get_diversifier_list_withstartindex(const uint8_t *seed_ptr, const uint32_t pos, const uint8_t *startindex, uint8_t *diversifier_list); +void get_diversifier_list_withstartindex(const uint8_t *seed_ptr, + const uint32_t pos, + const uint8_t *startindex, + uint8_t *diversifier_list); -void get_default_diversifier_list_withstartindex(const uint8_t *seed_ptr, const uint32_t pos, uint8_t *startindex, uint8_t *diversifier_list); +void get_default_diversifier_list_withstartindex(const uint8_t *seed_ptr, + const uint32_t pos, + uint8_t *startindex, + uint8_t *diversifier_list); -void get_default_diversifier_without_start_index(const uint8_t *see_ptr, const uint32_t pos, uint8_t *default_diversifier); +void get_default_diversifier_without_start_index(const uint8_t *see_ptr, + const uint32_t pos, + uint8_t *default_diversifier); void zip32_master(const uint8_t *seed_ptr, uint8_t *sk_ptr, uint8_t *dk_ptr); -void zip32_child_ask_nsk(const uint8_t *seed_ptr, uint8_t *ask, uint8_t *nsk, const uint32_t pos); +void zip32_child_ask_nsk(const uint8_t *seed_ptr, uint8_t *ask, uint8_t *nsk, + const uint32_t pos); void zip32_nsk_from_seed(const uint8_t *seed_ptr, uint8_t *nsk); @@ -37,42 +50,56 @@ void zip32_ovk(const uint8_t *seed_ptr, uint8_t *ovk, const uint32_t pos); void zip32_fvk(const uint8_t *seed_ptr, uint8_t *fvk, const uint32_t pos); -void zip32_child_proof_key(const uint8_t *seed_ptr, uint8_t *ak_ptr, uint8_t *nsk_ptr, const uint32_t pos); +void zip32_child_proof_key(const uint8_t *seed_ptr, uint8_t *ak_ptr, + uint8_t *nsk_ptr, const uint32_t pos); -//Rseed -void rseed_get_esk_epk(const uint8_t *seed_ptr, uint8_t *d_ptr, uint8_t *output_esk_ptr, uint8_t *output_epk_ptr); +// Rseed +void rseed_get_esk_epk(const uint8_t *seed_ptr, uint8_t *d_ptr, + uint8_t *output_esk_ptr, uint8_t *output_epk_ptr); void rseed_get_rcm(const uint8_t *input, uint8_t *output_ptr); -//Commitments -void compute_note_commitment(uint8_t *inputptr, const uint8_t *rcmptr,const uint64_t value,const uint8_t *diversifier_ptr, const uint8_t *pkd); +// Commitments +void compute_note_commitment(uint8_t *inputptr, const uint8_t *rcmptr, + const uint64_t value, + const uint8_t *diversifier_ptr, + const uint8_t *pkd); -void compute_note_commitment_fullpoint(uint8_t *inputptr, const uint8_t *rcmptr,const uint64_t value, const uint8_t *diversifier_ptr, const uint8_t *pkd); +void compute_note_commitment_fullpoint(uint8_t *inputptr, const uint8_t *rcmptr, + const uint64_t value, + const uint8_t *diversifier_ptr, + const uint8_t *pkd); -void compute_value_commitment(const uint64_t value, const uint8_t *rcmptr, uint8_t *output); +void compute_value_commitment(const uint64_t value, const uint8_t *rcmptr, + uint8_t *output); -void compute_nullifier(uint8_t *ncmptr, uint64_t pos, const uint8_t *nsk_ptr, uint8_t *outputptr); +void compute_nullifier(uint8_t *ncmptr, uint64_t pos, const uint8_t *nsk_ptr, + uint8_t *outputptr); -//Note encryption +// Note encryption void blake2b_prf(uint8_t *inputptr, uint8_t *outptr); -void ka_to_key(uint8_t *esk_ptr, uint8_t *pkd_ptr, uint8_t *epk_ptr, uint8_t *output_ptr); +void ka_to_key(uint8_t *esk_ptr, uint8_t *pkd_ptr, uint8_t *epk_ptr, + uint8_t *output_ptr); -void prepare_enccompact_input(uint8_t *d, uint64_t value, uint8_t *rcm, uint8_t memotype, uint8_t *output); +void prepare_enccompact_input(uint8_t *d, uint64_t value, uint8_t *rcm, + uint8_t memotype, uint8_t *output); -//RedJubjub +// RedJubjub void random_fr(uint8_t *alpha_ptr); -void randomized_secret_from_seed(uint8_t *seed_ptr, uint32_t pos, uint8_t *alpha_ptr, uint8_t *output_ptr); +void randomized_secret_from_seed(uint8_t *seed_ptr, uint32_t pos, + uint8_t *alpha_ptr, uint8_t *output_ptr); void get_rk(uint8_t *ask_ptr, uint8_t *alpha_ptr, uint8_t *output_ptr); -void rsk_to_rk(const uint8_t* rsk_ptr, uint8_t* rk_ptr); +void rsk_to_rk(const uint8_t *rsk_ptr, uint8_t *rk_ptr); void randomize_pk(uint8_t *alpha_ptr, uint8_t *pk_ptr); void sign_redjubjub(uint8_t *key_ptr, uint8_t *msg_ptr, uint8_t *out_ptr); -//Session key -void sessionkey_agree(uint8_t *scalar_ptr, uint8_t *point_ptr, uint8_t *output_ptr); +// Session key +void sessionkey_agree(uint8_t *scalar_ptr, uint8_t *point_ptr, + uint8_t *output_ptr); void pubkey_gen(uint8_t *scalar_ptr, uint8_t *output_ptr); diff --git a/app/src/addr.c b/app/src/addr.c index 02984cea..552061c0 100644 --- a/app/src/addr.c +++ b/app/src/addr.c @@ -1,79 +1,81 @@ /******************************************************************************* -* (c) 2018 - 2022 Zondax AG -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -********************************************************************************/ + * (c) 2018 - 2022 Zondax AG + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ********************************************************************************/ -#include +#include "actions.h" +#include "app_mode.h" #include "coin.h" +#include "crypto.h" #include "zxerror.h" -#include "zxmacros.h" #include "zxformat.h" -#include "app_mode.h" -#include "crypto.h" -#include "actions.h" +#include "zxmacros.h" +#include zxerr_t addr_getNumItems(uint8_t *num_items) { - zemu_log_stack("addr_getNumItems"); - *num_items = 1; - if (app_mode_expert()) { - *num_items = 2; - } - return zxerr_ok; + zemu_log_stack("addr_getNumItems"); + *num_items = 1; + if (app_mode_expert()) { + *num_items = 2; + } + return zxerr_ok; } -zxerr_t addr_getItem(int8_t displayIdx, - char *outKey, uint16_t outKeyLen, - char *outVal, uint16_t outValLen, - uint8_t pageIdx, uint8_t *pageCount) { - ZEMU_LOGF(200, "[addr_getItem] %d/%d\n", displayIdx, pageIdx) +zxerr_t addr_getItem(int8_t displayIdx, char *outKey, uint16_t outKeyLen, + char *outVal, uint16_t outValLen, uint8_t pageIdx, + uint8_t *pageCount) { + ZEMU_LOGF(200, "[addr_getItem] %d/%d\n", displayIdx, pageIdx) - switch (displayIdx) { - case 0: - switch (action_addrResponse.kind) { - case addr_secp256k1: - snprintf(outKey, outKeyLen, "Unshielded"); - pageString(outVal, outValLen, (char *) (G_io_apdu_buffer + VIEW_ADDRESS_OFFSET_SECP256K1), pageIdx, - pageCount); - return zxerr_ok; + switch (displayIdx) { + case 0: + switch (action_addrResponse.kind) { + case addr_secp256k1: + snprintf(outKey, outKeyLen, "Unshielded"); + pageString(outVal, outValLen, + (char *)(G_io_apdu_buffer + VIEW_ADDRESS_OFFSET_SECP256K1), + pageIdx, pageCount); + return zxerr_ok; - case addr_sapling: - snprintf(outKey, outKeyLen, "Shielded"); - pageString(outVal, outValLen, (char *) (G_io_apdu_buffer + VIEW_ADDRESS_OFFSET_SAPLING), pageIdx, - pageCount); - return zxerr_ok; + case addr_sapling: + snprintf(outKey, outKeyLen, "Shielded"); + pageString(outVal, outValLen, + (char *)(G_io_apdu_buffer + VIEW_ADDRESS_OFFSET_SAPLING), + pageIdx, pageCount); + return zxerr_ok; - case addr_sapling_div: - snprintf(outKey, outKeyLen, "Shielded with div"); - pageString(outVal, outValLen, (char *) (G_io_apdu_buffer + VIEW_ADDRESS_OFFSET_SAPLING), pageIdx, - pageCount); - return zxerr_ok; + case addr_sapling_div: + snprintf(outKey, outKeyLen, "Shielded with div"); + pageString(outVal, outValLen, + (char *)(G_io_apdu_buffer + VIEW_ADDRESS_OFFSET_SAPLING), + pageIdx, pageCount); + return zxerr_ok; - default: - return zxerr_no_data; - } - case 1: { - if (!app_mode_expert()) { - return zxerr_no_data; - } - - snprintf(outKey, outKeyLen, "Your Path"); - char buffer[300]; - bip32_to_str(buffer, sizeof(buffer), hdPath, HDPATH_LEN_DEFAULT); - pageString(outVal, outValLen, buffer, pageIdx, pageCount); - return zxerr_ok; - } - default: - return zxerr_no_data; + default: + return zxerr_no_data; + } + case 1: { + if (!app_mode_expert()) { + return zxerr_no_data; } + + snprintf(outKey, outKeyLen, "Your Path"); + char buffer[300]; + bip32_to_str(buffer, sizeof(buffer), hdPath, HDPATH_LEN_DEFAULT); + pageString(outVal, outValLen, buffer, pageIdx, pageCount); + return zxerr_ok; + } + default: + return zxerr_no_data; + } } diff --git a/app/src/addr.h b/app/src/addr.h index c7db769e..aaa80629 100644 --- a/app/src/addr.h +++ b/app/src/addr.h @@ -1,18 +1,18 @@ /******************************************************************************* -* (c) 2018 = 2022 Zondax AG -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -********************************************************************************/ + * (c) 2018 = 2022 Zondax AG + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ********************************************************************************/ #pragma once @@ -24,10 +24,9 @@ extern "C" { zxerr_t addr_getNumItems(uint8_t *num_items); /// Gets an specific item from the address view (including paging) -zxerr_t addr_getItem(int8_t displayIdx, - char *outKey, uint16_t outKeyLen, - char *outValue, uint16_t outValueLen, - uint8_t pageIdx, uint8_t *pageCount); +zxerr_t addr_getItem(int8_t displayIdx, char *outKey, uint16_t outKeyLen, + char *outValue, uint16_t outValueLen, uint8_t pageIdx, + uint8_t *pageCount); #ifdef __cplusplus } diff --git a/app/src/apdu_handler.c b/app/src/apdu_handler.c index 2d5f703a..0221a046 100644 --- a/app/src/apdu_handler.c +++ b/app/src/apdu_handler.c @@ -1,347 +1,357 @@ /******************************************************************************* -* (c) 2018 -2022 Zondax AG -* (c) 2016 Ledger -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -********************************************************************************/ + * (c) 2018 -2022 Zondax AG + * (c) 2016 Ledger + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ********************************************************************************/ #include "app_main.h" -#include -#include #include +#include +#include #include -#include "view.h" #include "actions.h" -#include "tx.h" #include "addr.h" -#include "crypto.h" -#include "coin.h" -#include "zxmacros.h" #include "app_mode.h" +#include "coin.h" +#include "crypto.h" +#include "tx.h" +#include "view.h" #include "zcash_apdu_errors.h" +#include "zxmacros.h" #include "key.h" -#include "parser.h" #include "nvdata.h" +#include "parser.h" #include "view_internal.h" __Z_INLINE void handle_getversion(volatile uint32_t *tx) { #ifdef DEBUG - G_io_apdu_buffer[0] = 0xFF; + G_io_apdu_buffer[0] = 0xFF; #else - G_io_apdu_buffer[0] = 0; + G_io_apdu_buffer[0] = 0; #endif - G_io_apdu_buffer[1] = LEDGER_MAJOR_VERSION; - G_io_apdu_buffer[2] = LEDGER_MINOR_VERSION; - G_io_apdu_buffer[3] = LEDGER_PATCH_VERSION; - // SDK won't reply any APDU message if the device is locked --> Set device_locked = false - G_io_apdu_buffer[4] = 0; - - G_io_apdu_buffer[5] = (TARGET_ID >> 24) & 0xFF; - G_io_apdu_buffer[6] = (TARGET_ID >> 16) & 0xFF; - G_io_apdu_buffer[7] = (TARGET_ID >> 8) & 0xFF; - G_io_apdu_buffer[8] = (TARGET_ID >> 0) & 0xFF; - - *tx += 9; - THROW(APDU_CODE_OK); + G_io_apdu_buffer[1] = LEDGER_MAJOR_VERSION; + G_io_apdu_buffer[2] = LEDGER_MINOR_VERSION; + G_io_apdu_buffer[3] = LEDGER_PATCH_VERSION; + // SDK won't reply any APDU message if the device is locked --> Set + // device_locked = false + G_io_apdu_buffer[4] = 0; + + G_io_apdu_buffer[5] = (TARGET_ID >> 24) & 0xFF; + G_io_apdu_buffer[6] = (TARGET_ID >> 16) & 0xFF; + G_io_apdu_buffer[7] = (TARGET_ID >> 8) & 0xFF; + G_io_apdu_buffer[8] = (TARGET_ID >> 0) & 0xFF; + + *tx += 9; + THROW(APDU_CODE_OK); } __Z_INLINE void extractHDPath(uint32_t rx, uint32_t offset) { - if ((rx - offset) < sizeof(uint32_t) * HDPATH_LEN_DEFAULT) { - THROW(APDU_CODE_WRONG_LENGTH); - } + if ((rx - offset) < sizeof(uint32_t) * HDPATH_LEN_DEFAULT) { + THROW(APDU_CODE_WRONG_LENGTH); + } - MEMCPY(hdPath, G_io_apdu_buffer + offset, sizeof(uint32_t) * HDPATH_LEN_DEFAULT); + MEMCPY(hdPath, G_io_apdu_buffer + offset, + sizeof(uint32_t) * HDPATH_LEN_DEFAULT); - const bool mainnet = hdPath[0] == HDPATH_0_DEFAULT && - hdPath[1] == HDPATH_1_DEFAULT; + const bool mainnet = + hdPath[0] == HDPATH_0_DEFAULT && hdPath[1] == HDPATH_1_DEFAULT; - const bool testnet = hdPath[0] == HDPATH_0_TESTNET && - hdPath[1] == HDPATH_1_TESTNET; + const bool testnet = + hdPath[0] == HDPATH_0_TESTNET && hdPath[1] == HDPATH_1_TESTNET; - if (!mainnet && !testnet) { - THROW(APDU_CODE_DATA_INVALID); - } + if (!mainnet && !testnet) { + THROW(APDU_CODE_DATA_INVALID); + } } __Z_INLINE bool process_chunk(__Z_UNUSED volatile uint32_t *tx, uint32_t rx) { - const uint8_t payloadType = G_io_apdu_buffer[OFFSET_PAYLOAD_TYPE]; - - /* - if (G_io_apdu_buffer[OFFSET_P2] != 0 && G_io_apdu_buffer[OFFSET_P2] != 4 && G_io_apdu_buffer[OFFSET_P2] != 5 ) { - THROW(APDU_CODE_INVALIDP1P2); - } - */ - - if (rx < OFFSET_DATA) { - THROW(APDU_CODE_WRONG_LENGTH); - } - - uint32_t added; - switch (payloadType) - { - case 0: - tx_initialize(); - tx_reset(); - return false; - case 1: - added = tx_append(&(G_io_apdu_buffer[OFFSET_DATA]), rx - OFFSET_DATA); - if (added != rx - OFFSET_DATA) { - THROW(APDU_CODE_OUTPUT_BUFFER_TOO_SMALL); - } - return false; - case 2: - added = tx_append(&(G_io_apdu_buffer[OFFSET_DATA]), rx - OFFSET_DATA); - if (added != rx - OFFSET_DATA) { - THROW(APDU_CODE_OUTPUT_BUFFER_TOO_SMALL); - } - return true; - } - THROW(APDU_CODE_INVALIDP1P2); + const uint8_t payloadType = G_io_apdu_buffer[OFFSET_PAYLOAD_TYPE]; + + /* + if (G_io_apdu_buffer[OFFSET_P2] != 0 && G_io_apdu_buffer[OFFSET_P2] != 4 && + G_io_apdu_buffer[OFFSET_P2] != 5 ) { THROW(APDU_CODE_INVALIDP1P2); + } + */ + + if (rx < OFFSET_DATA) { + THROW(APDU_CODE_WRONG_LENGTH); + } + + uint32_t added; + switch (payloadType) { + case 0: + tx_initialize(); + tx_reset(); + return false; + case 1: + added = tx_append(&(G_io_apdu_buffer[OFFSET_DATA]), rx - OFFSET_DATA); + if (added != rx - OFFSET_DATA) { + THROW(APDU_CODE_OUTPUT_BUFFER_TOO_SMALL); + } + return false; + case 2: + added = tx_append(&(G_io_apdu_buffer[OFFSET_DATA]), rx - OFFSET_DATA); + if (added != rx - OFFSET_DATA) { + THROW(APDU_CODE_OUTPUT_BUFFER_TOO_SMALL); + } + return true; + } + THROW(APDU_CODE_INVALIDP1P2); } +__Z_INLINE void handleExtractSpendSignature(volatile uint32_t *tx, + uint32_t rx) { + zemu_log("----[handleExtractSpendSignature]\n"); -__Z_INLINE void handleExtractSpendSignature(volatile uint32_t *tx, uint32_t rx) { - zemu_log("----[handleExtractSpendSignature]\n"); - - *tx = 0; - if (rx != APDU_MIN_LENGTH || G_io_apdu_buffer[OFFSET_DATA_LEN] != 0) { - THROW(APDU_CODE_COMMAND_NOT_ALLOWED); - } + *tx = 0; + if (rx != APDU_MIN_LENGTH || G_io_apdu_buffer[OFFSET_DATA_LEN] != 0) { + THROW(APDU_CODE_COMMAND_NOT_ALLOWED); + } - zxerr_t err = crypto_extract_spend_signature(G_io_apdu_buffer, IO_APDU_BUFFER_SIZE - 2); + zxerr_t err = + crypto_extract_spend_signature(G_io_apdu_buffer, IO_APDU_BUFFER_SIZE - 2); - if (err == zxerr_ok) { - *tx = 64; - THROW(APDU_CODE_OK); - } else { - *tx = 0; - THROW(APDU_CODE_DATA_INVALID); - } + if (err == zxerr_ok) { + *tx = 64; + THROW(APDU_CODE_OK); + } else { + *tx = 0; + THROW(APDU_CODE_DATA_INVALID); + } } -__Z_INLINE void handleExtractTransparentSignature(volatile uint32_t *tx, uint32_t rx) { - zemu_log("----[handleExtractTransparentSignature]\n"); +__Z_INLINE void handleExtractTransparentSignature(volatile uint32_t *tx, + uint32_t rx) { + zemu_log("----[handleExtractTransparentSignature]\n"); - *tx = 0; - if (rx != APDU_MIN_LENGTH || G_io_apdu_buffer[OFFSET_DATA_LEN] != 0) { - THROW(APDU_CODE_COMMAND_NOT_ALLOWED); - } + *tx = 0; + if (rx != APDU_MIN_LENGTH || G_io_apdu_buffer[OFFSET_DATA_LEN] != 0) { + THROW(APDU_CODE_COMMAND_NOT_ALLOWED); + } - zxerr_t err = crypto_extract_transparent_signature(G_io_apdu_buffer, IO_APDU_BUFFER_SIZE - 2); + zxerr_t err = crypto_extract_transparent_signature(G_io_apdu_buffer, + IO_APDU_BUFFER_SIZE - 2); - if (err == zxerr_ok) { - *tx = 64; - THROW(APDU_CODE_OK); - } else { - view_idle_show(0, NULL); - *tx = 0; - THROW(APDU_CODE_DATA_INVALID); - } + if (err == zxerr_ok) { + *tx = 64; + THROW(APDU_CODE_OK); + } else { + view_idle_show(0, NULL); + *tx = 0; + THROW(APDU_CODE_DATA_INVALID); + } } __Z_INLINE void handleExtractSpendData(volatile uint32_t *tx, uint32_t rx) { - zemu_log("----[handleExtractSpendData]\n"); + zemu_log("----[handleExtractSpendData]\n"); - *tx = 0; - if (rx != APDU_MIN_LENGTH || G_io_apdu_buffer[OFFSET_DATA_LEN] != 0) { - THROW(APDU_CODE_COMMAND_NOT_ALLOWED); - } - - zxerr_t err = crypto_extract_spend_proofkeyandrnd(G_io_apdu_buffer, IO_APDU_BUFFER_SIZE - 2); - view_tx_state(); - if (err == zxerr_ok) { - *tx = 128; //SPEND_EXTRACT_LEN - THROW(APDU_CODE_OK); - } else { - *tx = 0; - THROW(APDU_CODE_DATA_INVALID); - } + *tx = 0; + if (rx != APDU_MIN_LENGTH || G_io_apdu_buffer[OFFSET_DATA_LEN] != 0) { + THROW(APDU_CODE_COMMAND_NOT_ALLOWED); + } + zxerr_t err = crypto_extract_spend_proofkeyandrnd(G_io_apdu_buffer, + IO_APDU_BUFFER_SIZE - 2); + view_tx_state(); + if (err == zxerr_ok) { + *tx = 128; // SPEND_EXTRACT_LEN + THROW(APDU_CODE_OK); + } else { + *tx = 0; + THROW(APDU_CODE_DATA_INVALID); + } } __Z_INLINE void handleExtractOutputData(volatile uint32_t *tx, uint32_t rx) { - zemu_log("----[handleExtractOutputData]\n"); + zemu_log("----[handleExtractOutputData]\n"); - *tx = 0; - if (rx != APDU_MIN_LENGTH || G_io_apdu_buffer[OFFSET_DATA_LEN] != 0) { - THROW(APDU_CODE_COMMAND_NOT_ALLOWED); - } + *tx = 0; + if (rx != APDU_MIN_LENGTH || G_io_apdu_buffer[OFFSET_DATA_LEN] != 0) { + THROW(APDU_CODE_COMMAND_NOT_ALLOWED); + } - uint16_t replyLen = 0; - zxerr_t err = crypto_extract_output_rnd(G_io_apdu_buffer, IO_APDU_BUFFER_SIZE - 2, &replyLen); - view_tx_state(); - if (err == zxerr_ok) { - *tx = replyLen; - THROW(APDU_CODE_OK); - } else { - *tx = 0; - THROW(APDU_CODE_DATA_INVALID); - } + uint16_t replyLen = 0; + zxerr_t err = crypto_extract_output_rnd(G_io_apdu_buffer, + IO_APDU_BUFFER_SIZE - 2, &replyLen); + view_tx_state(); + if (err == zxerr_ok) { + *tx = replyLen; + THROW(APDU_CODE_OK); + } else { + *tx = 0; + THROW(APDU_CODE_DATA_INVALID); + } } -__Z_INLINE void handleInitTX(volatile uint32_t *flags, - volatile uint32_t *tx, uint32_t rx) { - if (!process_chunk(tx, rx)) { - THROW(APDU_CODE_OK); - } +__Z_INLINE void handleInitTX(volatile uint32_t *flags, volatile uint32_t *tx, + uint32_t rx) { + if (!process_chunk(tx, rx)) { + THROW(APDU_CODE_OK); + } - zemu_log("----[handleInitTX]\n"); + zemu_log("----[handleInitTX]\n"); - *tx = 0; - const uint8_t *message = tx_get_buffer(); - const uint16_t messageLength = tx_get_buffer_length(); - - zxerr_t err = crypto_extracttx_sapling(G_io_apdu_buffer, IO_APDU_BUFFER_SIZE - 3, message, messageLength); - if (err != zxerr_ok) { - transaction_reset(); - MEMZERO(G_io_apdu_buffer, IO_APDU_BUFFER_SIZE); - G_io_apdu_buffer[0] = err; - *tx = 1; - THROW(APDU_CODE_EXTRACT_TRANSACTION_FAIL); - } + *tx = 0; + const uint8_t *message = tx_get_buffer(); + const uint16_t messageLength = tx_get_buffer_length(); - err = crypto_hash_messagebuffer(G_io_apdu_buffer, IO_APDU_BUFFER_SIZE - 3, message, messageLength); - if (err != zxerr_ok) { - transaction_reset(); - MEMZERO(G_io_apdu_buffer, IO_APDU_BUFFER_SIZE); - G_io_apdu_buffer[0] = err; - *tx = 1; - THROW(APDU_CODE_HASH_MSG_BUF_FAIL); - } + zxerr_t err = crypto_extracttx_sapling( + G_io_apdu_buffer, IO_APDU_BUFFER_SIZE - 3, message, messageLength); + if (err != zxerr_ok) { + transaction_reset(); + MEMZERO(G_io_apdu_buffer, IO_APDU_BUFFER_SIZE); + G_io_apdu_buffer[0] = err; + *tx = 1; + THROW(APDU_CODE_EXTRACT_TRANSACTION_FAIL); + } + + err = crypto_hash_messagebuffer(G_io_apdu_buffer, IO_APDU_BUFFER_SIZE - 3, + message, messageLength); + if (err != zxerr_ok) { + transaction_reset(); + MEMZERO(G_io_apdu_buffer, IO_APDU_BUFFER_SIZE); + G_io_apdu_buffer[0] = err; + *tx = 1; + THROW(APDU_CODE_HASH_MSG_BUF_FAIL); + } -//////////// + //////////// - view_review_init(tx_getItem, tx_getNumItems, app_reply_hash); + view_review_init(tx_getItem, tx_getNumItems, app_reply_hash); - view_review_show(REVIEW_TXN); - *flags |= IO_ASYNCH_REPLY; + view_review_show(REVIEW_TXN); + *flags |= IO_ASYNCH_REPLY; } // Transmitted notes are stored on the blockchain in encrypted form. // If the note was sent to Alice, she uses her incoming viewing key (IVK) // to decrypt the note (so that she can subsequently send it). -// This function also returns the default diversifier to reduce interactions between host and device -__Z_INLINE void handleGetKeyIVK(volatile uint32_t *flags, - volatile uint32_t *tx, uint32_t rx) { - zemu_log("----[handleGetKeyIVK]\n"); +// This function also returns the default diversifier to reduce interactions +// between host and device +__Z_INLINE void handleGetKeyIVK(volatile uint32_t *flags, volatile uint32_t *tx, + uint32_t rx) { + zemu_log("----[handleGetKeyIVK]\n"); + + *tx = 0; + if (rx < APDU_MIN_LENGTH || rx - APDU_MIN_LENGTH != DATA_LENGTH_GET_IVK || + G_io_apdu_buffer[OFFSET_DATA_LEN] != DATA_LENGTH_GET_IVK || + G_io_apdu_buffer[OFFSET_P1] == 0) { + zemu_log("Wrong length!\n"); + THROW(APDU_CODE_COMMAND_NOT_ALLOWED); + } + uint32_t zip32path = 0; + parser_error_t prserr = parser_sapling_path(G_io_apdu_buffer + OFFSET_DATA, + DATA_LENGTH_GET_IVK, &zip32path); + MEMZERO(G_io_apdu_buffer, IO_APDU_BUFFER_SIZE); + if (prserr != parser_ok) { *tx = 0; - if (rx < APDU_MIN_LENGTH || rx - APDU_MIN_LENGTH != DATA_LENGTH_GET_IVK - || G_io_apdu_buffer[OFFSET_DATA_LEN] != DATA_LENGTH_GET_IVK - || G_io_apdu_buffer[OFFSET_P1] == 0) { - zemu_log("Wrong length!\n"); - THROW(APDU_CODE_COMMAND_NOT_ALLOWED); - } - - uint32_t zip32path = 0; - parser_error_t prserr = parser_sapling_path(G_io_apdu_buffer + OFFSET_DATA, DATA_LENGTH_GET_IVK, - &zip32path); - MEMZERO(G_io_apdu_buffer, IO_APDU_BUFFER_SIZE); - if (prserr != parser_ok) { - *tx = 0; - THROW(APDU_CODE_DATA_INVALID); - } - key_state.kind = key_ivk; - uint16_t replyLen = 0; - - zxerr_t err = crypto_ivk_sapling(G_io_apdu_buffer, IO_APDU_BUFFER_SIZE - 2, zip32path, &replyLen); - if (err != zxerr_ok) { - *tx = 0; - THROW(APDU_CODE_DATA_INVALID); - } - key_state.len = (uint8_t) replyLen; + THROW(APDU_CODE_DATA_INVALID); + } + key_state.kind = key_ivk; + uint16_t replyLen = 0; + + zxerr_t err = crypto_ivk_sapling(G_io_apdu_buffer, IO_APDU_BUFFER_SIZE - 2, + zip32path, &replyLen); + if (err != zxerr_ok) { + *tx = 0; + THROW(APDU_CODE_DATA_INVALID); + } + key_state.len = (uint8_t)replyLen; - view_review_init(key_getItem, key_getNumItems, app_reply_key); - view_review_show(REVIEW_TXN); - *flags |= IO_ASYNCH_REPLY; + view_review_init(key_getItem, key_getNumItems, app_reply_key); + view_review_show(REVIEW_TXN); + *flags |= IO_ASYNCH_REPLY; } // If Bob sends a note to Alice (stored on the blockchain in encrypted form), // he can decrypt using his outgoing viewing key (OVK). -__Z_INLINE void handleGetKeyOVK(volatile uint32_t *flags, - volatile uint32_t *tx, uint32_t rx) { - zemu_log("----[handleGetKeyOVK]\n"); +__Z_INLINE void handleGetKeyOVK(volatile uint32_t *flags, volatile uint32_t *tx, + uint32_t rx) { + zemu_log("----[handleGetKeyOVK]\n"); + + *tx = 0; + if (rx < APDU_MIN_LENGTH || rx - APDU_MIN_LENGTH != DATA_LENGTH_GET_OVK || + G_io_apdu_buffer[OFFSET_DATA_LEN] != DATA_LENGTH_GET_OVK || + G_io_apdu_buffer[OFFSET_P1] == 0) { + zemu_log("Wrong length!\n"); + THROW(APDU_CODE_COMMAND_NOT_ALLOWED); + } + uint32_t zip32path = 0; + parser_error_t prserr = parser_sapling_path(G_io_apdu_buffer + OFFSET_DATA, + DATA_LENGTH_GET_OVK, &zip32path); + MEMZERO(G_io_apdu_buffer, IO_APDU_BUFFER_SIZE); + if (prserr != parser_ok) { *tx = 0; - if (rx < APDU_MIN_LENGTH || rx - APDU_MIN_LENGTH != DATA_LENGTH_GET_OVK - || G_io_apdu_buffer[OFFSET_DATA_LEN] != DATA_LENGTH_GET_OVK - || G_io_apdu_buffer[OFFSET_P1] == 0) { - zemu_log("Wrong length!\n"); - THROW(APDU_CODE_COMMAND_NOT_ALLOWED); - } - - uint32_t zip32path = 0; - parser_error_t prserr = parser_sapling_path(G_io_apdu_buffer + OFFSET_DATA, DATA_LENGTH_GET_OVK, - &zip32path); - MEMZERO(G_io_apdu_buffer, IO_APDU_BUFFER_SIZE); - if (prserr != parser_ok) { - *tx = 0; - THROW(APDU_CODE_DATA_INVALID); - } - key_state.kind = key_ovk; - uint16_t replyLen = 0; - - zxerr_t err = crypto_ovk_sapling(G_io_apdu_buffer, IO_APDU_BUFFER_SIZE - 2, zip32path, &replyLen); - if (err != zxerr_ok) { - *tx = 0; - THROW(APDU_CODE_DATA_INVALID); - } - key_state.len = (uint8_t) replyLen; + THROW(APDU_CODE_DATA_INVALID); + } + key_state.kind = key_ovk; + uint16_t replyLen = 0; + + zxerr_t err = crypto_ovk_sapling(G_io_apdu_buffer, IO_APDU_BUFFER_SIZE - 2, + zip32path, &replyLen); + if (err != zxerr_ok) { + *tx = 0; + THROW(APDU_CODE_DATA_INVALID); + } + key_state.len = (uint8_t)replyLen; - view_review_init(key_getItem, key_getNumItems, app_reply_key); - view_review_show(REVIEW_TXN); - *flags |= IO_ASYNCH_REPLY; + view_review_init(key_getItem, key_getNumItems, app_reply_key); + view_review_show(REVIEW_TXN); + *flags |= IO_ASYNCH_REPLY; } - // Get the sapling full viewing key (ak, nk, ovk) -__Z_INLINE void handleGetKeyFVK(volatile uint32_t *flags, - volatile uint32_t *tx, uint32_t rx) { - zemu_log("----[handleGetKeyFVK]\n"); +__Z_INLINE void handleGetKeyFVK(volatile uint32_t *flags, volatile uint32_t *tx, + uint32_t rx) { + zemu_log("----[handleGetKeyFVK]\n"); + + *tx = 0; + if (rx < APDU_MIN_LENGTH || rx - APDU_MIN_LENGTH != DATA_LENGTH_GET_FVK || + G_io_apdu_buffer[OFFSET_DATA_LEN] != DATA_LENGTH_GET_FVK || + G_io_apdu_buffer[OFFSET_P1] == 0) { + zemu_log("Wrong length!\n"); + THROW(APDU_CODE_COMMAND_NOT_ALLOWED); + } + uint32_t zip32path = 0; + parser_error_t prserr = parser_sapling_path(G_io_apdu_buffer + OFFSET_DATA, + DATA_LENGTH_GET_FVK, &zip32path); + MEMZERO(G_io_apdu_buffer, IO_APDU_BUFFER_SIZE); + if (prserr != parser_ok) { *tx = 0; - if (rx < APDU_MIN_LENGTH || rx - APDU_MIN_LENGTH != DATA_LENGTH_GET_FVK - || G_io_apdu_buffer[OFFSET_DATA_LEN] != DATA_LENGTH_GET_FVK - || G_io_apdu_buffer[OFFSET_P1] == 0) { - zemu_log("Wrong length!\n"); - THROW(APDU_CODE_COMMAND_NOT_ALLOWED); - } - - uint32_t zip32path = 0; - parser_error_t prserr = parser_sapling_path(G_io_apdu_buffer + OFFSET_DATA, DATA_LENGTH_GET_FVK, - &zip32path); - MEMZERO(G_io_apdu_buffer, IO_APDU_BUFFER_SIZE); - if (prserr != parser_ok) { - *tx = 0; - THROW(APDU_CODE_DATA_INVALID); - } - key_state.kind = key_fvk; - uint16_t replyLen = 0; - - zxerr_t err = crypto_fvk_sapling(G_io_apdu_buffer, IO_APDU_BUFFER_SIZE - 2, zip32path, &replyLen); - if (err != zxerr_ok) { - *tx = 0; - THROW(APDU_CODE_DATA_INVALID); - } - key_state.len = (uint8_t) replyLen; + THROW(APDU_CODE_DATA_INVALID); + } + key_state.kind = key_fvk; + uint16_t replyLen = 0; + + zxerr_t err = crypto_fvk_sapling(G_io_apdu_buffer, IO_APDU_BUFFER_SIZE - 2, + zip32path, &replyLen); + if (err != zxerr_ok) { + *tx = 0; + THROW(APDU_CODE_DATA_INVALID); + } + key_state.len = (uint8_t)replyLen; - view_review_init(key_getItem, key_getNumItems, app_reply_key); - view_review_show(REVIEW_TXN); - *flags |= IO_ASYNCH_REPLY; + view_review_init(key_getItem, key_getNumItems, app_reply_key); + view_review_show(REVIEW_TXN); + *flags |= IO_ASYNCH_REPLY; } // Computing the note nullifier nf is required in order to spend the note. @@ -349,557 +359,566 @@ __Z_INLINE void handleGetKeyFVK(volatile uint32_t *flags, // and the note position pos. // (nk is part of the full viewing key fvk = (ak, nk, ovk) ) __Z_INLINE void handleGetNullifier(volatile uint32_t *flags, - volatile uint32_t *tx, uint32_t rx) { - zemu_log("----[handleGetNullifier]\n"); - - *tx = 0; - if (rx < APDU_MIN_LENGTH || rx - APDU_MIN_LENGTH != DATA_LENGTH_GET_NF - || G_io_apdu_buffer[OFFSET_DATA_LEN] != DATA_LENGTH_GET_NF - || G_io_apdu_buffer[OFFSET_P1] == 0) { - zemu_log("Wrong length!\n"); - THROW(APDU_CODE_COMMAND_NOT_ALLOWED); - } - - uint32_t zip32path = 0; - parser_error_t prserr = parser_sapling_path(G_io_apdu_buffer + OFFSET_DATA, DATA_LENGTH_GET_NF, - &zip32path); - if (prserr != parser_ok) { - MEMZERO(G_io_apdu_buffer, IO_APDU_BUFFER_SIZE); - *tx = 0; - zemu_log("Failed to get seed!\n"); - THROW(APDU_CODE_DATA_INVALID); - } - - // get note position from payload - uint64_t notepos = 0; - memcpy(¬epos, G_io_apdu_buffer + OFFSET_DATA + ZIP32_PATH_SIZE, - NOTE_POSITION_SIZE); - - // get note commitment from payload - uint8_t cm[NOTE_COMMITMENT_SIZE] = {0}; - memcpy(cm, G_io_apdu_buffer + OFFSET_DATA + ZIP32_PATH_SIZE + NOTE_POSITION_SIZE, - NOTE_COMMITMENT_SIZE); + volatile uint32_t *tx, uint32_t rx) { + zemu_log("----[handleGetNullifier]\n"); + + *tx = 0; + if (rx < APDU_MIN_LENGTH || rx - APDU_MIN_LENGTH != DATA_LENGTH_GET_NF || + G_io_apdu_buffer[OFFSET_DATA_LEN] != DATA_LENGTH_GET_NF || + G_io_apdu_buffer[OFFSET_P1] == 0) { + zemu_log("Wrong length!\n"); + THROW(APDU_CODE_COMMAND_NOT_ALLOWED); + } + uint32_t zip32path = 0; + parser_error_t prserr = parser_sapling_path(G_io_apdu_buffer + OFFSET_DATA, + DATA_LENGTH_GET_NF, &zip32path); + if (prserr != parser_ok) { MEMZERO(G_io_apdu_buffer, IO_APDU_BUFFER_SIZE); + *tx = 0; + zemu_log("Failed to get seed!\n"); + THROW(APDU_CODE_DATA_INVALID); + } + + // get note position from payload + uint64_t notepos = 0; + memcpy(¬epos, G_io_apdu_buffer + OFFSET_DATA + ZIP32_PATH_SIZE, + NOTE_POSITION_SIZE); + + // get note commitment from payload + uint8_t cm[NOTE_COMMITMENT_SIZE] = {0}; + memcpy(cm, + G_io_apdu_buffer + OFFSET_DATA + ZIP32_PATH_SIZE + NOTE_POSITION_SIZE, + NOTE_COMMITMENT_SIZE); + + MEMZERO(G_io_apdu_buffer, IO_APDU_BUFFER_SIZE); + + key_state.kind = nf; + uint16_t replyLen = 0; + + // this needs to get Full viewing key = (ak, nk, ovk) and note position, to + // then compute nullifier G_io_apdu_buffer contains zip32path, note position, + // note commitment + zxerr_t err = crypto_nullifier_sapling( + G_io_apdu_buffer, IO_APDU_BUFFER_SIZE - 2, notepos, cm, &replyLen); + if (err != zxerr_ok) { + zemu_log("Failed to get nullifier!\n"); + *tx = 0; + THROW(APDU_CODE_DATA_INVALID); + } + key_state.len = (uint8_t)replyLen; - key_state.kind = nf; - uint16_t replyLen = 0; - - // this needs to get Full viewing key = (ak, nk, ovk) and note position, to then compute nullifier - // G_io_apdu_buffer contains zip32path, note position, note commitment - zxerr_t err = crypto_nullifier_sapling(G_io_apdu_buffer, IO_APDU_BUFFER_SIZE - 2, notepos, - cm, &replyLen); - if (err != zxerr_ok) { - zemu_log("Failed to get nullifier!\n"); - *tx = 0; - THROW(APDU_CODE_DATA_INVALID); - } - key_state.len = (uint8_t) replyLen; - - view_review_init(key_getItem, key_getNumItems, app_reply_key); - view_review_show(REVIEW_TXN); - *flags |= IO_ASYNCH_REPLY; + view_review_init(key_getItem, key_getNumItems, app_reply_key); + view_review_show(REVIEW_TXN); + *flags |= IO_ASYNCH_REPLY; } __Z_INLINE void handleCheckandSign(volatile uint32_t *tx, uint32_t rx) { - if (!process_chunk(tx, rx)) { - THROW(APDU_CODE_OK); - } - *tx = 0; - - zemu_log("----[handleCheckandSign]\n"); - - const uint8_t *message = tx_get_buffer(); - const uint16_t messageLength = tx_get_buffer_length(); - - const uint8_t txVersion = G_io_apdu_buffer[OFFSET_P2]; - - char buffer[20]; - snprintf(buffer, sizeof(buffer), "Tx Version is %d", txVersion); - zemu_log_stack(buffer); - - if (!((txVersion == TX_VERSION_SAPLING) || (txVersion == TX_VERSION_NU5))) - { - zemu_log("Unhandled tx version\n"); - MEMZERO(G_io_apdu_buffer, IO_APDU_BUFFER_SIZE); - view_idle_show(0, NULL); - transaction_reset(); - THROW(APDU_CODE_UNHANDLED_TX_VERSION); - } - - if (get_state() != STATE_PROCESSED_ALL_EXTRACTIONS) { - zemu_log("[handleCheckandSign] not STATE_PROCESSED_ALL_EXTRACTIONS\n"); - MEMZERO(G_io_apdu_buffer, IO_APDU_BUFFER_SIZE); - view_idle_show(0, NULL); - transaction_reset(); - THROW(APDU_CODE_UNPROCESSED_TX); - } - - set_state(STATE_CHECKING_ALL_TXDATA); - view_tx_state(); - - zxerr_t err = crypto_check_prevouts(G_io_apdu_buffer, IO_APDU_BUFFER_SIZE - 3, message, txVersion); - if (err != zxerr_ok) { - MEMZERO(G_io_apdu_buffer, IO_APDU_BUFFER_SIZE); - view_idle_show(0, NULL); - transaction_reset(); - THROW(APDU_CODE_PREVOUT_INVALID); - } - - err = crypto_check_sequence(G_io_apdu_buffer, IO_APDU_BUFFER_SIZE - 3, message, txVersion); - if (err != zxerr_ok) { - MEMZERO(G_io_apdu_buffer, IO_APDU_BUFFER_SIZE); - view_idle_show(0, NULL); - transaction_reset(); - THROW(APDU_CODE_SEQUENCE_INVALID); - } - - err = crypto_check_outputs(G_io_apdu_buffer, IO_APDU_BUFFER_SIZE - 3, message, messageLength, txVersion); - if (err != zxerr_ok) { - MEMZERO(G_io_apdu_buffer, IO_APDU_BUFFER_SIZE); - view_idle_show(0, NULL); - transaction_reset(); - THROW(APDU_CODE_OUTPUTS_INVALID); - } + if (!process_chunk(tx, rx)) { + THROW(APDU_CODE_OK); + } + *tx = 0; - err = crypto_check_joinsplits(G_io_apdu_buffer, IO_APDU_BUFFER_SIZE - 3, message, txVersion); - if (err != zxerr_ok) { - MEMZERO(G_io_apdu_buffer, IO_APDU_BUFFER_SIZE); - view_idle_show(0, NULL); - transaction_reset(); - THROW(APDU_CODE_JOINSPLIT_INVALID); - } + zemu_log("----[handleCheckandSign]\n"); - // /!\ the valuebalance is different to the total value - err = crypto_check_valuebalance(G_io_apdu_buffer, IO_APDU_BUFFER_SIZE - 3, message, txVersion); - if(err != zxerr_ok){ - MEMZERO(G_io_apdu_buffer, IO_APDU_BUFFER_SIZE); - view_idle_show(0, NULL); - transaction_reset(); - THROW(APDU_CODE_BAD_VALUEBALANCE); - } + const uint8_t *message = tx_get_buffer(); + const uint16_t messageLength = tx_get_buffer_length(); - err = crypto_checkspend_sapling(G_io_apdu_buffer, IO_APDU_BUFFER_SIZE - 3, message, messageLength, txVersion); - if (err != zxerr_ok) { - MEMZERO(G_io_apdu_buffer, IO_APDU_BUFFER_SIZE); - view_idle_show(0, NULL); - transaction_reset(); - THROW(APDU_CODE_SPEND_INVALID); - } - - err = crypto_checkoutput_sapling(G_io_apdu_buffer, IO_APDU_BUFFER_SIZE - 3, message, messageLength, txVersion); - if (err != zxerr_ok) { - zemu_log("----[crypto_checkoutput_sapling failed]\n"); - MEMZERO(G_io_apdu_buffer, IO_APDU_BUFFER_SIZE); - view_idle_show(0, NULL); - transaction_reset(); - THROW(APDU_CODE_OUTPUT_CONTENT_INVALID); - } + const uint8_t txVersion = G_io_apdu_buffer[OFFSET_P2]; - err = crypto_checkencryptions_sapling(G_io_apdu_buffer, IO_APDU_BUFFER_SIZE - 3, message); - if (err != zxerr_ok) { - MEMZERO(G_io_apdu_buffer, IO_APDU_BUFFER_SIZE); - view_idle_show(0, NULL); - transaction_reset(); - THROW(APDU_CODE_ENCRYPTION_INVALID); - } + char buffer[20]; + snprintf(buffer, sizeof(buffer), "Tx Version is %d", txVersion); + zemu_log_stack(buffer); - set_state(STATE_VERIFIED_ALL_TXDATA); - view_tx_state(); + if (!((txVersion == TX_VERSION_SAPLING) || (txVersion == TX_VERSION_NU5))) { + zemu_log("Unhandled tx version\n"); + MEMZERO(G_io_apdu_buffer, IO_APDU_BUFFER_SIZE); + view_idle_show(0, NULL); + transaction_reset(); + THROW(APDU_CODE_UNHANDLED_TX_VERSION); + } - err = crypto_sign_and_check_transparent(G_io_apdu_buffer, IO_APDU_BUFFER_SIZE - 3, message, messageLength, txVersion); - if (err != zxerr_ok) { - MEMZERO(G_io_apdu_buffer, IO_APDU_BUFFER_SIZE); - view_idle_show(0, NULL); - transaction_reset(); - THROW(APDU_CODE_CHECK_SIGN_TR_FAIL); - } + if (get_state() != STATE_PROCESSED_ALL_EXTRACTIONS) { + zemu_log("[handleCheckandSign] not STATE_PROCESSED_ALL_EXTRACTIONS\n"); + MEMZERO(G_io_apdu_buffer, IO_APDU_BUFFER_SIZE); + view_idle_show(0, NULL); + transaction_reset(); + THROW(APDU_CODE_UNPROCESSED_TX); + } - err = crypto_signspends_sapling(G_io_apdu_buffer, IO_APDU_BUFFER_SIZE - 3, message, messageLength, txVersion); - if (err != zxerr_ok) { - MEMZERO(G_io_apdu_buffer, IO_APDU_BUFFER_SIZE); - view_idle_show(0, NULL); - transaction_reset(); - THROW(APDU_SIGN_SPEND_FAIL); - } + set_state(STATE_CHECKING_ALL_TXDATA); + view_tx_state(); - err = crypto_hash_messagebuffer(G_io_apdu_buffer, IO_APDU_BUFFER_SIZE - 3, message, messageLength); - if (err != zxerr_ok) { - MEMZERO(G_io_apdu_buffer, IO_APDU_BUFFER_SIZE); - view_idle_show(0, NULL); - transaction_reset(); - THROW(APDU_CODE_HASH_MSG_BUF_FAIL); - } + zxerr_t err = crypto_check_prevouts(G_io_apdu_buffer, IO_APDU_BUFFER_SIZE - 3, + message, txVersion); + if (err != zxerr_ok) { + MEMZERO(G_io_apdu_buffer, IO_APDU_BUFFER_SIZE); + view_idle_show(0, NULL); + transaction_reset(); + THROW(APDU_CODE_PREVOUT_INVALID); + } + + err = crypto_check_sequence(G_io_apdu_buffer, IO_APDU_BUFFER_SIZE - 3, + message, txVersion); + if (err != zxerr_ok) { + MEMZERO(G_io_apdu_buffer, IO_APDU_BUFFER_SIZE); + view_idle_show(0, NULL); + transaction_reset(); + THROW(APDU_CODE_SEQUENCE_INVALID); + } + + err = crypto_check_outputs(G_io_apdu_buffer, IO_APDU_BUFFER_SIZE - 3, message, + messageLength, txVersion); + if (err != zxerr_ok) { + MEMZERO(G_io_apdu_buffer, IO_APDU_BUFFER_SIZE); + view_idle_show(0, NULL); + transaction_reset(); + THROW(APDU_CODE_OUTPUTS_INVALID); + } + + err = crypto_check_joinsplits(G_io_apdu_buffer, IO_APDU_BUFFER_SIZE - 3, + message, txVersion); + if (err != zxerr_ok) { + MEMZERO(G_io_apdu_buffer, IO_APDU_BUFFER_SIZE); + view_idle_show(0, NULL); + transaction_reset(); + THROW(APDU_CODE_JOINSPLIT_INVALID); + } + + // /!\ the valuebalance is different to the total value + err = crypto_check_valuebalance(G_io_apdu_buffer, IO_APDU_BUFFER_SIZE - 3, + message, txVersion); + if (err != zxerr_ok) { + MEMZERO(G_io_apdu_buffer, IO_APDU_BUFFER_SIZE); + view_idle_show(0, NULL); + transaction_reset(); + THROW(APDU_CODE_BAD_VALUEBALANCE); + } + + err = crypto_checkspend_sapling(G_io_apdu_buffer, IO_APDU_BUFFER_SIZE - 3, + message, messageLength, txVersion); + if (err != zxerr_ok) { + MEMZERO(G_io_apdu_buffer, IO_APDU_BUFFER_SIZE); + view_idle_show(0, NULL); + transaction_reset(); + THROW(APDU_CODE_SPEND_INVALID); + } + + err = crypto_checkoutput_sapling(G_io_apdu_buffer, IO_APDU_BUFFER_SIZE - 3, + message, messageLength, txVersion); + if (err != zxerr_ok) { + zemu_log("----[crypto_checkoutput_sapling failed]\n"); + MEMZERO(G_io_apdu_buffer, IO_APDU_BUFFER_SIZE); + view_idle_show(0, NULL); + transaction_reset(); + THROW(APDU_CODE_OUTPUT_CONTENT_INVALID); + } + + err = crypto_checkencryptions_sapling(G_io_apdu_buffer, + IO_APDU_BUFFER_SIZE - 3, message); + if (err != zxerr_ok) { + MEMZERO(G_io_apdu_buffer, IO_APDU_BUFFER_SIZE); + view_idle_show(0, NULL); + transaction_reset(); + THROW(APDU_CODE_ENCRYPTION_INVALID); + } + + set_state(STATE_VERIFIED_ALL_TXDATA); + view_tx_state(); + + err = crypto_sign_and_check_transparent(G_io_apdu_buffer, + IO_APDU_BUFFER_SIZE - 3, message, + messageLength, txVersion); + if (err != zxerr_ok) { + MEMZERO(G_io_apdu_buffer, IO_APDU_BUFFER_SIZE); + view_idle_show(0, NULL); + transaction_reset(); + THROW(APDU_CODE_CHECK_SIGN_TR_FAIL); + } + + err = crypto_signspends_sapling(G_io_apdu_buffer, IO_APDU_BUFFER_SIZE - 3, + message, messageLength, txVersion); + if (err != zxerr_ok) { + MEMZERO(G_io_apdu_buffer, IO_APDU_BUFFER_SIZE); + view_idle_show(0, NULL); + transaction_reset(); + THROW(APDU_SIGN_SPEND_FAIL); + } + + err = crypto_hash_messagebuffer(G_io_apdu_buffer, IO_APDU_BUFFER_SIZE - 3, + message, messageLength); + if (err != zxerr_ok) { + MEMZERO(G_io_apdu_buffer, IO_APDU_BUFFER_SIZE); + view_idle_show(0, NULL); + transaction_reset(); + THROW(APDU_CODE_HASH_MSG_BUF_FAIL); + } - set_state(STATE_SIGNED_TX); - view_tx_state(); + set_state(STATE_SIGNED_TX); + view_tx_state(); - *tx = 32; - THROW(APDU_CODE_OK); + *tx = 32; + THROW(APDU_CODE_OK); } __Z_INLINE void handleGetAddrSecp256K1(volatile uint32_t *flags, volatile uint32_t *tx, uint32_t rx) { - zemu_log("----[handleGetAddrSecp256K1]\n"); + zemu_log("----[handleGetAddrSecp256K1]\n"); - extractHDPath(rx, OFFSET_DATA); - *tx = 0; - uint8_t requireConfirmation = G_io_apdu_buffer[OFFSET_P1]; - uint16_t replyLen = 0; + extractHDPath(rx, OFFSET_DATA); + *tx = 0; + uint8_t requireConfirmation = G_io_apdu_buffer[OFFSET_P1]; + uint16_t replyLen = 0; - zxerr_t err = crypto_fillAddress_secp256k1(G_io_apdu_buffer, IO_APDU_BUFFER_SIZE - 2, &replyLen); - if (err != zxerr_ok) { - *tx = 0; - THROW(APDU_CODE_DATA_INVALID); - } + zxerr_t err = crypto_fillAddress_secp256k1( + G_io_apdu_buffer, IO_APDU_BUFFER_SIZE - 2, &replyLen); + if (err != zxerr_ok) { + *tx = 0; + THROW(APDU_CODE_DATA_INVALID); + } - action_addrResponse.kind = addr_secp256k1; - action_addrResponse.len = replyLen; + action_addrResponse.kind = addr_secp256k1; + action_addrResponse.len = replyLen; - if (requireConfirmation) { - view_review_init(addr_getItem, addr_getNumItems, app_reply_address); - view_review_show(REVIEW_ADDRESS); - *flags |= IO_ASYNCH_REPLY; - return; - } - *tx = replyLen; - THROW(APDU_CODE_OK); + if (requireConfirmation) { + view_review_init(addr_getItem, addr_getNumItems, app_reply_address); + view_review_show(REVIEW_ADDRESS); + *flags |= IO_ASYNCH_REPLY; + return; + } + *tx = replyLen; + THROW(APDU_CODE_OK); } - __Z_INLINE void handleGetAddrSaplingDiv(volatile uint32_t *flags, volatile uint32_t *tx, uint32_t rx) { - zemu_log("----[handleGetAddrSaplingDiv]\n"); + zemu_log("----[handleGetAddrSaplingDiv]\n"); - *tx = 0; - if (rx < APDU_MIN_LENGTH) { - THROW(APDU_CODE_COMMAND_NOT_ALLOWED); - } + *tx = 0; + if (rx < APDU_MIN_LENGTH) { + THROW(APDU_CODE_COMMAND_NOT_ALLOWED); + } - if (rx - APDU_MIN_LENGTH != DATA_LENGTH_GET_ADDR_DIV) { - THROW(APDU_CODE_COMMAND_NOT_ALLOWED); - } + if (rx - APDU_MIN_LENGTH != DATA_LENGTH_GET_ADDR_DIV) { + THROW(APDU_CODE_COMMAND_NOT_ALLOWED); + } - if (G_io_apdu_buffer[OFFSET_DATA_LEN] != DATA_LENGTH_GET_ADDR_DIV) { - THROW(APDU_CODE_COMMAND_NOT_ALLOWED); - } + if (G_io_apdu_buffer[OFFSET_DATA_LEN] != DATA_LENGTH_GET_ADDR_DIV) { + THROW(APDU_CODE_COMMAND_NOT_ALLOWED); + } - uint8_t requireConfirmation = G_io_apdu_buffer[OFFSET_P1]; + uint8_t requireConfirmation = G_io_apdu_buffer[OFFSET_P1]; - uint16_t replyLen = 0; + uint16_t replyLen = 0; - zemu_log_stack("handleGetAddrSapling_withdiv"); + zemu_log_stack("handleGetAddrSapling_withdiv"); - parser_addr_div_t parser_addr; - MEMZERO(&parser_addr, sizeof(parser_addr_div_t)); + parser_addr_div_t parser_addr; + MEMZERO(&parser_addr, sizeof(parser_addr_div_t)); - parser_error_t prserr = parser_sapling_path_with_div(G_io_apdu_buffer + OFFSET_DATA, DATA_LENGTH_GET_ADDR_DIV, - &parser_addr); - MEMZERO(G_io_apdu_buffer, IO_APDU_BUFFER_SIZE); - if (prserr != parser_ok) { - *tx = 0; - THROW(APDU_CODE_DATA_INVALID); - } - zxerr_t err = crypto_fillAddress_with_diversifier_sapling(G_io_apdu_buffer, IO_APDU_BUFFER_SIZE - 3, - parser_addr.path, parser_addr.div, &replyLen); - if (err != zxerr_ok) { - *tx = 0; - THROW(APDU_CODE_DATA_INVALID); - } - action_addrResponse.kind = addr_sapling_div; - action_addrResponse.len = replyLen; - - if (requireConfirmation) { - view_review_init(addr_getItem, addr_getNumItems, app_reply_address); - view_review_show(REVIEW_ADDRESS); - *flags |= IO_ASYNCH_REPLY; - return; - } - *tx = replyLen; - THROW(APDU_CODE_OK); + parser_error_t prserr = parser_sapling_path_with_div( + G_io_apdu_buffer + OFFSET_DATA, DATA_LENGTH_GET_ADDR_DIV, &parser_addr); + MEMZERO(G_io_apdu_buffer, IO_APDU_BUFFER_SIZE); + if (prserr != parser_ok) { + *tx = 0; + THROW(APDU_CODE_DATA_INVALID); + } + zxerr_t err = crypto_fillAddress_with_diversifier_sapling( + G_io_apdu_buffer, IO_APDU_BUFFER_SIZE - 3, parser_addr.path, + parser_addr.div, &replyLen); + if (err != zxerr_ok) { + *tx = 0; + THROW(APDU_CODE_DATA_INVALID); + } + action_addrResponse.kind = addr_sapling_div; + action_addrResponse.len = replyLen; + + if (requireConfirmation) { + view_review_init(addr_getItem, addr_getNumItems, app_reply_address); + view_review_show(REVIEW_ADDRESS); + *flags |= IO_ASYNCH_REPLY; + return; + } + *tx = replyLen; + THROW(APDU_CODE_OK); } __Z_INLINE void handleGetDiversifierList(volatile uint32_t *tx, uint32_t rx) { - zemu_log("----[handleGetDiversifierList]\n"); + zemu_log("----[handleGetDiversifierList]\n"); - *tx = 0; - if (rx < APDU_MIN_LENGTH) { - THROW(APDU_CODE_COMMAND_NOT_ALLOWED); - } + *tx = 0; + if (rx < APDU_MIN_LENGTH) { + THROW(APDU_CODE_COMMAND_NOT_ALLOWED); + } - if (rx - APDU_MIN_LENGTH != DATA_LENGTH_GET_DIV_LIST) { - THROW(APDU_CODE_COMMAND_NOT_ALLOWED); - } + if (rx - APDU_MIN_LENGTH != DATA_LENGTH_GET_DIV_LIST) { + THROW(APDU_CODE_COMMAND_NOT_ALLOWED); + } - if (G_io_apdu_buffer[OFFSET_DATA_LEN] != DATA_LENGTH_GET_DIV_LIST) { - THROW(APDU_CODE_COMMAND_NOT_ALLOWED); - } + if (G_io_apdu_buffer[OFFSET_DATA_LEN] != DATA_LENGTH_GET_DIV_LIST) { + THROW(APDU_CODE_COMMAND_NOT_ALLOWED); + } - uint16_t replyLen = 0; + uint16_t replyLen = 0; - zemu_log_stack("handleGetDiversifierList"); + zemu_log_stack("handleGetDiversifierList"); - parser_addr_div_t parser_addr; - MEMZERO(&parser_addr, sizeof(parser_addr_div_t)); + parser_addr_div_t parser_addr; + MEMZERO(&parser_addr, sizeof(parser_addr_div_t)); - parser_error_t prserr = parser_sapling_path_with_div(G_io_apdu_buffer + OFFSET_DATA, DATA_LENGTH_GET_DIV_LIST, - &parser_addr); - MEMZERO(G_io_apdu_buffer, IO_APDU_BUFFER_SIZE); - if (prserr != parser_ok) { - *tx = 0; - THROW(APDU_CODE_DATA_INVALID); - } - zxerr_t err = crypto_diversifier_with_startindex(G_io_apdu_buffer, parser_addr.path, parser_addr.div, &replyLen); + parser_error_t prserr = parser_sapling_path_with_div( + G_io_apdu_buffer + OFFSET_DATA, DATA_LENGTH_GET_DIV_LIST, &parser_addr); + MEMZERO(G_io_apdu_buffer, IO_APDU_BUFFER_SIZE); + if (prserr != parser_ok) { + *tx = 0; + THROW(APDU_CODE_DATA_INVALID); + } + zxerr_t err = crypto_diversifier_with_startindex( + G_io_apdu_buffer, parser_addr.path, parser_addr.div, &replyLen); - if (err == zxerr_ok) { - *tx = replyLen; - THROW(APDU_CODE_OK); - } else { - *tx = 0; - THROW(APDU_CODE_DATA_INVALID); - } + if (err == zxerr_ok) { + *tx = replyLen; + THROW(APDU_CODE_OK); + } else { + *tx = 0; + THROW(APDU_CODE_DATA_INVALID); + } } __Z_INLINE void handleGetAddrSapling(volatile uint32_t *flags, volatile uint32_t *tx, uint32_t rx) { - zemu_log("----[handleGetAddrSapling]\n"); - - *tx = 0; - if (rx < APDU_MIN_LENGTH) { - zemu_log("Missing data!\n"); - THROW(APDU_CODE_COMMAND_NOT_ALLOWED); - } + zemu_log("----[handleGetAddrSapling]\n"); + *tx = 0; + if (rx < APDU_MIN_LENGTH) { + zemu_log("Missing data!\n"); + THROW(APDU_CODE_COMMAND_NOT_ALLOWED); + } - if ( rx != (uint32_t)(DATA_LENGTH_GET_ADDR_SAPLING + APDU_MIN_LENGTH)) { - zemu_log("Wrong length!\n"); - THROW(APDU_CODE_COMMAND_NOT_ALLOWED); - } + if (rx != (uint32_t)(DATA_LENGTH_GET_ADDR_SAPLING + APDU_MIN_LENGTH)) { + zemu_log("Wrong length!\n"); + THROW(APDU_CODE_COMMAND_NOT_ALLOWED); + } - if (G_io_apdu_buffer[OFFSET_DATA_LEN] != DATA_LENGTH_GET_ADDR_SAPLING) { - zemu_log("Wrong offset data length!\n"); - THROW(APDU_CODE_COMMAND_NOT_ALLOWED); - } + if (G_io_apdu_buffer[OFFSET_DATA_LEN] != DATA_LENGTH_GET_ADDR_SAPLING) { + zemu_log("Wrong offset data length!\n"); + THROW(APDU_CODE_COMMAND_NOT_ALLOWED); + } - uint8_t requireConfirmation = G_io_apdu_buffer[OFFSET_P1]; + uint8_t requireConfirmation = G_io_apdu_buffer[OFFSET_P1]; - uint32_t zip32path = 0; - parser_error_t prserr = parser_sapling_path(G_io_apdu_buffer + OFFSET_DATA, DATA_LENGTH_GET_ADDR_SAPLING, - &zip32path); - MEMZERO(G_io_apdu_buffer, IO_APDU_BUFFER_SIZE); - if (prserr != parser_ok) { - *tx = 0; - THROW(APDU_CODE_DATA_INVALID); - } - uint16_t replyLen = 0; - zxerr_t err = crypto_fillAddress_sapling(G_io_apdu_buffer, IO_APDU_BUFFER_SIZE - 2, zip32path, &replyLen); - if (err != zxerr_ok) { - *tx = 0; - THROW(APDU_CODE_DATA_INVALID); - } - action_addrResponse.kind = addr_sapling; - action_addrResponse.len = replyLen; - - if (requireConfirmation) { - view_review_init(addr_getItem, addr_getNumItems, app_reply_address); - view_review_show(REVIEW_ADDRESS); - *flags |= IO_ASYNCH_REPLY; - return; - } + uint32_t zip32path = 0; + parser_error_t prserr = parser_sapling_path( + G_io_apdu_buffer + OFFSET_DATA, DATA_LENGTH_GET_ADDR_SAPLING, &zip32path); + MEMZERO(G_io_apdu_buffer, IO_APDU_BUFFER_SIZE); + if (prserr != parser_ok) { + *tx = 0; + THROW(APDU_CODE_DATA_INVALID); + } + uint16_t replyLen = 0; + zxerr_t err = crypto_fillAddress_sapling( + G_io_apdu_buffer, IO_APDU_BUFFER_SIZE - 2, zip32path, &replyLen); + if (err != zxerr_ok) { + *tx = 0; + THROW(APDU_CODE_DATA_INVALID); + } + action_addrResponse.kind = addr_sapling; + action_addrResponse.len = replyLen; + + if (requireConfirmation) { + view_review_init(addr_getItem, addr_getNumItems, app_reply_address); + view_review_show(REVIEW_ADDRESS); + *flags |= IO_ASYNCH_REPLY; + return; + } - *tx = replyLen; - THROW(APDU_CODE_OK); + *tx = replyLen; + THROW(APDU_CODE_OK); } -__Z_INLINE void handleSignSapling() { - THROW(APDU_CODE_COMMAND_NOT_ALLOWED); -} +__Z_INLINE void handleSignSapling() { THROW(APDU_CODE_COMMAND_NOT_ALLOWED); } #if defined(APP_TESTING) -#include #include "cx.h" -#include "rslib.h" #include "jubjub.h" +#include "rslib.h" +#include void handleTest(volatile uint32_t *tx) { - uint8_t point[32] = { 48, 181, 242, 170, 173, 50, 86, 48, 188, 221, 219, 206, 77, 103, 101, 109, 5, 253, 28, 194, - 208, 55, 187, 83, 117, 182, 233, 109, 158, 1, 161, 215}; + uint8_t point[32] = {48, 181, 242, 170, 173, 50, 86, 48, 188, 221, 219, + 206, 77, 103, 101, 109, 5, 253, 28, 194, 208, 55, + 187, 83, 117, 182, 233, 109, 158, 1, 161, 215}; - uint8_t scalar[32] = { 0x66, 0x5e, 0xd6, 0xf7, 0xb7, 0x93, 0xaf, 0xa1, 0x82, 0x21, 0xe1, 0x57, 0xba, 0xd5, - 0x43, 0x3c, 0x54, 0x23, 0xf4, 0xfe, 0xc9, 0x46, 0xe0, 0x8e, 0xd6, 0x30, 0xa0, 0xc6, - 0x0a, 0x1f, 0xac, 0x02,}; + uint8_t scalar[32] = { + 0x66, 0x5e, 0xd6, 0xf7, 0xb7, 0x93, 0xaf, 0xa1, 0x82, 0x21, 0xe1, + 0x57, 0xba, 0xd5, 0x43, 0x3c, 0x54, 0x23, 0xf4, 0xfe, 0xc9, 0x46, + 0xe0, 0x8e, 0xd6, 0x30, 0xa0, 0xc6, 0x0a, 0x1f, 0xac, 0x02, + }; - jubjub_extendedpoint p; - jubjub_fq scal; - jubjub_field_frombytes(scal,scalar); - - jubjub_extendedpoint_tobytes(point,JUBJUB_GEN); - zxerr_t err = jubjub_extendedpoint_frombytes(&p, point); - if(err!=zxerr_ok){ - *tx = 0; - MEMZERO(point, 32); - THROW(APDU_CODE_OK); - } - //MEMCPY(&p, &JUBJUB_GEN, 32); - //jubjub_extendedpoint_scalarmult(&p, scal); - jubjub_extendedpoint_tobytes(point,p); + jubjub_extendedpoint p; + jubjub_fq scal; + jubjub_field_frombytes(scal, scalar); - MEMCPY(G_io_apdu_buffer, point,32); - *tx = 32; + jubjub_extendedpoint_tobytes(point, JUBJUB_GEN); + zxerr_t err = jubjub_extendedpoint_frombytes(&p, point); + if (err != zxerr_ok) { + *tx = 0; + MEMZERO(point, 32); THROW(APDU_CODE_OK); + } + // MEMCPY(&p, &JUBJUB_GEN, 32); + // jubjub_extendedpoint_scalarmult(&p, scal); + jubjub_extendedpoint_tobytes(point, p); + + MEMCPY(G_io_apdu_buffer, point, 32); + *tx = 32; + THROW(APDU_CODE_OK); } #endif void handleApdu(volatile uint32_t *flags, volatile uint32_t *tx, uint32_t rx) { - uint16_t sw = 0; - - BEGIN_TRY - { - TRY - { - if (G_io_apdu_buffer[OFFSET_CLA] != CLA) { - THROW(APDU_CODE_CLA_NOT_SUPPORTED); - } - - if (rx < APDU_MIN_LENGTH) { - THROW(APDU_CODE_WRONG_LENGTH); - } - - switch (G_io_apdu_buffer[OFFSET_INS]) { - case INS_GET_VERSION: { - handle_getversion(tx); - break; - } - - case INS_GET_ADDR_SECP256K1: { - CHECK_PIN_VALIDATED() - handleGetAddrSecp256K1(flags, tx, rx); - break; - } - - case INS_GET_IVK: { - CHECK_PIN_VALIDATED() - handleGetKeyIVK(flags, tx, rx); - break; - } - - case INS_GET_OVK: { - CHECK_PIN_VALIDATED() - handleGetKeyOVK(flags, tx, rx); - break; - } - - case INS_GET_NF: { - CHECK_PIN_VALIDATED() - handleGetNullifier(flags, tx, rx); - break; - } - - case INS_GET_FVK: { - zemu_log("----[INS_GET_FVK]\n"); - CHECK_PIN_VALIDATED() - handleGetKeyFVK(flags, tx, rx); - break; - } - - case INS_INIT_TX: { - CHECK_PIN_VALIDATED() - handleInitTX(flags, tx, rx); - break; - } - - case INS_EXTRACT_SPEND: { - CHECK_PIN_VALIDATED() - handleExtractSpendData(tx, rx); - break; - } - - case INS_EXTRACT_OUTPUT: { - CHECK_PIN_VALIDATED() - handleExtractOutputData(tx, rx); - break; - } - - case INS_CHECKANDSIGN: { - CHECK_PIN_VALIDATED() - handleCheckandSign(tx, rx); - break; - } - - case INS_EXTRACT_SPENDSIG: { - CHECK_PIN_VALIDATED() - handleExtractSpendSignature(tx, rx); - break; - } - - case INS_EXTRACT_TRANSSIG: { - CHECK_PIN_VALIDATED() - handleExtractTransparentSignature(tx, rx); - break; - } - - case INS_GET_ADDR_SAPLING: { - CHECK_PIN_VALIDATED() - handleGetAddrSapling(flags, tx, rx); - break; - } - - case INS_GET_DIV_LIST: { - CHECK_PIN_VALIDATED() - handleGetDiversifierList(tx, rx); - break; - } - - case INS_GET_ADDR_SAPLING_DIV: { - CHECK_PIN_VALIDATED() - handleGetAddrSaplingDiv(flags, tx, rx); - break; - } - - case INS_SIGN_SAPLING: { - CHECK_PIN_VALIDATED() - handleSignSapling(); - break; - } + uint16_t sw = 0; + + BEGIN_TRY { + TRY { + if (G_io_apdu_buffer[OFFSET_CLA] != CLA) { + THROW(APDU_CODE_CLA_NOT_SUPPORTED); + } + + if (rx < APDU_MIN_LENGTH) { + THROW(APDU_CODE_WRONG_LENGTH); + } + + switch (G_io_apdu_buffer[OFFSET_INS]) { + case INS_GET_VERSION: { + handle_getversion(tx); + break; + } + + case INS_GET_ADDR_SECP256K1: { + CHECK_PIN_VALIDATED() + handleGetAddrSecp256K1(flags, tx, rx); + break; + } + + case INS_GET_IVK: { + CHECK_PIN_VALIDATED() + handleGetKeyIVK(flags, tx, rx); + break; + } + + case INS_GET_OVK: { + CHECK_PIN_VALIDATED() + handleGetKeyOVK(flags, tx, rx); + break; + } + + case INS_GET_NF: { + CHECK_PIN_VALIDATED() + handleGetNullifier(flags, tx, rx); + break; + } + + case INS_GET_FVK: { + zemu_log("----[INS_GET_FVK]\n"); + CHECK_PIN_VALIDATED() + handleGetKeyFVK(flags, tx, rx); + break; + } + + case INS_INIT_TX: { + CHECK_PIN_VALIDATED() + handleInitTX(flags, tx, rx); + break; + } + + case INS_EXTRACT_SPEND: { + CHECK_PIN_VALIDATED() + handleExtractSpendData(tx, rx); + break; + } + + case INS_EXTRACT_OUTPUT: { + CHECK_PIN_VALIDATED() + handleExtractOutputData(tx, rx); + break; + } + + case INS_CHECKANDSIGN: { + CHECK_PIN_VALIDATED() + handleCheckandSign(tx, rx); + break; + } + + case INS_EXTRACT_SPENDSIG: { + CHECK_PIN_VALIDATED() + handleExtractSpendSignature(tx, rx); + break; + } + + case INS_EXTRACT_TRANSSIG: { + CHECK_PIN_VALIDATED() + handleExtractTransparentSignature(tx, rx); + break; + } + + case INS_GET_ADDR_SAPLING: { + CHECK_PIN_VALIDATED() + handleGetAddrSapling(flags, tx, rx); + break; + } + + case INS_GET_DIV_LIST: { + CHECK_PIN_VALIDATED() + handleGetDiversifierList(tx, rx); + break; + } + + case INS_GET_ADDR_SAPLING_DIV: { + CHECK_PIN_VALIDATED() + handleGetAddrSaplingDiv(flags, tx, rx); + break; + } + + case INS_SIGN_SAPLING: { + CHECK_PIN_VALIDATED() + handleSignSapling(); + break; + } #if defined(APP_TESTING) - case INS_TEST: { - handleTest(tx); - /* - G_io_apdu_buffer[0] = 0xCA; - G_io_apdu_buffer[1] = 0xFE; - *tx = 3; - */ - THROW(APDU_CODE_OK); - break; - } + case INS_TEST: { + handleTest(tx); + /* + G_io_apdu_buffer[0] = 0xCA; + G_io_apdu_buffer[1] = 0xFE; + *tx = 3; + */ + THROW(APDU_CODE_OK); + break; + } #endif - default: - THROW(APDU_CODE_INS_NOT_SUPPORTED); - } - } - CATCH(EXCEPTION_IO_RESET) { - THROW(EXCEPTION_IO_RESET); - } - CATCH_OTHER(e) - { - switch (e & 0xF000) { - case 0x6000: - case APDU_CODE_OK: - sw = e; - break; - default: - sw = 0x6800 | (e & 0x7FF); - break; - } - G_io_apdu_buffer[*tx] = sw >> 8; - G_io_apdu_buffer[*tx + 1] = sw; - *tx += 2; - } - FINALLY - { - } - } - END_TRY; + default: + THROW(APDU_CODE_INS_NOT_SUPPORTED); + } + } + CATCH(EXCEPTION_IO_RESET) { THROW(EXCEPTION_IO_RESET); } + CATCH_OTHER(e) { + switch (e & 0xF000) { + case 0x6000: + case APDU_CODE_OK: + sw = e; + break; + default: + sw = 0x6800 | (e & 0x7FF); + break; + } + G_io_apdu_buffer[*tx] = sw >> 8; + G_io_apdu_buffer[*tx + 1] = sw; + *tx += 2; + } + FINALLY {} + } + END_TRY; } diff --git a/app/src/c_api/rust.c b/app/src/c_api/rust.c index b779699e..046ca3e5 100644 --- a/app/src/c_api/rust.c +++ b/app/src/c_api/rust.c @@ -1,12 +1,12 @@ -#include -#include -#include -#include -#include "os.h" -#include "cx.h" #include "aes.h" #include "coin.h" +#include "cx.h" #include "jubjub.h" +#include "os.h" +#include +#include +#include +#include #define CTX_REDJUBJUB "Zcash_RedJubjubH" #define CTX_REDJUBJUB_LEN 16 @@ -20,53 +20,60 @@ #include #include -#if defined (TARGET_NANOS) || defined(TARGET_NANOX) || defined(TARGET_NANOS2) || defined(TARGET_STAX) +#if defined(TARGET_NANOS) || defined(TARGET_NANOX) || \ + defined(TARGET_NANOS2) || defined(TARGET_STAX) #include "lcx_rng.h" unsigned char *bolos_cx_rng(uint8_t *buffer, size_t len) { - cx_rng_no_throw(buffer, len); - return buffer; + cx_rng_no_throw(buffer, len); + return buffer; } #endif -void c_blake2b32_withpersonal(const uint8_t *person, const uint8_t *a, uint32_t a_len, uint8_t *out) { - cx_blake2b_t ctx; - cx_blake2b_init2_no_throw(&ctx, 256, NULL, 0, (uint8_t *) person, 16); - cx_hash_no_throw(&ctx.header, CX_LAST, a, a_len, out, 256); +void c_blake2b32_withpersonal(const uint8_t *person, const uint8_t *a, + uint32_t a_len, uint8_t *out) { + cx_blake2b_t ctx; + cx_blake2b_init2_no_throw(&ctx, 256, NULL, 0, (uint8_t *)person, 16); + cx_hash_no_throw(&ctx.header, CX_LAST, a, a_len, out, 256); }; -void c_blake2b64_withpersonal(const uint8_t *person, const uint8_t *a, uint32_t a_len, uint8_t *out) { - cx_blake2b_t ctx; - cx_blake2b_init2_no_throw(&ctx, 512, NULL, 0, (uint8_t *) person, 16); - cx_hash_no_throw(&ctx.header, CX_LAST, a, a_len, out, 512); +void c_blake2b64_withpersonal(const uint8_t *person, const uint8_t *a, + uint32_t a_len, uint8_t *out) { + cx_blake2b_t ctx; + cx_blake2b_init2_no_throw(&ctx, 512, NULL, 0, (uint8_t *)person, 16); + cx_hash_no_throw(&ctx.header, CX_LAST, a, a_len, out, 512); }; void c_zcash_blake2b_redjubjub(const uint8_t *a, uint32_t a_len, - const uint8_t *b, uint32_t b_len, - uint8_t *out) { - cx_blake2b_t ctx; - cx_blake2b_init2_no_throw(&ctx, 8 * CTX_REDJUBJUB_HASH_LEN, NULL, 0, (uint8_t *) CTX_REDJUBJUB, CTX_REDJUBJUB_LEN); - cx_hash_no_throw(&ctx.header, 0, a, a_len, NULL, 0); - cx_hash_no_throw(&ctx.header, CX_LAST, b, b_len, out, CTX_REDJUBJUB_HASH_LEN); + const uint8_t *b, uint32_t b_len, uint8_t *out) { + cx_blake2b_t ctx; + cx_blake2b_init2_no_throw(&ctx, 8 * CTX_REDJUBJUB_HASH_LEN, NULL, 0, + (uint8_t *)CTX_REDJUBJUB, CTX_REDJUBJUB_LEN); + cx_hash_no_throw(&ctx.header, 0, a, a_len, NULL, 0); + cx_hash_no_throw(&ctx.header, CX_LAST, b, b_len, out, CTX_REDJUBJUB_HASH_LEN); } void c_zcash_blake2b_expand_seed(const uint8_t *a, uint32_t a_len, const uint8_t *b, uint32_t b_len, uint8_t *out) { - cx_blake2b_t ctx; - cx_blake2b_init2_no_throw(&ctx, 8 * CTX_EXPAND_SEED_HASH_LEN, NULL, 0, (uint8_t *) CTX_EXPAND_SEED, CTX_EXPAND_SEED_LEN); - cx_hash_no_throw(&ctx.header, 0, a, a_len, NULL, 0); - cx_hash_no_throw(&ctx.header, CX_LAST, b, b_len, out, CTX_EXPAND_SEED_HASH_LEN); + cx_blake2b_t ctx; + cx_blake2b_init2_no_throw(&ctx, 8 * CTX_EXPAND_SEED_HASH_LEN, NULL, 0, + (uint8_t *)CTX_EXPAND_SEED, CTX_EXPAND_SEED_LEN); + cx_hash_no_throw(&ctx.header, 0, a, a_len, NULL, 0); + cx_hash_no_throw(&ctx.header, CX_LAST, b, b_len, out, + CTX_EXPAND_SEED_HASH_LEN); } void c_zcash_blake2b_expand_vec_two(const uint8_t *a, uint32_t a_len, const uint8_t *b, uint32_t b_len, const uint8_t *c, uint32_t c_len, uint8_t *out) { - cx_blake2b_t ctx; - cx_blake2b_init2_no_throw(&ctx, 8 * CTX_EXPAND_SEED_HASH_LEN, NULL, 0, (uint8_t *) CTX_EXPAND_SEED, CTX_EXPAND_SEED_LEN); - cx_hash_no_throw(&ctx.header, 0, a, a_len, NULL, 0); - cx_hash_no_throw(&ctx.header, 0, b, b_len, NULL, 0); - cx_hash_no_throw(&ctx.header, CX_LAST, c, c_len, out, CTX_EXPAND_SEED_HASH_LEN); + cx_blake2b_t ctx; + cx_blake2b_init2_no_throw(&ctx, 8 * CTX_EXPAND_SEED_HASH_LEN, NULL, 0, + (uint8_t *)CTX_EXPAND_SEED, CTX_EXPAND_SEED_LEN); + cx_hash_no_throw(&ctx.header, 0, a, a_len, NULL, 0); + cx_hash_no_throw(&ctx.header, 0, b, b_len, NULL, 0); + cx_hash_no_throw(&ctx.header, CX_LAST, c, c_len, out, + CTX_EXPAND_SEED_HASH_LEN); } void c_zcash_blake2b_expand_vec_four(const uint8_t *a, uint32_t a_len, @@ -75,111 +82,114 @@ void c_zcash_blake2b_expand_vec_four(const uint8_t *a, uint32_t a_len, const uint8_t *d, uint32_t d_len, const uint8_t *e, uint32_t e_len, uint8_t *out) { - cx_blake2b_t ctx; - cx_blake2b_init2_no_throw(&ctx, 8 * CTX_EXPAND_SEED_HASH_LEN, NULL, 0, (uint8_t *) CTX_EXPAND_SEED, CTX_EXPAND_SEED_LEN); - cx_hash_no_throw(&ctx.header, 0, a, a_len, NULL, 0); - cx_hash_no_throw(&ctx.header, 0, b, b_len, NULL, 0); - cx_hash_no_throw(&ctx.header, 0, c, c_len, NULL, 0); - cx_hash_no_throw(&ctx.header, 0, d, d_len, NULL, 0); - cx_hash_no_throw(&ctx.header, CX_LAST, e, e_len, out, CTX_EXPAND_SEED_HASH_LEN); + cx_blake2b_t ctx; + cx_blake2b_init2_no_throw(&ctx, 8 * CTX_EXPAND_SEED_HASH_LEN, NULL, 0, + (uint8_t *)CTX_EXPAND_SEED, CTX_EXPAND_SEED_LEN); + cx_hash_no_throw(&ctx.header, 0, a, a_len, NULL, 0); + cx_hash_no_throw(&ctx.header, 0, b, b_len, NULL, 0); + cx_hash_no_throw(&ctx.header, 0, c, c_len, NULL, 0); + cx_hash_no_throw(&ctx.header, 0, d, d_len, NULL, 0); + cx_hash_no_throw(&ctx.header, CX_LAST, e, e_len, out, + CTX_EXPAND_SEED_HASH_LEN); } -void zcash_blake2b_hash_two( - const uint8_t *perso, uint32_t perso_len, - const uint8_t *a, uint32_t a_len, - const uint8_t *b, uint32_t b_len, - uint8_t *out, uint32_t out_len) { - cx_blake2b_t zcashHashBlake2b; - cx_blake2b_init2_no_throw(&zcashHashBlake2b, 8 * out_len, NULL, 0, (uint8_t *) perso, perso_len); - cx_hash_no_throw(&zcashHashBlake2b.header, 0, a, a_len, NULL, 0); - cx_hash_no_throw(&zcashHashBlake2b.header, CX_LAST, b, b_len, out, out_len); +void zcash_blake2b_hash_two(const uint8_t *perso, uint32_t perso_len, + const uint8_t *a, uint32_t a_len, const uint8_t *b, + uint32_t b_len, uint8_t *out, uint32_t out_len) { + cx_blake2b_t zcashHashBlake2b; + cx_blake2b_init2_no_throw(&zcashHashBlake2b, 8 * out_len, NULL, 0, + (uint8_t *)perso, perso_len); + cx_hash_no_throw(&zcashHashBlake2b.header, 0, a, a_len, NULL, 0); + cx_hash_no_throw(&zcashHashBlake2b.header, CX_LAST, b, b_len, out, out_len); } -uint16_t fp_uint64_to_str(char *out, uint16_t outLen, const uint64_t value, uint8_t decimals) { - return fpuint64_to_str(out, outLen, value, decimals); +uint16_t fp_uint64_to_str(char *out, uint16_t outLen, const uint64_t value, + uint8_t decimals) { + return fpuint64_to_str(out, outLen, value, decimals); } -void check_canary() { -} +void check_canary() {} -void _zemu_log_stack(uint8_t *buffer) { - zemu_log_stack((char *) buffer); -} +void _zemu_log_stack(uint8_t *buffer) { zemu_log_stack((char *)buffer); } +void c_aes256_encryptblock(const uint8_t *key, const uint8_t *in, + uint8_t *out) { + struct AES_ctx ctx; + AES_init_ctx(&ctx, key); -void c_aes256_encryptblock(const uint8_t *key, const uint8_t *in, uint8_t *out) { - struct AES_ctx ctx; - AES_init_ctx(&ctx, key); - - // encrypts in place, so we copy and encrypt - MEMCPY(out, in, AES_BLOCKLEN); - AES_ECB_encrypt(&ctx, out); + // encrypts in place, so we copy and encrypt + MEMCPY(out, in, AES_BLOCKLEN); + AES_ECB_encrypt(&ctx, out); } void c_jubjub_scalarmult(uint8_t *point, const uint8_t *scalar) { - jubjub_extendedpoint p; - jubjub_fq scal; - MEMCPY(scal, scalar, JUBJUB_FIELD_BYTES); - SWAP_ENDIAN_BYTES(scal); - - zxerr_t err = jubjub_extendedpoint_frombytes(&p, point); - if (err != zxerr_ok) { - MEMZERO(point, JUBJUB_FIELD_BYTES); - return; - } - jubjub_extendedpoint_scalarmult(&p, scal); - jubjub_extendedpoint_tobytes(point, p); + jubjub_extendedpoint p; + jubjub_fq scal; + MEMCPY(scal, scalar, JUBJUB_FIELD_BYTES); + SWAP_ENDIAN_BYTES(scal); + + zxerr_t err = jubjub_extendedpoint_frombytes(&p, point); + if (err != zxerr_ok) { + MEMZERO(point, JUBJUB_FIELD_BYTES); + return; + } + jubjub_extendedpoint_scalarmult(&p, scal); + jubjub_extendedpoint_tobytes(point, p); } void c_jubjub_spending_base_scalarmult(uint8_t *point, const uint8_t *scalar) { - jubjub_extendedpoint p; - jubjub_fq scal; - MEMCPY(scal, scalar, JUBJUB_FIELD_BYTES); - SWAP_ENDIAN_BYTES(scal); - MEMCPY(&p, &JUBJUB_GEN, sizeof(jubjub_extendedpoint)); - jubjub_extendedpoint_scalarmult(&p, scal); - jubjub_extendedpoint_tobytes(point, p); + jubjub_extendedpoint p; + jubjub_fq scal; + MEMCPY(scal, scalar, JUBJUB_FIELD_BYTES); + SWAP_ENDIAN_BYTES(scal); + MEMCPY(&p, &JUBJUB_GEN, sizeof(jubjub_extendedpoint)); + jubjub_extendedpoint_scalarmult(&p, scal); + jubjub_extendedpoint_tobytes(point, p); } // Replace functions affected by non-constant time opcodes // Overriding requires -z muldefs -// FIXME: add a python script to ensure that the correct version is used by inspecting app.asm +// FIXME: add a python script to ensure that the correct version is used by +// inspecting app.asm #if ENABLE_SDK_MULT -#define SWAP_BYTES(x, y, tmp) { \ - tmp = x; \ - x = y; \ - y = tmp;\ -} - -#define SWAP_ENDIAN(x, tmp) { \ - SWAP_BYTES(*x, *(x + 7), tmp); \ -SWAP_BYTES(*(x+1), *(x + 6), tmp); \ -SWAP_BYTES(*(x+2), *(x + 5), tmp); \ -SWAP_BYTES(*(x+3), *(x + 4), tmp); \ -} +#define SWAP_BYTES(x, y, tmp) \ + { \ + tmp = x; \ + x = y; \ + y = tmp; \ + } + +#define SWAP_ENDIAN(x, tmp) \ + { \ + SWAP_BYTES(*x, *(x + 7), tmp); \ + SWAP_BYTES(*(x + 1), *(x + 6), tmp); \ + SWAP_BYTES(*(x + 2), *(x + 5), tmp); \ + SWAP_BYTES(*(x + 3), *(x + 4), tmp); \ + } #define LMULSIZE sizeof(long long) -long long __attribute__ ((noinline)) __aeabi_lmul(long long a, long long b) { - uint8_t tmp = 0; - uint8_t *ptr = (uint8_t *)&a; +long long __attribute__((noinline)) __aeabi_lmul(long long a, long long b) { + uint8_t tmp = 0; + uint8_t *ptr = (uint8_t *)&a; - SWAP_ENDIAN(ptr, tmp); + SWAP_ENDIAN(ptr, tmp); - ptr = (uint8_t *)&b; - SWAP_ENDIAN(ptr, tmp); + ptr = (uint8_t *)&b; + SWAP_ENDIAN(ptr, tmp); - char result[2 * LMULSIZE]; - MEMZERO(result, 2 * LMULSIZE); - cx_math_mult((unsigned char *) &result, (unsigned char *) &a, (unsigned char *) &b, LMULSIZE); + char result[2 * LMULSIZE]; + MEMZERO(result, 2 * LMULSIZE); + cx_math_mult((unsigned char *)&result, (unsigned char *)&a, + (unsigned char *)&b, LMULSIZE); - SWAP_ENDIAN(ptr, tmp); - ptr = (uint8_t *)&a; - SWAP_ENDIAN(ptr, tmp); + SWAP_ENDIAN(ptr, tmp); + ptr = (uint8_t *)&a; + SWAP_ENDIAN(ptr, tmp); - ptr = (uint8_t *)&result[LMULSIZE]; - SWAP_ENDIAN(ptr, tmp); - return *((long long *) ptr); + ptr = (uint8_t *)&result[LMULSIZE]; + SWAP_ENDIAN(ptr, tmp); + return *((long long *)ptr); } #endif /* @@ -205,7 +215,8 @@ long long __multi3(long long a, long long b) { char result[2 * LMULSIZE]; MEMZERO(result, 2 * LMULSIZE); - cx_math_mult((unsigned char *) &result, (unsigned char *) &a_be, (unsigned char *) &b_be, LMULSIZE); + cx_math_mult((unsigned char *) &result, (unsigned char *) &a_be, (unsigned +char *) &b_be, LMULSIZE); long long r_le = 0; r_le |= result[LMULSIZE]; r_le <<= 8; @@ -220,13 +231,12 @@ long long __multi3(long long a, long long b) { } */ -//typedef struct { -// unsigned quot; -// unsigned rem; -//} __aeabi_uidivmod_result_t; +// typedef struct { +// unsigned quot; +// unsigned rem; +// } __aeabi_uidivmod_result_t; // //// FIXME: Complete implementation, redirect and enable -////__aeabi_uidivmod_result_t __aeabi_uidivmod(unsigned numerator, unsigned denominator) { -//// __aeabi_uidivmod_result_t r; -//// return r; +////__aeabi_uidivmod_result_t __aeabi_uidivmod(unsigned numerator, unsigned +///denominator) { / __aeabi_uidivmod_result_t r; / return r; ////} diff --git a/app/src/chacha.c b/app/src/chacha.c index 80e68666..598e3c8b 100644 --- a/app/src/chacha.c +++ b/app/src/chacha.c @@ -14,116 +14,118 @@ // Adapted from the public domain, estream code by D. Bernstein. // Adapted by Zondax -#include -#include -#include "os.h" -#include "cx.h" -#include "coin.h" -#include "app_main.h" #include "chacha.h" +#include "app_main.h" +#include "coin.h" +#include "cx.h" +#include "os.h" #include "zxmacros.h" +#include +#include - -#define U8TO32_LITTLE(p) \ - (((uint32_t)((p)[0])) | ((uint32_t)((p)[1]) << 8) | \ +#define U8TO32_LITTLE(p) \ + (((uint32_t)((p)[0])) | ((uint32_t)((p)[1]) << 8) | \ ((uint32_t)((p)[2]) << 16) | ((uint32_t)((p)[3]) << 24)) // sigma contains the ChaCha constants, which happen to be an ASCII string. static const uint8_t sigma[16] = {'e', 'x', 'p', 'a', 'n', 'd', ' ', '3', '2', '-', 'b', 'y', 't', 'e', ' ', 'k'}; #define ROTATE(v, n) (((v) << (n)) | ((v) >> (32 - (n)))) // QUARTERROUND updates a, b, c, d with a ChaCha "quarter" round. -#define QUARTERROUND(a, b, c, d) \ - x[a] += x[b]; x[d] = ROTATE(x[d] ^ x[a], 16); \ - x[c] += x[d]; x[b] = ROTATE(x[b] ^ x[c], 12); \ - x[a] += x[b]; x[d] = ROTATE(x[d] ^ x[a], 8); \ - x[c] += x[d]; x[b] = ROTATE(x[b] ^ x[c], 7); +#define QUARTERROUND(a, b, c, d) \ + x[a] += x[b]; \ + x[d] = ROTATE(x[d] ^ x[a], 16); \ + x[c] += x[d]; \ + x[b] = ROTATE(x[b] ^ x[c], 12); \ + x[a] += x[b]; \ + x[d] = ROTATE(x[d] ^ x[a], 8); \ + x[c] += x[d]; \ + x[b] = ROTATE(x[b] ^ x[c], 7); void CRYPTO_hchacha20(uint8_t out[32], const uint8_t key[32], const uint8_t nonce[16]) { - uint32_t x[16]; - MEMCPY(x, sigma, sizeof(sigma)); - MEMCPY(&x[4], key, 32); - MEMCPY(&x[12], nonce, 16); - for (size_t i = 0; i < 20; i += 2) { - QUARTERROUND(0, 4, 8, 12) - QUARTERROUND(1, 5, 9, 13) - QUARTERROUND(2, 6, 10, 14) - QUARTERROUND(3, 7, 11, 15) - QUARTERROUND(0, 5, 10, 15) - QUARTERROUND(1, 6, 11, 12) - QUARTERROUND(2, 7, 8, 13) - QUARTERROUND(3, 4, 9, 14) - } - MEMCPY(out, &x[0], sizeof(uint32_t) * 4); - MEMCPY(&out[16], &x[12], sizeof(uint32_t) * 4); + uint32_t x[16]; + MEMCPY(x, sigma, sizeof(sigma)); + MEMCPY(&x[4], key, 32); + MEMCPY(&x[12], nonce, 16); + for (size_t i = 0; i < 20; i += 2) { + QUARTERROUND(0, 4, 8, 12) + QUARTERROUND(1, 5, 9, 13) + QUARTERROUND(2, 6, 10, 14) + QUARTERROUND(3, 7, 11, 15) + QUARTERROUND(0, 5, 10, 15) + QUARTERROUND(1, 6, 11, 12) + QUARTERROUND(2, 7, 8, 13) + QUARTERROUND(3, 4, 9, 14) + } + MEMCPY(out, &x[0], sizeof(uint32_t) * 4); + MEMCPY(&out[16], &x[12], sizeof(uint32_t) * 4); } -#define U32TO8_LITTLE(p, v) \ - { \ - (p)[0] = (v >> 0) & 0xff; \ - (p)[1] = (v >> 8) & 0xff; \ - (p)[2] = (v >> 16) & 0xff; \ - (p)[3] = (v >> 24) & 0xff; \ +#define U32TO8_LITTLE(p, v) \ + { \ + (p)[0] = (v >> 0) & 0xff; \ + (p)[1] = (v >> 8) & 0xff; \ + (p)[2] = (v >> 16) & 0xff; \ + (p)[3] = (v >> 24) & 0xff; \ } // chacha_core performs 20 rounds of ChaCha on the input words in // |input| and writes the 64 output bytes to |output|. void chacha_core(uint8_t *output, const uint32_t *input) { - uint32_t x[16]; - int i; - MEMCPY(x, input, sizeof(uint32_t) * 16); - for (i = 20; i > 0; i -= 2) { - QUARTERROUND(0, 4, 8, 12) - QUARTERROUND(1, 5, 9, 13) - QUARTERROUND(2, 6, 10, 14) - QUARTERROUND(3, 7, 11, 15) - QUARTERROUND(0, 5, 10, 15) - QUARTERROUND(1, 6, 11, 12) - QUARTERROUND(2, 7, 8, 13) - QUARTERROUND(3, 4, 9, 14) - } - for (i = 0; i < 16; ++i) { - x[i] += input[i]; - } - for (i = 0; i < 16; ++i) { - U32TO8_LITTLE(output + 4 * i, x[i]); - } + uint32_t x[16]; + int i; + MEMCPY(x, input, sizeof(uint32_t) * 16); + for (i = 20; i > 0; i -= 2) { + QUARTERROUND(0, 4, 8, 12) + QUARTERROUND(1, 5, 9, 13) + QUARTERROUND(2, 6, 10, 14) + QUARTERROUND(3, 7, 11, 15) + QUARTERROUND(0, 5, 10, 15) + QUARTERROUND(1, 6, 11, 12) + QUARTERROUND(2, 7, 8, 13) + QUARTERROUND(3, 4, 9, 14) + } + for (i = 0; i < 16; ++i) { + x[i] += input[i]; + } + for (i = 0; i < 16; ++i) { + U32TO8_LITTLE(output + 4 * i, x[i]); + } } -void chacha(uint8_t *out, const uint8_t *in, size_t in_len, - const uint8_t *key, const uint8_t *nonce, - uint32_t counter) { - uint32_t input[16]; - uint8_t buf[64]; - size_t todo, i; - input[0] = U8TO32_LITTLE(sigma + 0); - input[1] = U8TO32_LITTLE(sigma + 4); - input[2] = U8TO32_LITTLE(sigma + 8); - input[3] = U8TO32_LITTLE(sigma + 12); - input[4] = U8TO32_LITTLE(key + 0); - input[5] = U8TO32_LITTLE(key + 4); - input[6] = U8TO32_LITTLE(key + 8); - input[7] = U8TO32_LITTLE(key + 12); - input[8] = U8TO32_LITTLE(key + 16); - input[9] = U8TO32_LITTLE(key + 20); - input[10] = U8TO32_LITTLE(key + 24); - input[11] = U8TO32_LITTLE(key + 28); - input[12] = counter; - input[13] = U8TO32_LITTLE(nonce + 0); - input[14] = U8TO32_LITTLE(nonce + 4); - input[15] = U8TO32_LITTLE(nonce + 8); - while (in_len > 0) { - todo = sizeof(buf); - if (in_len < todo) { - todo = in_len; - } - chacha_core(buf, input); - for (i = 0; i < todo; i++) { - out[i] = in[i] ^ buf[i]; - } - out += todo; - in += todo; - in_len -= todo; - input[12]++; +void chacha(uint8_t *out, const uint8_t *in, size_t in_len, const uint8_t *key, + const uint8_t *nonce, uint32_t counter) { + uint32_t input[16]; + uint8_t buf[64]; + size_t todo, i; + input[0] = U8TO32_LITTLE(sigma + 0); + input[1] = U8TO32_LITTLE(sigma + 4); + input[2] = U8TO32_LITTLE(sigma + 8); + input[3] = U8TO32_LITTLE(sigma + 12); + input[4] = U8TO32_LITTLE(key + 0); + input[5] = U8TO32_LITTLE(key + 4); + input[6] = U8TO32_LITTLE(key + 8); + input[7] = U8TO32_LITTLE(key + 12); + input[8] = U8TO32_LITTLE(key + 16); + input[9] = U8TO32_LITTLE(key + 20); + input[10] = U8TO32_LITTLE(key + 24); + input[11] = U8TO32_LITTLE(key + 28); + input[12] = counter; + input[13] = U8TO32_LITTLE(nonce + 0); + input[14] = U8TO32_LITTLE(nonce + 4); + input[15] = U8TO32_LITTLE(nonce + 8); + while (in_len > 0) { + todo = sizeof(buf); + if (in_len < todo) { + todo = in_len; } + chacha_core(buf, input); + for (i = 0; i < todo; i++) { + out[i] = in[i] ^ buf[i]; + } + out += todo; + in += todo; + in_len -= todo; + input[12]++; + } } diff --git a/app/src/chacha.h b/app/src/chacha.h index 99473996..9ac95ba5 100644 --- a/app/src/chacha.h +++ b/app/src/chacha.h @@ -21,11 +21,9 @@ extern "C" { void CRYPTO_hchacha20(uint8_t out[32], const uint8_t key[32], const uint8_t nonce[16]); - -void chacha(uint8_t *out, const uint8_t *in, size_t in_len, - const uint8_t *key, const uint8_t *nonce, - uint32_t counter); +void chacha(uint8_t *out, const uint8_t *in, size_t in_len, const uint8_t *key, + const uint8_t *nonce, uint32_t counter); #if defined(__cplusplus) -} // extern C -#endif // OPENSSL_HEADER_CHACHA_INTERNAL +} // extern C +#endif // OPENSSL_HEADER_CHACHA_INTERNAL diff --git a/app/src/coin.h b/app/src/coin.h index 3de79f4f..0eee2f8d 100644 --- a/app/src/coin.h +++ b/app/src/coin.h @@ -1,107 +1,103 @@ /******************************************************************************* -* (c) 2019-2021 Zondax AG -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -********************************************************************************/ + * (c) 2019-2021 Zondax AG + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ********************************************************************************/ #pragma once #ifdef __cplusplus extern "C" { #endif -#define CLA 0x85 +#define CLA 0x85 -#define HDPATH_LEN_DEFAULT 5 +#define HDPATH_LEN_DEFAULT 5 -#define HDPATH_0_DEFAULT (0x80000000u | 0x2cu) -#define HDPATH_1_DEFAULT (0x80000000u | 0x85) -#define HDPATH_2_DEFAULT (0x80000000u | 0u) -#define HDPATH_3_DEFAULT (0u) -#define HDPATH_4_DEFAULT (0u) +#define HDPATH_0_DEFAULT (0x80000000u | 0x2cu) +#define HDPATH_1_DEFAULT (0x80000000u | 0x85) +#define HDPATH_2_DEFAULT (0x80000000u | 0u) +#define HDPATH_3_DEFAULT (0u) +#define HDPATH_4_DEFAULT (0u) -#define HDPATH_0_TESTNET (0x80000000u | 0x2cu) -#define HDPATH_1_TESTNET (0x80000000u | 0x1u) +#define HDPATH_0_TESTNET (0x80000000u | 0x2cu) +#define HDPATH_1_TESTNET (0x80000000u | 0x1u) // compressed key -#define PK_LEN_SECP256K1 33u +#define PK_LEN_SECP256K1 33u // sapling address [11+32] -#define ADDR_LEN_SAPLING 43u +#define ADDR_LEN_SAPLING 43u // ivk -#define LEN_IVK 32u - -//ak, nsk -#define LEN_PGK 64u - -#define ENABLE_SDK_MULT 0 - -#define DATA_LENGTH_GET_IVK 4 //ZIP32-path -#define DATA_LENGTH_GET_OVK 4 //ZIP32-path -#define DATA_LENGTH_GET_FVK 4 //ZIP32-path -#define DATA_LENGTH_GET_NF 44 // ZIP32-path + 8-byte note position + 32-byte note commitment -#define DATA_LENGTH_GET_ADDR_SAPLING 4 //ZIP32-path -#define DATA_LENGTH_GET_DIV_LIST 15 //ZIP32-path + 11-byte index -#define DATA_LENGTH_GET_ADDR_DIV 15 //ZIP32-path + 11-byte div - -#define INS_GET_VERSION 0x00 -#define INS_GET_ADDR_SECP256K1 0x01 -#define INS_SIGN_SECP256K1 0x02 -#define INS_GET_DIV_LIST 0x09 -#define INS_GET_ADDR_SAPLING_DIV 0x10 -#define INS_GET_ADDR_SAPLING 0x11 -#define INS_SIGN_SAPLING 0x12 - -#define INS_INIT_TX 0xa0 -#define INS_KEY_EXCHANGE 0xaa -#define INS_EXTRACT_SPEND 0xa1 -#define INS_EXTRACT_OUTPUT 0xa2 -#define INS_CHECKANDSIGN 0xa3 -#define INS_EXTRACT_SPENDSIG 0xa4 -#define INS_EXTRACT_TRANSSIG 0xa5 - -#define INS_GET_IVK 0xf0 -#define INS_GET_OVK 0xf1 -#define INS_GET_NF 0xf2 -#define INS_GET_FVK 0xf3 -#define INS_CRASH_TEST 0xff +#define LEN_IVK 32u + +// ak, nsk +#define LEN_PGK 64u + +#define ENABLE_SDK_MULT 0 + +#define DATA_LENGTH_GET_IVK 4 // ZIP32-path +#define DATA_LENGTH_GET_OVK 4 // ZIP32-path +#define DATA_LENGTH_GET_FVK 4 // ZIP32-path +#define DATA_LENGTH_GET_NF \ + 44 // ZIP32-path + 8-byte note position + 32-byte note commitment +#define DATA_LENGTH_GET_ADDR_SAPLING 4 // ZIP32-path +#define DATA_LENGTH_GET_DIV_LIST 15 // ZIP32-path + 11-byte index +#define DATA_LENGTH_GET_ADDR_DIV 15 // ZIP32-path + 11-byte div + +#define INS_GET_VERSION 0x00 +#define INS_GET_ADDR_SECP256K1 0x01 +#define INS_SIGN_SECP256K1 0x02 +#define INS_GET_DIV_LIST 0x09 +#define INS_GET_ADDR_SAPLING_DIV 0x10 +#define INS_GET_ADDR_SAPLING 0x11 +#define INS_SIGN_SAPLING 0x12 + +#define INS_INIT_TX 0xa0 +#define INS_KEY_EXCHANGE 0xaa +#define INS_EXTRACT_SPEND 0xa1 +#define INS_EXTRACT_OUTPUT 0xa2 +#define INS_CHECKANDSIGN 0xa3 +#define INS_EXTRACT_SPENDSIG 0xa4 +#define INS_EXTRACT_TRANSSIG 0xa5 + +#define INS_GET_IVK 0xf0 +#define INS_GET_OVK 0xf1 +#define INS_GET_NF 0xf2 +#define INS_GET_FVK 0xf3 +#define INS_CRASH_TEST 0xff typedef enum { - addr_secp256k1 = 0, - addr_sapling = 1, - addr_sapling_div = 2, + addr_secp256k1 = 0, + addr_sapling = 1, + addr_sapling_div = 2, } address_kind_e; -typedef enum { - key_ivk = 0, - key_ovk = 1, - key_fvk = 2, - nf = 3 -} key_type_e; +typedef enum { key_ivk = 0, key_ovk = 1, key_fvk = 2, nf = 3 } key_type_e; -#define VIEW_ADDRESS_OFFSET_SECP256K1 PK_LEN_SECP256K1 -#define VIEW_ADDRESS_OFFSET_SAPLING ADDR_LEN_SAPLING +#define VIEW_ADDRESS_OFFSET_SECP256K1 PK_LEN_SECP256K1 +#define VIEW_ADDRESS_OFFSET_SAPLING ADDR_LEN_SAPLING -#define MENU_MAIN_APP_LINE1 "Zcash" -#define MENU_MAIN_APP_LINE2 "Ready" -#define APPVERSION_LINE1 "Zcash" -#define APPVERSION_LINE2 ("v" APPVERSION) +#define MENU_MAIN_APP_LINE1 "Zcash" +#define MENU_MAIN_APP_LINE2 "Ready" +#define APPVERSION_LINE1 "Zcash" +#define APPVERSION_LINE2 ("v" APPVERSION) -#define MENU_MAIN_APP_LINE2_SECRET "?" -#define COIN_SECRET_REQUIRED_CLICKS 0 +#define MENU_MAIN_APP_LINE2_SECRET "?" +#define COIN_SECRET_REQUIRED_CLICKS 0 -#define COIN_AMOUNT_DECIMAL_PLACES 18 // FIXME: Check this -#define CRYPTO_BLOB_SKIP_BYTES 0 +#define COIN_AMOUNT_DECIMAL_PLACES 18 // FIXME: Check this +#define CRYPTO_BLOB_SKIP_BYTES 0 #ifdef __cplusplus } diff --git a/app/src/common/actions.c b/app/src/common/actions.c index b76094bd..ce4d0916 100644 --- a/app/src/common/actions.c +++ b/app/src/common/actions.c @@ -1,18 +1,18 @@ /******************************************************************************* -* (c) 2021 Zondax AG -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -********************************************************************************/ + * (c) 2021 Zondax AG + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ********************************************************************************/ #include "actions.h" #include "tx.h" diff --git a/app/src/common/actions.h b/app/src/common/actions.h index 3d3679d7..13e11d11 100644 --- a/app/src/common/actions.h +++ b/app/src/common/actions.h @@ -1,70 +1,70 @@ /******************************************************************************* -* (c) 2018 -2022 Zondax AG -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -********************************************************************************/ + * (c) 2018 -2022 Zondax AG + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ********************************************************************************/ #pragma once -#include -#include "crypto.h" -#include "tx.h" #include "apdu_codes.h" -#include "zcash_apdu_errors.h" -#include -#include "coin.h" #include "app_main.h" +#include "coin.h" +#include "crypto.h" #include "nvdata.h" #include "parser.h" +#include "tx.h" +#include "zcash_apdu_errors.h" +#include +#include typedef struct { - address_kind_e kind; - uint8_t len; + address_kind_e kind; + uint8_t len; } address_state_t; typedef struct { - key_type_e kind; - uint8_t len; + key_type_e kind; + uint8_t len; } key_state_t; extern address_state_t action_addrResponse; extern key_state_t key_state; __Z_INLINE void app_reject() { - transaction_reset(); - MEMZERO(G_io_apdu_buffer, IO_APDU_BUFFER_SIZE); - view_tx_state(); - set_code(G_io_apdu_buffer, 0, APDU_CODE_COMMAND_NOT_ALLOWED); - io_exchange(CHANNEL_APDU | IO_RETURN_AFTER_TX, 2); + transaction_reset(); + MEMZERO(G_io_apdu_buffer, IO_APDU_BUFFER_SIZE); + view_tx_state(); + set_code(G_io_apdu_buffer, 0, APDU_CODE_COMMAND_NOT_ALLOWED); + io_exchange(CHANNEL_APDU | IO_RETURN_AFTER_TX, 2); } __Z_INLINE void app_reply_key() { - set_code(G_io_apdu_buffer, key_state.len, APDU_CODE_OK); - io_exchange(CHANNEL_APDU | IO_RETURN_AFTER_TX, key_state.len + 2); + set_code(G_io_apdu_buffer, key_state.len, APDU_CODE_OK); + io_exchange(CHANNEL_APDU | IO_RETURN_AFTER_TX, key_state.len + 2); } __Z_INLINE void app_reply_address() { - set_code(G_io_apdu_buffer, action_addrResponse.len, APDU_CODE_OK); - io_exchange(CHANNEL_APDU | IO_RETURN_AFTER_TX, action_addrResponse.len + 2); + set_code(G_io_apdu_buffer, action_addrResponse.len, APDU_CODE_OK); + io_exchange(CHANNEL_APDU | IO_RETURN_AFTER_TX, action_addrResponse.len + 2); } __Z_INLINE void app_reply_error() { - MEMZERO(G_io_apdu_buffer, IO_APDU_BUFFER_SIZE); - set_code(G_io_apdu_buffer, 0, APDU_CODE_DATA_INVALID); - io_exchange(CHANNEL_APDU | IO_RETURN_AFTER_TX, 2); + MEMZERO(G_io_apdu_buffer, IO_APDU_BUFFER_SIZE); + set_code(G_io_apdu_buffer, 0, APDU_CODE_DATA_INVALID); + io_exchange(CHANNEL_APDU | IO_RETURN_AFTER_TX, 2); } __Z_INLINE void app_reply_hash() { - view_tx_state(); - set_code(G_io_apdu_buffer, 32, APDU_CODE_OK); - io_exchange(CHANNEL_APDU | IO_RETURN_AFTER_TX, 32 + 2); + view_tx_state(); + set_code(G_io_apdu_buffer, 32, APDU_CODE_OK); + io_exchange(CHANNEL_APDU | IO_RETURN_AFTER_TX, 32 + 2); } diff --git a/app/src/common/main.c b/app/src/common/main.c index c4de1750..d7eb28e6 100644 --- a/app/src/common/main.c +++ b/app/src/common/main.c @@ -1,43 +1,38 @@ /******************************************************************************* -* (c) 2016 Ledger -* (c) 2018 -2022 Zondax AG -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -********************************************************************************/ + * (c) 2016 Ledger + * (c) 2018 -2022 Zondax AG + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ********************************************************************************/ #include "app_main.h" #include "view.h" #include -__attribute__((section(".boot"))) int -main(void) { - // exit critical section - __asm volatile("cpsie i"); +__attribute__((section(".boot"))) int main(void) { + // exit critical section + __asm volatile("cpsie i"); - view_init(); - os_boot(); + view_init(); + os_boot(); - BEGIN_TRY - { - TRY - { - app_init(); - app_main(); - } - CATCH_OTHER(e) - {} - FINALLY - {} + BEGIN_TRY { + TRY { + app_init(); + app_main(); } - END_TRY; + CATCH_OTHER(e) {} + FINALLY {} + } + END_TRY; } diff --git a/app/src/common/tx.c b/app/src/common/tx.c index 07ec2fdb..cf1123f6 100644 --- a/app/src/common/tx.c +++ b/app/src/common/tx.c @@ -1,36 +1,37 @@ /******************************************************************************* -* (c) 2019 Zondax AG -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -********************************************************************************/ + * (c) 2019 Zondax AG + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ********************************************************************************/ #include "tx.h" #include "apdu_codes.h" #include "buffering.h" #include "parser.h" -#include #include "zxmacros.h" +#include // Ram uint8_t ram_buffer[RAM_BUFFER_SIZE]; // Flash typedef struct { - uint8_t buffer[FLASH_BUFFER_SIZE]; + uint8_t buffer[FLASH_BUFFER_SIZE]; } storage_t; -#if defined(TARGET_NANOS) || defined(TARGET_NANOX) || defined(TARGET_NANOS2) || defined(TARGET_STAX) -storage_t NV_CONST N_appdata_impl __attribute__ ((aligned(64))); +#if defined(TARGET_NANOS) || defined(TARGET_NANOX) || \ + defined(TARGET_NANOS2) || defined(TARGET_STAX) +storage_t NV_CONST N_appdata_impl __attribute__((aligned(64))); #define N_appdata (*(NV_VOLATILE storage_t *)PIC(&N_appdata_impl)) #endif @@ -38,87 +39,71 @@ static parser_tx_t tx_obj; static parser_context_t ctx_parsed_tx; void tx_initialize() { - buffering_init( - ram_buffer, - sizeof(ram_buffer), - (uint8_t *) N_appdata.buffer, - sizeof(N_appdata.buffer) - ); + buffering_init(ram_buffer, sizeof(ram_buffer), (uint8_t *)N_appdata.buffer, + sizeof(N_appdata.buffer)); } -void tx_reset() { - buffering_reset(); -} +void tx_reset() { buffering_reset(); } uint32_t tx_append(unsigned char *buffer, uint32_t length) { - return buffering_append(buffer, length); + return buffering_append(buffer, length); } -uint32_t tx_get_buffer_length() { - return buffering_get_buffer()->pos; -} +uint32_t tx_get_buffer_length() { return buffering_get_buffer()->pos; } -uint8_t *tx_get_buffer() { - return buffering_get_buffer()->data; -} +uint8_t *tx_get_buffer() { return buffering_get_buffer()->data; } const char *tx_parse() { - MEMZERO(&tx_obj, sizeof(tx_obj)); + MEMZERO(&tx_obj, sizeof(tx_obj)); - uint8_t err = parser_parse( - &ctx_parsed_tx, - tx_get_buffer(), - tx_get_buffer_length()); + uint8_t err = + parser_parse(&ctx_parsed_tx, tx_get_buffer(), tx_get_buffer_length()); - if (err != parser_ok) { - return parser_getErrorDescription(err); - } + if (err != parser_ok) { + return parser_getErrorDescription(err); + } - err = parser_validate(); - CHECK_APP_CANARY() + err = parser_validate(); + CHECK_APP_CANARY() - if (err != parser_ok) { - return parser_getErrorDescription(err); - } + if (err != parser_ok) { + return parser_getErrorDescription(err); + } - return NULL; + return NULL; } zxerr_t tx_getNumItems(uint8_t *num_items) { - parser_error_t err = parser_getNumItems(num_items); + parser_error_t err = parser_getNumItems(num_items); - if (err != parser_ok) { - return zxerr_no_data; - } + if (err != parser_ok) { + return zxerr_no_data; + } - return zxerr_ok; + return zxerr_ok; } -zxerr_t tx_getItem(int8_t displayIdx, - char *outKey, uint16_t outKeyLen, - char *outVal, uint16_t outValLen, - uint8_t pageIdx, uint8_t *pageCount) { - uint8_t numItems = 0; +zxerr_t tx_getItem(int8_t displayIdx, char *outKey, uint16_t outKeyLen, + char *outVal, uint16_t outValLen, uint8_t pageIdx, + uint8_t *pageCount) { + uint8_t numItems = 0; - CHECK_ZXERR(tx_getNumItems(&numItems)) + CHECK_ZXERR(tx_getNumItems(&numItems)) - if (displayIdx < 0 || displayIdx > numItems) { - return zxerr_no_data; - } + if (displayIdx < 0 || displayIdx > numItems) { + return zxerr_no_data; + } - parser_error_t err = parser_getItem(displayIdx, - outKey, outKeyLen, - outVal, outValLen, - pageIdx, pageCount); + parser_error_t err = parser_getItem(displayIdx, outKey, outKeyLen, outVal, + outValLen, pageIdx, pageCount); - // Convert error codes - if (err == parser_no_data || - err == parser_display_idx_out_of_range || - err == parser_display_page_out_of_range) - return zxerr_no_data; + // Convert error codes + if (err == parser_no_data || err == parser_display_idx_out_of_range || + err == parser_display_page_out_of_range) + return zxerr_no_data; - if (err != parser_ok) - return zxerr_unknown; + if (err != parser_ok) + return zxerr_unknown; - return zxerr_ok; + return zxerr_ok; } diff --git a/app/src/common/tx.h b/app/src/common/tx.h index e11f5098..7a501fcb 100644 --- a/app/src/common/tx.h +++ b/app/src/common/tx.h @@ -1,22 +1,22 @@ /******************************************************************************* -* (c) 2019 Zondax AG -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -********************************************************************************/ + * (c) 2019 Zondax AG + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ********************************************************************************/ #pragma once -#include "os.h" #include "coin.h" +#include "os.h" #include "zxerror.h" #if defined(TARGET_NANOX) || defined(TARGET_NANOS2) || defined(TARGET_STAX) @@ -56,7 +56,6 @@ const char *tx_parse(); zxerr_t tx_getNumItems(uint8_t *num_items); /// Gets an specific item from the transaction (including paging) -zxerr_t tx_getItem(int8_t displayIdx, - char *outKey, uint16_t outKeyLen, - char *outValue, uint16_t outValueLen, - uint8_t pageIdx, uint8_t *pageCount); +zxerr_t tx_getItem(int8_t displayIdx, char *outKey, uint16_t outKeyLen, + char *outValue, uint16_t outValueLen, uint8_t pageIdx, + uint8_t *pageCount); diff --git a/app/src/constants.h b/app/src/constants.h index 0ee15dfb..9d95186c 100644 --- a/app/src/constants.h +++ b/app/src/constants.h @@ -1,108 +1,107 @@ /******************************************************************************* -* (c) 2018 - 2022 Zondax AG -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -********************************************************************************/ + * (c) 2018 - 2022 Zondax AG + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ********************************************************************************/ #pragma once // CRYPTO File -#define CHECKSUM_LENGTH 4 - -#define SK_SECP256K1_SIZE 32 -#define PUB_KEY_SIZE 32 -#define DER_MAX_SIZE 73 -#define AK_SIZE 32 -#define NSK_SIZE 32 -#define ASK_SIZE 32 -#define DK_SIZE 32 -#define NK_SIZE 32 -#define ED25519_SK_SIZE 64 -#define IVK_SIZE 32 -#define ZIP32_SEED_SIZE 64 -#define ZIP32_PATH_SIZE 4 -#define RND_SIZE 32 -#define NULLIFIER_SIZE 32 -#define RK_SIZE 32 - -#define ESK_SIZE 32 -#define EPK_SIZE 32 -#define NOTE_POSITION_SIZE 8 -#define NOTE_COMMITMENT_SIZE 32 -#define VALUE_COMMITMENT_SIZE 32 -#define ANCHOR_SIZE 32 -#define HASH_SIZE 32 -#define SESSION_KEY_SIZE 32 -#define GD_SIZE 32 -#define SHARED_KEY_SIZE 32 -#define OUT_KEY_SIZE 32 -#define ENC_CIPHER_SIZE 64 -#define ENC_CIPHER_HALVE_SIZE 32 - -#define OUTPUT_ENC_MEMO_SIZE 564-52 -#define OUTPUT_ENC_AEAD_TAG_SIZE 580-564 -#define OUTPUT_OUT_SIZE 80 // OutputDescription, field out_ciphertext: [u8; 80], - -#define COMPACT_OUT_SIZE 53 -#define PRF_INPUT_SIZE 128 -#define MAX_SIZE 161 -#define SIG_R_SIZE 32 -#define SIG_S_SIZE 32 -#define SCRIPT_CONSTS_SIZE 4 -#define PEDERSEN_INPUT_SIZE 73 -#define CHACHA_NONCE_SIZE 12 - -#define MASK_HARDENED 0x80000000 - -#define VERSION_SIZE 2 -#define CHECKSUM_SIZE 4 -#define VERSION_P2SH 0x1CBD -#define VERSION_P2PKH 0x1CB8 -#define BECH32_HRP "zs" -#define BECH32_HRP_TEST "ztestsapling" - +#define CHECKSUM_LENGTH 4 + +#define SK_SECP256K1_SIZE 32 +#define PUB_KEY_SIZE 32 +#define DER_MAX_SIZE 73 +#define AK_SIZE 32 +#define NSK_SIZE 32 +#define ASK_SIZE 32 +#define DK_SIZE 32 +#define NK_SIZE 32 +#define ED25519_SK_SIZE 64 +#define IVK_SIZE 32 +#define ZIP32_SEED_SIZE 64 +#define ZIP32_PATH_SIZE 4 +#define RND_SIZE 32 +#define NULLIFIER_SIZE 32 +#define RK_SIZE 32 + +#define ESK_SIZE 32 +#define EPK_SIZE 32 +#define NOTE_POSITION_SIZE 8 +#define NOTE_COMMITMENT_SIZE 32 +#define VALUE_COMMITMENT_SIZE 32 +#define ANCHOR_SIZE 32 +#define HASH_SIZE 32 +#define SESSION_KEY_SIZE 32 +#define GD_SIZE 32 +#define SHARED_KEY_SIZE 32 +#define OUT_KEY_SIZE 32 +#define ENC_CIPHER_SIZE 64 +#define ENC_CIPHER_HALVE_SIZE 32 + +#define OUTPUT_ENC_MEMO_SIZE 564 - 52 +#define OUTPUT_ENC_AEAD_TAG_SIZE 580 - 564 +#define OUTPUT_OUT_SIZE 80 // OutputDescription, field out_ciphertext: [u8; 80], + +#define COMPACT_OUT_SIZE 53 +#define PRF_INPUT_SIZE 128 +#define MAX_SIZE 161 +#define SIG_R_SIZE 32 +#define SIG_S_SIZE 32 +#define SCRIPT_CONSTS_SIZE 4 +#define PEDERSEN_INPUT_SIZE 73 +#define CHACHA_NONCE_SIZE 12 + +#define MASK_HARDENED 0x80000000 + +#define VERSION_SIZE 2 +#define CHECKSUM_SIZE 4 +#define VERSION_P2SH 0x1CBD +#define VERSION_P2PKH 0x1CB8 +#define BECH32_HRP "zs" +#define BECH32_HRP_TEST "ztestsapling" // NVDATA File -//fixme: maybe increase some of these -#define T_IN_LIST_SIZE 5 -#define T_OUT_LIST_SIZE 5 -#define SPEND_LIST_SIZE 5 -#define OUTPUT_LIST_SIZE 5 - -#define PREVOUT_SIZE 36 -#define SEQUENCE_SIZE 4 -#define T_OUTPUT_SIZE 34 // script size (26) + value size (uint64_t -> 8) - -#define PKD_SIZE 32 -#define RCM_SIZE 32 -#define ALPHA_SIZE 32 -#define DIV_SIZE 11 -#define DIV_INDEX_SIZE 11 -#define DIV_LIST_LENGTH 20 -#define DIV_DEFAULT_LIST_LEN 4 -#define MAX_SIZE_BUF_ADDR 143 - -#define SESSION_KEY_SIZE 32 - -#define OVK_SIZE 32 -#define OVK_SET_SIZE 1 + OVK_SIZE -#define RSEED_SIZE 32 -#define RCM_V_SIZE 32 - -#define SCRIPT_SIZE 26 -#define PATH_SIZE 5 - -#define SIGNATURE_SIZE SIG_R_SIZE + SIG_S_SIZE - -#define TX_VERSION_SAPLING 4 -#define TX_VERSION_NU5 5 +// fixme: maybe increase some of these +#define T_IN_LIST_SIZE 5 +#define T_OUT_LIST_SIZE 5 +#define SPEND_LIST_SIZE 5 +#define OUTPUT_LIST_SIZE 5 + +#define PREVOUT_SIZE 36 +#define SEQUENCE_SIZE 4 +#define T_OUTPUT_SIZE 34 // script size (26) + value size (uint64_t -> 8) + +#define PKD_SIZE 32 +#define RCM_SIZE 32 +#define ALPHA_SIZE 32 +#define DIV_SIZE 11 +#define DIV_INDEX_SIZE 11 +#define DIV_LIST_LENGTH 20 +#define DIV_DEFAULT_LIST_LEN 4 +#define MAX_SIZE_BUF_ADDR 143 + +#define SESSION_KEY_SIZE 32 + +#define OVK_SIZE 32 +#define OVK_SET_SIZE 1 + OVK_SIZE +#define RSEED_SIZE 32 +#define RCM_V_SIZE 32 + +#define SCRIPT_SIZE 26 +#define PATH_SIZE 5 + +#define SIGNATURE_SIZE SIG_R_SIZE + SIG_S_SIZE + +#define TX_VERSION_SAPLING 4 +#define TX_VERSION_NU5 5 diff --git a/app/src/crypto.c b/app/src/crypto.c index cce9ae57..543d55d3 100644 --- a/app/src/crypto.c +++ b/app/src/crypto.c @@ -1,1487 +1,1616 @@ /******************************************************************************* -* (c) 2018 -2022 Zondax AG -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -********************************************************************************/ + * (c) 2018 -2022 Zondax AG + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ********************************************************************************/ #include "crypto.h" -#include "constants.h" -#include "coin.h" -#include "zxformat.h" -#include "zxmacros.h" #include "base58.h" -#include "rslib.h" #include "bech32.h" +#include "chacha.h" +#include "coin.h" +#include "constants.h" +#include "index_NU5.h" +#include "index_sapling.h" +#include "lcx_ripemd160.h" #include "nvdata.h" +#include "parser_common.h" +#include "parser_impl.h" +#include "rslib.h" #include "sighash.h" #include "txid.h" -#include "index_sapling.h" -#include "index_NU5.h" -#include "parser_impl.h" -#include "parser_common.h" -#include "chacha.h" -#include "lcx_ripemd160.h" +#include "zxformat.h" +#include "zxmacros.h" uint32_t hdPath[HDPATH_LEN_DEFAULT]; -#define CHECK_ZXERROR_AND_CLEAN(CALL) \ - do { \ - zxerr_t __zxerror = CALL; \ - if (__zxerror != zxerr_ok) { \ - MEMZERO(&tmp, sizeof(tmp)); \ - MEMZERO(buffer, bufferLen); \ - return __zxerror; \ - } \ +#define CHECK_ZXERROR_AND_CLEAN(CALL) \ + do { \ + zxerr_t __zxerror = CALL; \ + if (__zxerror != zxerr_ok) { \ + MEMZERO(&tmp, sizeof(tmp)); \ + MEMZERO(buffer, bufferLen); \ + return __zxerror; \ + } \ } while (0); typedef enum { - EXTRACT_SAPLING_E0 = 0xE0, - EXTRACT_SAPLING_E1 = 0xE1, - EXTRACT_SAPLING_E2 = 0xE2, - EXTRACT_SAPLING_E3 = 0xE3, - EXTRACT_SAPLING_E4 = 0xE4, - EXTRACT_SAPLING_E5 = 0xE5, - EXTRACT_SAPLING_E6 = 0xE6, - EXTRACT_SAPLING_E7 = 0xE7, - EXTRACT_SAPLING_E8 = 0xE8, - EXTRACT_SAPLING_E9 = 0xE9, - EXTRACT_SAPLING_EA = 0xEA, - EXTRACT_SAPLING_EB = 0xEB, - EXTRACT_SAPLING_EC = 0xEC, - EXTRACT_SAPLING_ED = 0xED, + EXTRACT_SAPLING_E0 = 0xE0, + EXTRACT_SAPLING_E1 = 0xE1, + EXTRACT_SAPLING_E2 = 0xE2, + EXTRACT_SAPLING_E3 = 0xE3, + EXTRACT_SAPLING_E4 = 0xE4, + EXTRACT_SAPLING_E5 = 0xE5, + EXTRACT_SAPLING_E6 = 0xE6, + EXTRACT_SAPLING_E7 = 0xE7, + EXTRACT_SAPLING_E8 = 0xE8, + EXTRACT_SAPLING_E9 = 0xE9, + EXTRACT_SAPLING_EA = 0xEA, + EXTRACT_SAPLING_EB = 0xEB, + EXTRACT_SAPLING_EC = 0xEC, + EXTRACT_SAPLING_ED = 0xED, } extract_sapling_e; #include "cx.h" typedef struct { - uint8_t publicKey[PK_LEN_SECP256K1]; - uint8_t address[50]; + uint8_t publicKey[PK_LEN_SECP256K1]; + uint8_t address[50]; } __attribute__((packed)) answer_t; void ripemd160(uint8_t *in, uint16_t inLen, uint8_t *out) { - cx_ripemd160_t rip160; - cx_ripemd160_init(&rip160); - cx_hash_no_throw(&rip160.header, CX_LAST, in, inLen, out, CX_RIPEMD160_SIZE); + cx_ripemd160_t rip160; + cx_ripemd160_init(&rip160); + cx_hash_no_throw(&rip160.header, CX_LAST, in, inLen, out, CX_RIPEMD160_SIZE); } // According to 5.6 Encodings of Addresses and Keys typedef struct { - // [ADDRESS ] - // [EXTENDED RIPEMD-160][Checksum 4-bytes] - // [EXTENDED RIPEMD-160][Checksum-------------------------] - // [version][RIPEMD-160] - union { - uint8_t address[VERSION_SIZE + CX_RIPEMD160_SIZE + CHECKSUM_SIZE]; - - struct { - uint8_t extended_ripe[VERSION_SIZE + CX_RIPEMD160_SIZE]; - uint8_t sha256_checksum[CX_SHA256_SIZE]; - }; - - union { - // [EXTENDED RIPEMD-160] - // [version][RIPEMD-160] - struct { - uint8_t version[VERSION_SIZE]; - uint8_t ripe_sha256_pk[CX_RIPEMD160_SIZE]; - }; - }; + // [ADDRESS ] + // [EXTENDED RIPEMD-160][Checksum 4-bytes] + // [EXTENDED RIPEMD-160][Checksum-------------------------] + // [version][RIPEMD-160] + union { + uint8_t address[VERSION_SIZE + CX_RIPEMD160_SIZE + CHECKSUM_SIZE]; + + struct { + uint8_t extended_ripe[VERSION_SIZE + CX_RIPEMD160_SIZE]; + uint8_t sha256_checksum[CX_SHA256_SIZE]; }; - // Temporary buffers union { - uint8_t sha256_pk[CX_SHA256_SIZE]; - uint8_t sha256_extended_ripe[CX_SHA256_SIZE]; + // [EXTENDED RIPEMD-160] + // [version][RIPEMD-160] + struct { + uint8_t version[VERSION_SIZE]; + uint8_t ripe_sha256_pk[CX_RIPEMD160_SIZE]; + }; }; -} __attribute__((packed)) address_temp_t; + }; + // Temporary buffers + union { + uint8_t sha256_pk[CX_SHA256_SIZE]; + uint8_t sha256_extended_ripe[CX_SHA256_SIZE]; + }; +} __attribute__((packed)) address_temp_t; static zxerr_t crypto_extractPublicKey(uint8_t *pubKey, uint16_t pubKeyLen) { - if (pubKey == NULL || pubKeyLen < PK_LEN_SECP256K1) { - return zxerr_invalid_crypto_settings; - } - - cx_ecfp_public_key_t cx_publicKey = {0}; - cx_ecfp_private_key_t cx_privateKey = {0}; - uint8_t privateKeyData[64] = {0}; - - zxerr_t error = zxerr_unknown; - CATCH_CXERROR(os_derive_bip32_no_throw(CX_CURVE_256K1, - hdPath, - HDPATH_LEN_DEFAULT, - privateKeyData, NULL)) - - CATCH_CXERROR(cx_ecfp_init_private_key_no_throw(CX_CURVE_256K1, privateKeyData, SK_SECP256K1_SIZE, &cx_privateKey)) - CATCH_CXERROR(cx_ecfp_init_public_key_no_throw(CX_CURVE_256K1, NULL, 0, &cx_publicKey)) - CATCH_CXERROR(cx_ecfp_generate_pair_no_throw(CX_CURVE_256K1, &cx_publicKey, &cx_privateKey, 1)) - - // Format pubkey - for (int i = 0; i < PUB_KEY_SIZE; i++) { - pubKey[i] = cx_publicKey.W[64 - i]; - } - cx_publicKey.W[0] = cx_publicKey.W[64] & 1 ? 0x03 : 0x02; // "Compress" public key in place - if ((cx_publicKey.W[PUB_KEY_SIZE] & 1) != 0) { - pubKey[PUB_KEY_SIZE - 1] |= 0x80; - } - memcpy(pubKey, cx_publicKey.W, PK_LEN_SECP256K1); - error = zxerr_ok; + if (pubKey == NULL || pubKeyLen < PK_LEN_SECP256K1) { + return zxerr_invalid_crypto_settings; + } + + cx_ecfp_public_key_t cx_publicKey = {0}; + cx_ecfp_private_key_t cx_privateKey = {0}; + uint8_t privateKeyData[64] = {0}; + + zxerr_t error = zxerr_unknown; + CATCH_CXERROR(os_derive_bip32_no_throw( + CX_CURVE_256K1, hdPath, HDPATH_LEN_DEFAULT, privateKeyData, NULL)) + + CATCH_CXERROR(cx_ecfp_init_private_key_no_throw( + CX_CURVE_256K1, privateKeyData, SK_SECP256K1_SIZE, &cx_privateKey)) + CATCH_CXERROR( + cx_ecfp_init_public_key_no_throw(CX_CURVE_256K1, NULL, 0, &cx_publicKey)) + CATCH_CXERROR(cx_ecfp_generate_pair_no_throw(CX_CURVE_256K1, &cx_publicKey, + &cx_privateKey, 1)) + + // Format pubkey + for (int i = 0; i < PUB_KEY_SIZE; i++) { + pubKey[i] = cx_publicKey.W[64 - i]; + } + cx_publicKey.W[0] = + cx_publicKey.W[64] & 1 ? 0x03 : 0x02; // "Compress" public key in place + if ((cx_publicKey.W[PUB_KEY_SIZE] & 1) != 0) { + pubKey[PUB_KEY_SIZE - 1] |= 0x80; + } + memcpy(pubKey, cx_publicKey.W, PK_LEN_SECP256K1); + error = zxerr_ok; catch_cx_error: - MEMZERO(&cx_privateKey, sizeof(cx_privateKey)); - MEMZERO(privateKeyData, sizeof(privateKeyData)); + MEMZERO(&cx_privateKey, sizeof(cx_privateKey)); + MEMZERO(privateKeyData, sizeof(privateKeyData)); - if (error != zxerr_ok) { - MEMZERO(pubKey, pubKeyLen); - } + if (error != zxerr_ok) { + MEMZERO(pubKey, pubKeyLen); + } - return error; + return error; } // handleGetAddrSecp256K1 -zxerr_t crypto_fillAddress_secp256k1(uint8_t *buffer, uint16_t buffer_len, uint16_t *replyLen) { - if (buffer_len < sizeof(answer_t)) { - return zxerr_unknown; - } - - zemu_log_stack("crypto_fillAddress_secp256k1"); - - *replyLen = 0; - MEMZERO(buffer, buffer_len); - answer_t *const answer = (answer_t *) buffer; - - CHECK_ZXERR(crypto_extractPublicKey(answer->publicKey, sizeof_field(answer_t, publicKey))); - - address_temp_t address_temp; - - // extended-ripemd-160 = [version][ripemd-160(sha256(pk))] - address_temp.version[0] = VERSION_P2PKH >> 8; - address_temp.version[1] = VERSION_P2PKH & 0xFF; - cx_hash_sha256(answer->publicKey, PK_LEN_SECP256K1, address_temp.sha256_pk, CX_SHA256_SIZE); // SHA256 - ripemd160(address_temp.sha256_pk, CX_SHA256_SIZE, address_temp.ripe_sha256_pk); // RIPEMD-160 - - // checksum = sha256(sha256(extended-ripe)) - cx_hash_sha256(address_temp.extended_ripe, CX_RIPEMD160_SIZE + VERSION_SIZE, address_temp.sha256_extended_ripe, CX_SHA256_SIZE); - cx_hash_sha256(address_temp.sha256_extended_ripe, CX_SHA256_SIZE, address_temp.sha256_checksum, CX_SHA256_SIZE); - - // 7. 25 bytes BTC address = [extended ripemd-160][checksum] - // Encode as base58 - size_t outLen = sizeof_field(answer_t, address); - int err = encode_base58(address_temp.address, VERSION_SIZE + CX_RIPEMD160_SIZE + CHECKSUM_SIZE, answer->address, &outLen); - if(err != 0){ - return zxerr_unknown; - } - *replyLen = PK_LEN_SECP256K1 + outLen; - return zxerr_ok; +zxerr_t crypto_fillAddress_secp256k1(uint8_t *buffer, uint16_t buffer_len, + uint16_t *replyLen) { + if (buffer_len < sizeof(answer_t)) { + return zxerr_unknown; + } + + zemu_log_stack("crypto_fillAddress_secp256k1"); + + *replyLen = 0; + MEMZERO(buffer, buffer_len); + answer_t *const answer = (answer_t *)buffer; + + CHECK_ZXERR(crypto_extractPublicKey(answer->publicKey, + sizeof_field(answer_t, publicKey))); + + address_temp_t address_temp; + + // extended-ripemd-160 = [version][ripemd-160(sha256(pk))] + address_temp.version[0] = VERSION_P2PKH >> 8; + address_temp.version[1] = VERSION_P2PKH & 0xFF; + cx_hash_sha256(answer->publicKey, PK_LEN_SECP256K1, address_temp.sha256_pk, + CX_SHA256_SIZE); // SHA256 + ripemd160(address_temp.sha256_pk, CX_SHA256_SIZE, + address_temp.ripe_sha256_pk); // RIPEMD-160 + + // checksum = sha256(sha256(extended-ripe)) + cx_hash_sha256(address_temp.extended_ripe, CX_RIPEMD160_SIZE + VERSION_SIZE, + address_temp.sha256_extended_ripe, CX_SHA256_SIZE); + cx_hash_sha256(address_temp.sha256_extended_ripe, CX_SHA256_SIZE, + address_temp.sha256_checksum, CX_SHA256_SIZE); + + // 7. 25 bytes BTC address = [extended ripemd-160][checksum] + // Encode as base58 + size_t outLen = sizeof_field(answer_t, address); + int err = encode_base58(address_temp.address, + VERSION_SIZE + CX_RIPEMD160_SIZE + CHECKSUM_SIZE, + answer->address, &outLen); + if (err != 0) { + return zxerr_unknown; + } + *replyLen = PK_LEN_SECP256K1 + outLen; + return zxerr_ok; } zxerr_t crypto_fillSaplingSeed(uint8_t *sk) { - zemu_log_stack("crypto_fillSaplingSeed"); - - // Generate randomness using a fixed path related to the device mnemonic - const uint32_t path[HDPATH_LEN_DEFAULT] = { - 0x8000002c, - 0x80000085, - MASK_HARDENED, - MASK_HARDENED, - MASK_HARDENED, - }; - MEMZERO(sk, ED25519_SK_SIZE); + zemu_log_stack("crypto_fillSaplingSeed"); + + // Generate randomness using a fixed path related to the device mnemonic + const uint32_t path[HDPATH_LEN_DEFAULT] = { + 0x8000002c, 0x80000085, MASK_HARDENED, MASK_HARDENED, MASK_HARDENED, + }; + MEMZERO(sk, ED25519_SK_SIZE); - zxerr_t error = zxerr_unknown; - CATCH_CXERROR(os_derive_bip32_with_seed_no_throw(HDW_NORMAL, CX_CURVE_Ed25519, - path, HDPATH_LEN_DEFAULT, - sk, - NULL, - NULL, 0)) - error = zxerr_ok; + zxerr_t error = zxerr_unknown; + CATCH_CXERROR(os_derive_bip32_with_seed_no_throw(HDW_NORMAL, CX_CURVE_Ed25519, + path, HDPATH_LEN_DEFAULT, sk, + NULL, NULL, 0)) + error = zxerr_ok; catch_cx_error: - if (error != zxerr_ok) { - MEMZERO(sk, 64); - } + if (error != zxerr_ok) { + MEMZERO(sk, 64); + } - return error; + return error; } // handleInitTX step 1/2 -zxerr_t crypto_extracttx_sapling(uint8_t *buffer, uint16_t bufferLen, const uint8_t *txdata, const uint16_t txdatalen) { - zemu_log_stack("crypto_extracttx_sapling"); - MEMZERO(buffer, bufferLen); - uint8_t t_in_len = *txdata; - uint8_t t_out_len = *(txdata + 1); - uint8_t spend_len = *(txdata + 2); - uint8_t output_len = *(txdata + 3); - - transaction_reset(); +zxerr_t crypto_extracttx_sapling(uint8_t *buffer, uint16_t bufferLen, + const uint8_t *txdata, + const uint16_t txdatalen) { + zemu_log_stack("crypto_extracttx_sapling"); + MEMZERO(buffer, bufferLen); + uint8_t t_in_len = *txdata; + uint8_t t_out_len = *(txdata + 1); + uint8_t spend_len = *(txdata + 2); + uint8_t output_len = *(txdata + 3); + + transaction_reset(); + + if ((spend_len > 0 && output_len < 2) || + (spend_len == 0 && output_len == 1)) { + return (zxerr_t)EXTRACT_SAPLING_E0; + } + + if (txdatalen < 4 || txdatalen - 4 != t_in_len * T_IN_INPUT_LEN + + t_out_len * T_OUT_INPUT_LEN + + spend_len * SPEND_INPUT_LEN + + output_len * OUTPUT_INPUT_LEN) { + return (zxerr_t)EXTRACT_SAPLING_E1; + } + + if (t_in_len == 0 && t_out_len == 0 && spend_len == 0 && output_len == 0) { + return (zxerr_t)EXTRACT_SAPLING_E2; + } + + uint8_t *start = (uint8_t *)txdata; + start += 4; + + parser_context_t pars_ctx; + parser_error_t pars_err; + + for (int i = 0; i < t_in_len; i++) { + uint32_t *path = (uint32_t *)(start + INDEX_INPUT_TIN_PATH); + uint8_t *script = (uint8_t *)(start + INDEX_INPUT_TIN_SCRIPT); - if ((spend_len > 0 && output_len < 2) || (spend_len == 0 && output_len == 1)) { - return (zxerr_t) EXTRACT_SAPLING_E0; + pars_ctx.offset = 0; + pars_ctx.buffer = start + INDEX_INPUT_TIN_VALUE; + pars_ctx.bufferLen = 8; + uint64_t v = 0; + pars_err = _readUInt64(&pars_ctx, &v); + if (pars_err != parser_ok) { + return (zxerr_t)EXTRACT_SAPLING_E3; } - - if (txdatalen < 4 || txdatalen - 4 != - t_in_len * T_IN_INPUT_LEN + t_out_len * T_OUT_INPUT_LEN + spend_len * SPEND_INPUT_LEN + - output_len * OUTPUT_INPUT_LEN) { - return (zxerr_t) EXTRACT_SAPLING_E1; + zxerr_t err = t_inlist_append_item(path, script, v); + if (err != zxerr_ok) { + return (zxerr_t)EXTRACT_SAPLING_E4; } + start += T_IN_INPUT_LEN; + } - if (t_in_len == 0 && t_out_len == 0 && spend_len == 0 && output_len == 0) { - return (zxerr_t) EXTRACT_SAPLING_E2; + for (int i = 0; i < t_out_len; i++) { + uint8_t *addr = (uint8_t *)(start + INDEX_INPUT_TOUT_ADDR); + pars_ctx.offset = 0; + pars_ctx.buffer = start + INDEX_INPUT_TOUT_VALUE; + pars_ctx.bufferLen = 8; + uint64_t v = 0; + pars_err = _readUInt64(&pars_ctx, &v); + if (pars_err != parser_ok) { + return (zxerr_t)EXTRACT_SAPLING_E5; } - - uint8_t *start = (uint8_t *) txdata; - start += 4; - - parser_context_t pars_ctx; - parser_error_t pars_err; - - for (int i = 0; i < t_in_len; i++) { - uint32_t *path = (uint32_t * )(start + INDEX_INPUT_TIN_PATH); - uint8_t *script = (uint8_t * )(start + INDEX_INPUT_TIN_SCRIPT); - - pars_ctx.offset = 0; - pars_ctx.buffer = start + INDEX_INPUT_TIN_VALUE; - pars_ctx.bufferLen = 8; - uint64_t v = 0; - pars_err = _readUInt64(&pars_ctx, &v); - if (pars_err != parser_ok) { - return (zxerr_t) EXTRACT_SAPLING_E3; - } - zxerr_t err = t_inlist_append_item(path, script, v); - if (err != zxerr_ok) { - return (zxerr_t) EXTRACT_SAPLING_E4; - } - start += T_IN_INPUT_LEN; + zxerr_t err = t_outlist_append_item(addr, v); + if (err != zxerr_ok) { + return (zxerr_t)EXTRACT_SAPLING_E6; } + start += T_OUT_INPUT_LEN; + } - for (int i = 0; i < t_out_len; i++) { - uint8_t *addr = (uint8_t * )(start + INDEX_INPUT_TOUT_ADDR); - pars_ctx.offset = 0; - pars_ctx.buffer = start + INDEX_INPUT_TOUT_VALUE; - pars_ctx.bufferLen = 8; - uint64_t v = 0; - pars_err = _readUInt64(&pars_ctx, &v); - if (pars_err != parser_ok) { - return (zxerr_t) EXTRACT_SAPLING_E5; - } - zxerr_t err = t_outlist_append_item(addr, v); - if (err != zxerr_ok) { - return (zxerr_t) EXTRACT_SAPLING_E6; - } - start += T_OUT_INPUT_LEN; + for (int i = 0; i < spend_len; i++) { + pars_ctx.offset = 0; + pars_ctx.buffer = start + INDEX_INPUT_SPENDPOS; + pars_ctx.bufferLen = 4; + uint32_t p = 0; + pars_err = _readUInt32(&pars_ctx, &p); + if (pars_err != parser_ok) { + return (zxerr_t)EXTRACT_SAPLING_E7; } - for (int i = 0; i < spend_len; i++) { - pars_ctx.offset = 0; - pars_ctx.buffer = start + INDEX_INPUT_SPENDPOS; - pars_ctx.bufferLen = 4; - uint32_t p = 0; - pars_err = _readUInt32(&pars_ctx, &p); - if (pars_err != parser_ok) { - return (zxerr_t) EXTRACT_SAPLING_E7; - } - - pars_ctx.offset = 0; - pars_ctx.buffer = start + INDEX_INPUT_INPUTVALUE; - pars_ctx.bufferLen = 8; - uint64_t v = 0; - pars_err = _readUInt64(&pars_ctx, &v); - if (pars_err != parser_ok) { - return (zxerr_t) EXTRACT_SAPLING_E8; - } - - uint8_t *div = start + INDEX_INPUT_INPUTDIV; - uint8_t *pkd = start + INDEX_INPUT_INPUTPKD; - uint8_t rnd1[RND_SIZE]; - uint8_t rnd2[RND_SIZE]; - random_fr(rnd1); - random_fr(rnd2); - - zxerr_t err = spendlist_append_item(p, v, div, pkd, rnd1, rnd2); - if (err != zxerr_ok) { - return (zxerr_t) EXTRACT_SAPLING_E9; - } - start += SPEND_INPUT_LEN; + pars_ctx.offset = 0; + pars_ctx.buffer = start + INDEX_INPUT_INPUTVALUE; + pars_ctx.bufferLen = 8; + uint64_t v = 0; + pars_err = _readUInt64(&pars_ctx, &v); + if (pars_err != parser_ok) { + return (zxerr_t)EXTRACT_SAPLING_E8; } - for (int i = 0; i < output_len; i++) { - uint8_t *div = start + INDEX_INPUT_OUTPUTDIV; - uint8_t *pkd = start + INDEX_INPUT_OUTPUTPKD; - - pars_ctx.offset = 0; - pars_ctx.buffer = start + INDEX_INPUT_OUTPUTVALUE; - pars_ctx.bufferLen = 8; - uint64_t v = 0; - pars_err = _readUInt64(&pars_ctx, &v); - if (pars_err != parser_ok) { - return (zxerr_t) EXTRACT_SAPLING_EA; - } - - uint8_t *memotype = start + INDEX_INPUT_OUTPUTMEMO; - uint8_t *ovk = start + INDEX_INPUT_OUTPUTOVK; - if (ovk[0] != 0x00 && ovk[0] != 0x01) { - return (zxerr_t) EXTRACT_SAPLING_EB; - } - uint8_t hash_seed[OVK_SET_SIZE]; - if (ovk[0] == 0x00) { - MEMZERO(hash_seed, OVK_SET_SIZE); - cx_rng(hash_seed + 1, OVK_SIZE); - ovk = hash_seed; - } - - uint8_t rnd1[RND_SIZE]; - uint8_t rnd2[RND_SIZE]; - random_fr(rnd1); - cx_rng(rnd2, RND_SIZE); - zxerr_t err = outputlist_append_item(div, pkd, v, *memotype, ovk, rnd1, rnd2); - if (err != zxerr_ok) { - return (zxerr_t) EXTRACT_SAPLING_EC; - } - start += OUTPUT_INPUT_LEN; - } + uint8_t *div = start + INDEX_INPUT_INPUTDIV; + uint8_t *pkd = start + INDEX_INPUT_INPUTPKD; + uint8_t rnd1[RND_SIZE]; + uint8_t rnd2[RND_SIZE]; + random_fr(rnd1); + random_fr(rnd2); - uint64_t value_flash = get_totalvalue(); - if (value_flash != 1000) { - return (zxerr_t) EXTRACT_SAPLING_ED; + zxerr_t err = spendlist_append_item(p, v, div, pkd, rnd1, rnd2); + if (err != zxerr_ok) { + return (zxerr_t)EXTRACT_SAPLING_E9; } + start += SPEND_INPUT_LEN; + } - if (spend_len > 0) { - set_state(STATE_PROCESSED_INPUTS); //need both spend info and output info (as spend > 0 => output >= 2) - } else if (output_len > 0) { - set_state(STATE_PROCESSED_SPEND_EXTRACTIONS); //we can have shielded outputs only - } else { - set_state(STATE_PROCESSED_ALL_EXTRACTIONS); //We can have transparent inputs/outputs only - } + for (int i = 0; i < output_len; i++) { + uint8_t *div = start + INDEX_INPUT_OUTPUTDIV; + uint8_t *pkd = start + INDEX_INPUT_OUTPUTPKD; - return zxerr_ok; //some code for all_good + pars_ctx.offset = 0; + pars_ctx.buffer = start + INDEX_INPUT_OUTPUTVALUE; + pars_ctx.bufferLen = 8; + uint64_t v = 0; + pars_err = _readUInt64(&pars_ctx, &v); + if (pars_err != parser_ok) { + return (zxerr_t)EXTRACT_SAPLING_EA; + } + + uint8_t *memotype = start + INDEX_INPUT_OUTPUTMEMO; + uint8_t *ovk = start + INDEX_INPUT_OUTPUTOVK; + if (ovk[0] != 0x00 && ovk[0] != 0x01) { + return (zxerr_t)EXTRACT_SAPLING_EB; + } + uint8_t hash_seed[OVK_SET_SIZE]; + if (ovk[0] == 0x00) { + MEMZERO(hash_seed, OVK_SET_SIZE); + cx_rng(hash_seed + 1, OVK_SIZE); + ovk = hash_seed; + } + + uint8_t rnd1[RND_SIZE]; + uint8_t rnd2[RND_SIZE]; + random_fr(rnd1); + cx_rng(rnd2, RND_SIZE); + zxerr_t err = + outputlist_append_item(div, pkd, v, *memotype, ovk, rnd1, rnd2); + if (err != zxerr_ok) { + return (zxerr_t)EXTRACT_SAPLING_EC; + } + start += OUTPUT_INPUT_LEN; + } + + uint64_t value_flash = get_totalvalue(); + if (value_flash != 1000) { + return (zxerr_t)EXTRACT_SAPLING_ED; + } + + if (spend_len > 0) { + set_state(STATE_PROCESSED_INPUTS); // need both spend info and output info + // (as spend > 0 => output >= 2) + } else if (output_len > 0) { + set_state( + STATE_PROCESSED_SPEND_EXTRACTIONS); // we can have shielded outputs only + } else { + set_state(STATE_PROCESSED_ALL_EXTRACTIONS); // We can have transparent + // inputs/outputs only + } + + return zxerr_ok; // some code for all_good } - typedef struct { - union { - // STEP 1 - struct { - uint8_t zip32_seed[ZIP32_SEED_SIZE]; - uint8_t sk[ED25519_SK_SIZE]; - } step1; - - struct { - uint8_t ask[ASK_SIZE]; - uint8_t nsk[NSK_SIZE]; - } step2; - }; + union { + // STEP 1 + struct { + uint8_t zip32_seed[ZIP32_SEED_SIZE]; + uint8_t sk[ED25519_SK_SIZE]; + } step1; + + struct { + uint8_t ask[ASK_SIZE]; + uint8_t nsk[NSK_SIZE]; + } step2; + }; } tmp_spendinfo_s; // handleExtractSpendData -zxerr_t crypto_extract_spend_proofkeyandrnd(uint8_t *buffer, uint16_t bufferLen){ - if(!spendlist_more_extract()){ - return zxerr_unknown; - } +zxerr_t crypto_extract_spend_proofkeyandrnd(uint8_t *buffer, + uint16_t bufferLen) { + if (!spendlist_more_extract()) { + return zxerr_unknown; + } - if(get_state() != STATE_PROCESSED_INPUTS){ - return zxerr_unknown; - } + if (get_state() != STATE_PROCESSED_INPUTS) { + return zxerr_unknown; + } - uint8_t *out = (uint8_t *) buffer; - MEMZERO(out, bufferLen); + uint8_t *out = (uint8_t *)buffer; + MEMZERO(out, bufferLen); - const spend_item_t *next = spendlist_extract_next(); - if (next == NULL){ - return zxerr_unknown; - } + const spend_item_t *next = spendlist_extract_next(); + if (next == NULL) { + return zxerr_unknown; + } - tmp_spendinfo_s tmp = {0}; + tmp_spendinfo_s tmp = {0}; - CHECK_ZXERROR_AND_CLEAN(crypto_fillSaplingSeed(tmp.step1.zip32_seed)) - CHECK_APP_CANARY() + CHECK_ZXERROR_AND_CLEAN(crypto_fillSaplingSeed(tmp.step1.zip32_seed)) + CHECK_APP_CANARY() - // Gets ak and nsk - zip32_child_proof_key(tmp.step1.zip32_seed, out, out + AK_SIZE, next->path); - CHECK_APP_CANARY() + // Gets ak and nsk + zip32_child_proof_key(tmp.step1.zip32_seed, out, out + AK_SIZE, next->path); + CHECK_APP_CANARY() - MEMZERO(&tmp, sizeof(tmp_spendinfo_s)); + MEMZERO(&tmp, sizeof(tmp_spendinfo_s)); - MEMCPY(out+AK_SIZE+NSK_SIZE, next->rcmvalue, RCM_SIZE); - MEMCPY(out+AK_SIZE+NSK_SIZE+RCM_SIZE, next->alpha,ALPHA_SIZE); + MEMCPY(out + AK_SIZE + NSK_SIZE, next->rcmvalue, RCM_SIZE); + MEMCPY(out + AK_SIZE + NSK_SIZE + RCM_SIZE, next->alpha, ALPHA_SIZE); - if(!spendlist_more_extract()){ - set_state(STATE_PROCESSED_SPEND_EXTRACTIONS); - } + if (!spendlist_more_extract()) { + set_state(STATE_PROCESSED_SPEND_EXTRACTIONS); + } - return zxerr_ok; + return zxerr_ok; } // handleExtractOutputData -zxerr_t crypto_extract_output_rnd(uint8_t *buffer, uint16_t bufferLen, uint16_t *replyLen){ - if(!outputlist_more_extract()){ - return zxerr_unknown; - } - - if(get_state() != STATE_PROCESSED_SPEND_EXTRACTIONS){ - return zxerr_unknown; - } - - uint8_t *out = (uint8_t *) buffer; - MEMZERO(out, bufferLen); - - const output_item_t *next = outputlist_extract_next(); - if (next == NULL){ - return zxerr_unknown; - } - MEMCPY(out, next->rcmvalue, RCM_V_SIZE); - MEMCPY(out+RCM_V_SIZE, next->rseed, RSEED_SIZE); - - if(next->ovk[0] == 0x00){ - MEMCPY(out+RCM_V_SIZE + RSEED_SIZE, next->ovk + 1, OVK_SIZE); - *replyLen = RCM_V_SIZE + RSEED_SIZE + OVK_SIZE; - }else{ - *replyLen = RCM_V_SIZE + RSEED_SIZE; - } - - if(!outputlist_more_extract()){ - set_state(STATE_PROCESSED_ALL_EXTRACTIONS); - } - return zxerr_ok; +zxerr_t crypto_extract_output_rnd(uint8_t *buffer, uint16_t bufferLen, + uint16_t *replyLen) { + if (!outputlist_more_extract()) { + return zxerr_unknown; + } + + if (get_state() != STATE_PROCESSED_SPEND_EXTRACTIONS) { + return zxerr_unknown; + } + + uint8_t *out = (uint8_t *)buffer; + MEMZERO(out, bufferLen); + + const output_item_t *next = outputlist_extract_next(); + if (next == NULL) { + return zxerr_unknown; + } + MEMCPY(out, next->rcmvalue, RCM_V_SIZE); + MEMCPY(out + RCM_V_SIZE, next->rseed, RSEED_SIZE); + + if (next->ovk[0] == 0x00) { + MEMCPY(out + RCM_V_SIZE + RSEED_SIZE, next->ovk + 1, OVK_SIZE); + *replyLen = RCM_V_SIZE + RSEED_SIZE + OVK_SIZE; + } else { + *replyLen = RCM_V_SIZE + RSEED_SIZE; + } + + if (!outputlist_more_extract()) { + set_state(STATE_PROCESSED_ALL_EXTRACTIONS); + } + return zxerr_ok; } // handleCheckandSign step 1/11 -zxerr_t crypto_check_prevouts(uint8_t *buffer, uint16_t bufferLen, const uint8_t *txdata, const uint8_t tx_version){ - zemu_log_stack("crypto_check_prevouts"); - MEMZERO(buffer, bufferLen); - - if(get_state() != STATE_CHECKING_ALL_TXDATA){ - return zxerr_unknown; - } - - uint8_t hash[HASH_SIZE] = {0}; - size_t prevouts_hash_offset = 0; - if (tx_version == TX_VERSION_SAPLING) { - sapling_transparent_prevouts_hash(txdata, hash); - prevouts_hash_offset = SAPLING_INDEX_HASH_PREVOUTSHASH; - } else if (tx_version == TX_VERSION_NU5){ - nu5_transparent_prevouts_hash(txdata,hash); - prevouts_hash_offset = NU5_INDEX_HASH_PREVOUTSHASH; - } else { - return zxerr_unknown; - } - - if(MEMCMP(hash, txdata + start_sighashdata() + prevouts_hash_offset, HASH_SIZE) != 0){ - return zxerr_unknown; - } - return zxerr_ok; +zxerr_t crypto_check_prevouts(uint8_t *buffer, uint16_t bufferLen, + const uint8_t *txdata, const uint8_t tx_version) { + zemu_log_stack("crypto_check_prevouts"); + MEMZERO(buffer, bufferLen); + + if (get_state() != STATE_CHECKING_ALL_TXDATA) { + return zxerr_unknown; + } + + uint8_t hash[HASH_SIZE] = {0}; + size_t prevouts_hash_offset = 0; + if (tx_version == TX_VERSION_SAPLING) { + sapling_transparent_prevouts_hash(txdata, hash); + prevouts_hash_offset = SAPLING_INDEX_HASH_PREVOUTSHASH; + } else if (tx_version == TX_VERSION_NU5) { + nu5_transparent_prevouts_hash(txdata, hash); + prevouts_hash_offset = NU5_INDEX_HASH_PREVOUTSHASH; + } else { + return zxerr_unknown; + } + + if (MEMCMP(hash, txdata + start_sighashdata() + prevouts_hash_offset, + HASH_SIZE) != 0) { + return zxerr_unknown; + } + return zxerr_ok; } // handleCheckandSign step 2/11 -zxerr_t crypto_check_sequence(uint8_t *buffer, uint16_t bufferLen, const uint8_t *txdata, const uint8_t tx_version){ - zemu_log_stack("crypto_check_sequence"); - MEMZERO(buffer, bufferLen); - - if(get_state() != STATE_CHECKING_ALL_TXDATA){ - return zxerr_unknown; - } - - uint8_t hash[HASH_SIZE] = {0}; - size_t sequence_hash_offset = 0; - - if (tx_version==TX_VERSION_SAPLING) { - sapling_transparent_sequence_hash(txdata, hash); - sequence_hash_offset = SAPLING_INDEX_HASH_SEQUENCEHASH; - } - else if (tx_version == TX_VERSION_NU5){ - nu5_transparent_sequence_hash(txdata,hash); - sequence_hash_offset = NU5_INDEX_HASH_SEQUENCEHASH; - } - else { - return zxerr_unknown; - } - - if(MEMCMP(hash, txdata + start_sighashdata() + sequence_hash_offset, HASH_SIZE) != 0){ - return zxerr_unknown; - } - return zxerr_ok; +zxerr_t crypto_check_sequence(uint8_t *buffer, uint16_t bufferLen, + const uint8_t *txdata, const uint8_t tx_version) { + zemu_log_stack("crypto_check_sequence"); + MEMZERO(buffer, bufferLen); + + if (get_state() != STATE_CHECKING_ALL_TXDATA) { + return zxerr_unknown; + } + + uint8_t hash[HASH_SIZE] = {0}; + size_t sequence_hash_offset = 0; + + if (tx_version == TX_VERSION_SAPLING) { + sapling_transparent_sequence_hash(txdata, hash); + sequence_hash_offset = SAPLING_INDEX_HASH_SEQUENCEHASH; + } else if (tx_version == TX_VERSION_NU5) { + nu5_transparent_sequence_hash(txdata, hash); + sequence_hash_offset = NU5_INDEX_HASH_SEQUENCEHASH; + } else { + return zxerr_unknown; + } + + if (MEMCMP(hash, txdata + start_sighashdata() + sequence_hash_offset, + HASH_SIZE) != 0) { + return zxerr_unknown; + } + return zxerr_ok; } // handleCheckandSign step 3/11 -zxerr_t crypto_check_outputs(uint8_t *buffer, uint16_t bufferLen, const uint8_t *txdata, const uint16_t txdatalen, const uint8_t tx_version){ - zemu_log_stack("crypto_check_outputs"); - if(start_sighashdata() + SAPLING_LENGTH_HASH_DATA != txdatalen){ - return zxerr_unknown; - } - - if(get_state() != STATE_CHECKING_ALL_TXDATA){ - return zxerr_unknown; - } - - MEMZERO(buffer, bufferLen); - uint8_t hash[HASH_SIZE] = {0}; - size_t sapling_outputs_hash_offset = 0; - - if (tx_version==TX_VERSION_SAPLING) { - v4_transparent_outputs_hash(hash); - sapling_outputs_hash_offset = SAPLING_INDEX_HASH_OUTPUTSHASH; - } - else if (tx_version == TX_VERSION_NU5){ - nu5_transparent_outputs_hash(hash); - sapling_outputs_hash_offset = NU5_INDEX_HASH_OUTPUTSHASH; - } - else - { - return zxerr_unknown; - } - - if(MEMCMP(hash, txdata + start_sighashdata() + sapling_outputs_hash_offset, HASH_SIZE) != 0){ - return zxerr_unknown; - } - return zxerr_ok; +zxerr_t crypto_check_outputs(uint8_t *buffer, uint16_t bufferLen, + const uint8_t *txdata, const uint16_t txdatalen, + const uint8_t tx_version) { + zemu_log_stack("crypto_check_outputs"); + if (start_sighashdata() + SAPLING_LENGTH_HASH_DATA != txdatalen) { + return zxerr_unknown; + } + + if (get_state() != STATE_CHECKING_ALL_TXDATA) { + return zxerr_unknown; + } + + MEMZERO(buffer, bufferLen); + uint8_t hash[HASH_SIZE] = {0}; + size_t sapling_outputs_hash_offset = 0; + + if (tx_version == TX_VERSION_SAPLING) { + v4_transparent_outputs_hash(hash); + sapling_outputs_hash_offset = SAPLING_INDEX_HASH_OUTPUTSHASH; + } else if (tx_version == TX_VERSION_NU5) { + nu5_transparent_outputs_hash(hash); + sapling_outputs_hash_offset = NU5_INDEX_HASH_OUTPUTSHASH; + } else { + return zxerr_unknown; + } + + if (MEMCMP(hash, txdata + start_sighashdata() + sapling_outputs_hash_offset, + HASH_SIZE) != 0) { + return zxerr_unknown; + } + return zxerr_ok; } // handleCheckandSign step 4/11 -zxerr_t crypto_check_joinsplits(uint8_t *buffer, uint16_t bufferLen, const uint8_t *txdata, const uint8_t tx_version){ - if (tx_version == TX_VERSION_SAPLING){ - zemu_log_stack("crypto_check_joinsplits"); - MEMZERO(buffer, bufferLen); - - if(get_state() != STATE_CHECKING_ALL_TXDATA){ - return zxerr_unknown; - } +zxerr_t crypto_check_joinsplits(uint8_t *buffer, uint16_t bufferLen, + const uint8_t *txdata, + const uint8_t tx_version) { + if (tx_version == TX_VERSION_SAPLING) { + zemu_log_stack("crypto_check_joinsplits"); + MEMZERO(buffer, bufferLen); - uint8_t hash[HASH_SIZE] = {0}; - if(MEMCMP(hash, txdata + start_sighashdata() + SAPLING_INDEX_HASH_JOINSPLITSHASH, HASH_SIZE) != 0){ - return zxerr_unknown; - } + if (get_state() != STATE_CHECKING_ALL_TXDATA) { + return zxerr_unknown; + } + uint8_t hash[HASH_SIZE] = {0}; + if (MEMCMP(hash, + txdata + start_sighashdata() + SAPLING_INDEX_HASH_JOINSPLITSHASH, + HASH_SIZE) != 0) { + return zxerr_unknown; } - return zxerr_ok; + } + return zxerr_ok; } // handleCheckandSign step 5/11 -zxerr_t crypto_check_valuebalance(uint8_t *buffer, uint16_t bufferLen, const uint8_t *txdata, const uint8_t tx_version){ - zemu_log_stack("crypto_check_valuebalance"); - MEMZERO(buffer, bufferLen); - - if(get_state() != STATE_CHECKING_ALL_TXDATA){ - return zxerr_unknown; - } - parser_context_t pars_ctx; - parser_error_t pars_err; - size_t value_balance_offset = 0; - if (tx_version==TX_VERSION_SAPLING) { - value_balance_offset = SAPLING_INDEX_HASH_VALUEBALANCE; - } - else if (tx_version == TX_VERSION_NU5){ - value_balance_offset = NU5_INDEX_HASH_VALUEBALANCE; - } - else { - return zxerr_unknown; - } - pars_ctx.offset = 0; - pars_ctx.buffer = txdata + start_sighashdata() + value_balance_offset; - pars_ctx.bufferLen = 8; - int64_t v = 0; - pars_err = _readInt64(&pars_ctx, &v); - if (pars_err != parser_ok){ - return 0; - } - - int64_t valuebalance = get_valuebalance(); - int64_t *value_flash = (int64_t *)&valuebalance; - if(MEMCMP(&v, value_flash, 8) != 0){ - return zxerr_unknown; - } - return zxerr_ok; +zxerr_t crypto_check_valuebalance(uint8_t *buffer, uint16_t bufferLen, + const uint8_t *txdata, + const uint8_t tx_version) { + zemu_log_stack("crypto_check_valuebalance"); + MEMZERO(buffer, bufferLen); + + if (get_state() != STATE_CHECKING_ALL_TXDATA) { + return zxerr_unknown; + } + parser_context_t pars_ctx; + parser_error_t pars_err; + size_t value_balance_offset = 0; + if (tx_version == TX_VERSION_SAPLING) { + value_balance_offset = SAPLING_INDEX_HASH_VALUEBALANCE; + } else if (tx_version == TX_VERSION_NU5) { + value_balance_offset = NU5_INDEX_HASH_VALUEBALANCE; + } else { + return zxerr_unknown; + } + pars_ctx.offset = 0; + pars_ctx.buffer = txdata + start_sighashdata() + value_balance_offset; + pars_ctx.bufferLen = 8; + int64_t v = 0; + pars_err = _readInt64(&pars_ctx, &v); + if (pars_err != parser_ok) { + return 0; + } + + int64_t valuebalance = get_valuebalance(); + int64_t *value_flash = (int64_t *)&valuebalance; + if (MEMCMP(&v, value_flash, 8) != 0) { + return zxerr_unknown; + } + return zxerr_ok; } typedef struct { - union { - struct { - uint8_t pedersen_input[PEDERSEN_INPUT_SIZE]; - }; - struct { - uint8_t pedersen_hash[HASH_SIZE]; - }; - - struct { - uint8_t ncm_full[NOTE_COMMITMENT_SIZE]; - }; - struct { - uint8_t nf[NULLIFIER_SIZE]; - }; - - struct { - uint8_t spend_hash[HASH_SIZE]; - }; + union { + struct { + uint8_t pedersen_input[PEDERSEN_INPUT_SIZE]; + }; + struct { + uint8_t pedersen_hash[HASH_SIZE]; + }; + + struct { + uint8_t ncm_full[NOTE_COMMITMENT_SIZE]; + }; + struct { + uint8_t nf[NULLIFIER_SIZE]; + }; + + struct { + uint8_t spend_hash[HASH_SIZE]; }; + }; } tmp_buf_checkspend; typedef struct { - union { - // STEP 1 - struct { - uint8_t zip32_seed[ZIP32_SEED_SIZE]; - } step1; - - struct { - uint8_t ask[ASK_SIZE]; - uint8_t nsk[NSK_SIZE]; - } step2; - - struct { - uint8_t rk[PUB_KEY_SIZE]; - uint8_t nsk[NSK_SIZE]; - } step3; - - struct { - uint8_t cv[VALUE_COMMITMENT_SIZE]; - uint8_t nsk[NSK_SIZE]; - } step4; - }; + union { + // STEP 1 + struct { + uint8_t zip32_seed[ZIP32_SEED_SIZE]; + } step1; + + struct { + uint8_t ask[ASK_SIZE]; + uint8_t nsk[NSK_SIZE]; + } step2; + + struct { + uint8_t rk[PUB_KEY_SIZE]; + uint8_t nsk[NSK_SIZE]; + } step3; + + struct { + uint8_t cv[VALUE_COMMITMENT_SIZE]; + uint8_t nsk[NSK_SIZE]; + } step4; + }; } tmp_checkspend; // handleCheckandSign step 6/11 -zxerr_t crypto_checkspend_sapling(uint8_t *buffer, uint16_t bufferLen, const uint8_t *txdata, const uint16_t txdatalen, const uint8_t tx_version) { - zemu_log_stack("crypto_checkspend_sapling"); - MEMZERO(buffer, bufferLen); +zxerr_t crypto_checkspend_sapling(uint8_t *buffer, uint16_t bufferLen, + const uint8_t *txdata, + const uint16_t txdatalen, + const uint8_t tx_version) { + zemu_log_stack("crypto_checkspend_sapling"); + MEMZERO(buffer, bufferLen); - const size_t length_hash_data = (tx_version == TX_VERSION_SAPLING) ? SAPLING_LENGTH_HASH_DATA : NU5_LENGTH_HASH_DATA; + const size_t length_hash_data = (tx_version == TX_VERSION_SAPLING) + ? SAPLING_LENGTH_HASH_DATA + : NU5_LENGTH_HASH_DATA; - if(length_t_in_data() + length_spenddata() + length_outputdata() + length_hash_data != txdatalen){ - return zxerr_unknown; - } + if (length_t_in_data() + length_spenddata() + length_outputdata() + + length_hash_data != + txdatalen) { + return zxerr_unknown; + } - if(get_state() != STATE_CHECKING_ALL_TXDATA){ - return zxerr_unknown; + if (get_state() != STATE_CHECKING_ALL_TXDATA) { + return zxerr_unknown; + } + + uint8_t *out = buffer; + tmp_buf_checkspend *const tmp_buf = (tmp_buf_checkspend *)buffer; + + uint8_t *start_spenddata = + (uint8_t *)(txdata + length_t_in_data() + length_spend_old_data()); + uint8_t *start_spendolddata = (uint8_t *)(txdata + length_t_in_data()); + + tmp_checkspend tmp = {0}; + + // the path in zip32 is [FIRST_VALUE, COIN_TYPE, p] where p is u32 and last + // part of hdPath + const uint8_t spendListSize = spendlist_len(); + + for (uint8_t i = 0; i < spendListSize; i++) { + CHECK_ZXERROR_AND_CLEAN(crypto_fillSaplingSeed(tmp.step1.zip32_seed)) + const spend_item_t *item = spendlist_retrieve_item(i); + if (item == NULL) { + return zxerr_unknown; } - uint8_t *out = buffer; - tmp_buf_checkspend *const tmp_buf = (tmp_buf_checkspend *) buffer; - - uint8_t *start_spenddata = (uint8_t *)(txdata + length_t_in_data() + length_spend_old_data()); - uint8_t *start_spendolddata = (uint8_t *)(txdata + length_t_in_data()); - - tmp_checkspend tmp = {0}; - - //the path in zip32 is [FIRST_VALUE, COIN_TYPE, p] where p is u32 and last part of hdPath - const uint8_t spendListSize = spendlist_len(); - - for(uint8_t i = 0; i < spendListSize; i++) { - CHECK_ZXERROR_AND_CLEAN(crypto_fillSaplingSeed(tmp.step1.zip32_seed)) - const spend_item_t *item = spendlist_retrieve_item(i); - if (item == NULL) { - return zxerr_unknown; - } - - // we later need nsk - zip32_child_ask_nsk(tmp.step1.zip32_seed, tmp.step2.ask, tmp.step2.nsk, item->path); - get_rk(tmp.step2.ask, (uint8_t *)item->alpha, tmp.step3.rk); - if(MEMCMP(tmp.step3.rk, start_spenddata + INDEX_SPEND_RK + i * SPEND_TX_LEN,PUB_KEY_SIZE) != 0){ - CHECK_ZXERROR_AND_CLEAN(zxerr_unknown) - } - - // step4.cv = step3.rk. - compute_value_commitment(item->value, item->rcmvalue,tmp.step4.cv); - if (MEMCMP(tmp.step4.cv, start_spenddata + INDEX_SPEND_VALUECMT + i *SPEND_TX_LEN,VALUE_COMMITMENT_SIZE) != 0){ - CHECK_ZXERROR_AND_CLEAN(zxerr_unknown) - } - - compute_note_commitment_fullpoint(tmp_buf->pedersen_hash, start_spendolddata + INDEX_SPEND_OLD_RCM + i * SPEND_OLD_TX_LEN,item->value, item->div, item->pkd); - - uint64_t notepos = 0; - { - parser_context_t pars_ctx; - parser_error_t pars_err; - - pars_ctx.offset = 0; - pars_ctx.buffer = start_spendolddata + INDEX_SPEND_OLD_NOTEPOS + i * SPEND_OLD_TX_LEN; - pars_ctx.bufferLen = 8; - pars_err = _readUInt64(&pars_ctx, ¬epos); - if (pars_err != parser_ok){ - CHECK_ZXERROR_AND_CLEAN(zxerr_unknown) - } - } - compute_nullifier(tmp_buf->ncm_full, notepos, tmp.step4.nsk, tmp_buf->nf); - if (MEMCMP(tmp_buf->nf, start_spenddata + INDEX_SPEND_NF + i * SPEND_TX_LEN, NULLIFIER_SIZE) != 0){ - CHECK_ZXERROR_AND_CLEAN(zxerr_unknown) - } - - MEMZERO(out, bufferLen); - MEMZERO(&tmp, sizeof(tmp_checkspend)); + // we later need nsk + zip32_child_ask_nsk(tmp.step1.zip32_seed, tmp.step2.ask, tmp.step2.nsk, + item->path); + get_rk(tmp.step2.ask, (uint8_t *)item->alpha, tmp.step3.rk); + if (MEMCMP(tmp.step3.rk, + start_spenddata + INDEX_SPEND_RK + i * SPEND_TX_LEN, + PUB_KEY_SIZE) != 0) { + CHECK_ZXERROR_AND_CLEAN(zxerr_unknown) } - size_t sapling_spend_offset = 0; - if (tx_version == TX_VERSION_SAPLING) { - if (spendlist_len() > 0) { - shielded_spend_hash(start_spenddata, length_spend_new_data(), tmp_buf->spend_hash); - } - sapling_spend_offset = SAPLING_INDEX_HASH_SHIELDEDSPENDHASH; - } else if (tx_version == TX_VERSION_NU5) { - nu5_hash_sapling_spends(start_spenddata, tmp_buf->spend_hash); - sapling_spend_offset = NU5_INDEX_HASH_SHIELDEDSPENDHASH; - } else { - CHECK_ZXERROR_AND_CLEAN(zxerr_unknown) + // step4.cv = step3.rk. + compute_value_commitment(item->value, item->rcmvalue, tmp.step4.cv); + if (MEMCMP(tmp.step4.cv, + start_spenddata + INDEX_SPEND_VALUECMT + i * SPEND_TX_LEN, + VALUE_COMMITMENT_SIZE) != 0) { + CHECK_ZXERROR_AND_CLEAN(zxerr_unknown) } - if(MEMCMP(tmp_buf->spend_hash, txdata + start_sighashdata() + sapling_spend_offset, HASH_SIZE) != 0){ + compute_note_commitment_fullpoint(tmp_buf->pedersen_hash, + start_spendolddata + INDEX_SPEND_OLD_RCM + + i * SPEND_OLD_TX_LEN, + item->value, item->div, item->pkd); + + uint64_t notepos = 0; + { + parser_context_t pars_ctx; + parser_error_t pars_err; + + pars_ctx.offset = 0; + pars_ctx.buffer = + start_spendolddata + INDEX_SPEND_OLD_NOTEPOS + i * SPEND_OLD_TX_LEN; + pars_ctx.bufferLen = 8; + pars_err = _readUInt64(&pars_ctx, ¬epos); + if (pars_err != parser_ok) { CHECK_ZXERROR_AND_CLEAN(zxerr_unknown) + } + } + compute_nullifier(tmp_buf->ncm_full, notepos, tmp.step4.nsk, tmp_buf->nf); + if (MEMCMP(tmp_buf->nf, start_spenddata + INDEX_SPEND_NF + i * SPEND_TX_LEN, + NULLIFIER_SIZE) != 0) { + CHECK_ZXERROR_AND_CLEAN(zxerr_unknown) } - MEMZERO(out,bufferLen); - return zxerr_ok; //or some code for ok + MEMZERO(out, bufferLen); + MEMZERO(&tmp, sizeof(tmp_checkspend)); + } + + size_t sapling_spend_offset = 0; + if (tx_version == TX_VERSION_SAPLING) { + if (spendlist_len() > 0) { + shielded_spend_hash(start_spenddata, length_spend_new_data(), + tmp_buf->spend_hash); + } + sapling_spend_offset = SAPLING_INDEX_HASH_SHIELDEDSPENDHASH; + } else if (tx_version == TX_VERSION_NU5) { + nu5_hash_sapling_spends(start_spenddata, tmp_buf->spend_hash); + sapling_spend_offset = NU5_INDEX_HASH_SHIELDEDSPENDHASH; + } else { + CHECK_ZXERROR_AND_CLEAN(zxerr_unknown) + } + + if (MEMCMP(tmp_buf->spend_hash, + txdata + start_sighashdata() + sapling_spend_offset, + HASH_SIZE) != 0) { + CHECK_ZXERROR_AND_CLEAN(zxerr_unknown) + } + MEMZERO(out, bufferLen); + + return zxerr_ok; // or some code for ok } typedef struct { - uint8_t shielded_output_hash[HASH_SIZE]; + uint8_t shielded_output_hash[HASH_SIZE]; } tmp_buf_checkoutput; typedef struct { - union { - struct { - uint8_t gd[GD_SIZE]; //computed from receiver diversifier - uint8_t pkd[PKD_SIZE]; //get this from host and show on screen for verification - } step2; - - struct { - uint8_t pedersen_input[PEDERSEN_INPUT_SIZE]; - } step3; - - struct{ - uint8_t notecommitment[NOTE_COMMITMENT_SIZE]; - uint8_t valuecommitment[VALUE_COMMITMENT_SIZE]; - } step4; - }; + union { + struct { + uint8_t gd[GD_SIZE]; // computed from receiver diversifier + uint8_t pkd[PKD_SIZE]; // get this from host and show on screen for + // verification + } step2; + + struct { + uint8_t pedersen_input[PEDERSEN_INPUT_SIZE]; + } step3; + + struct { + uint8_t notecommitment[NOTE_COMMITMENT_SIZE]; + uint8_t valuecommitment[VALUE_COMMITMENT_SIZE]; + } step4; + }; } tmp_checkoutput; // handleCheckandSign step 7/11 -zxerr_t crypto_checkoutput_sapling(uint8_t *buffer, uint16_t bufferLen, const uint8_t *txdata, const uint16_t txdatalen, const uint8_t tx_version) { - zemu_log_stack("crypto_checkoutput_sapling"); - MEMZERO(buffer, bufferLen); - - if (get_state() != STATE_CHECKING_ALL_TXDATA) { - return zxerr_unknown; - } - - const size_t length_hash_data = (tx_version == TX_VERSION_SAPLING) ? SAPLING_LENGTH_HASH_DATA : NU5_LENGTH_HASH_DATA; - if (length_t_in_data() + length_spenddata() + length_outputdata() + length_hash_data != txdatalen) { - return zxerr_unknown; - } - - const uint8_t *start_outputdata = (uint8_t *) (txdata + length_t_in_data() + length_spenddata()); - - zemu_log_stack("crypto_checkoutput_sapling"); - - tmp_checkoutput ncm = {0}; - - uint8_t rcm[RCM_SIZE] = {0}; - - //the path in zip32 is [FIRST_VALUE, COIN_TYPE, p] where p is u32 and last part of hdPath - const uint8_t outputListLen = outputlist_len(); - for(uint8_t i = 0; i < outputListLen; i++) { - const output_item_t *item = outputlist_retrieve_item(i); - if (item == NULL) { - MEMZERO(&ncm, sizeof(tmp_checkoutput)); - return zxerr_unknown; - } - - rseed_get_rcm(item->rseed,rcm); - compute_note_commitment(ncm.step4.notecommitment,rcm,item->value, item->div, item->pkd); - compute_value_commitment(item->value, item->rcmvalue, ncm.step4.valuecommitment); +zxerr_t crypto_checkoutput_sapling(uint8_t *buffer, uint16_t bufferLen, + const uint8_t *txdata, + const uint16_t txdatalen, + const uint8_t tx_version) { + zemu_log_stack("crypto_checkoutput_sapling"); + MEMZERO(buffer, bufferLen); + + if (get_state() != STATE_CHECKING_ALL_TXDATA) { + return zxerr_unknown; + } + + const size_t length_hash_data = (tx_version == TX_VERSION_SAPLING) + ? SAPLING_LENGTH_HASH_DATA + : NU5_LENGTH_HASH_DATA; + if (length_t_in_data() + length_spenddata() + length_outputdata() + + length_hash_data != + txdatalen) { + return zxerr_unknown; + } + + const uint8_t *start_outputdata = + (uint8_t *)(txdata + length_t_in_data() + length_spenddata()); + + zemu_log_stack("crypto_checkoutput_sapling"); + + tmp_checkoutput ncm = {0}; + + uint8_t rcm[RCM_SIZE] = {0}; + + // the path in zip32 is [FIRST_VALUE, COIN_TYPE, p] where p is u32 and last + // part of hdPath + const uint8_t outputListLen = outputlist_len(); + for (uint8_t i = 0; i < outputListLen; i++) { + const output_item_t *item = outputlist_retrieve_item(i); + if (item == NULL) { + MEMZERO(&ncm, sizeof(tmp_checkoutput)); + return zxerr_unknown; + } + + rseed_get_rcm(item->rseed, rcm); + compute_note_commitment(ncm.step4.notecommitment, rcm, item->value, + item->div, item->pkd); + compute_value_commitment(item->value, item->rcmvalue, + ncm.step4.valuecommitment); + + if (MEMCMP(ncm.step4.valuecommitment, + start_outputdata + INDEX_OUTPUT_VALUECMT + i * OUTPUT_TX_LEN, + VALUE_COMMITMENT_SIZE) != 0) { + MEMZERO(&ncm, sizeof(tmp_checkoutput)); + return zxerr_unknown; + } + + if (MEMCMP(ncm.step4.notecommitment, + start_outputdata + INDEX_OUTPUT_NOTECMT + i * OUTPUT_TX_LEN, + NOTE_COMMITMENT_SIZE) != 0) { + MEMZERO(&ncm, sizeof(tmp_checkoutput)); + return zxerr_unknown; + } + + MEMZERO(&ncm, sizeof(tmp_checkoutput)); + } + + tmp_buf_checkoutput *const tmp_buf = (tmp_buf_checkoutput *)buffer; + + size_t sapling_output_offset = 0; + if (tx_version == TX_VERSION_SAPLING) { + if (outputlist_len() > 0) { + shielded_output_hash(start_outputdata, length_outputdata(), + tmp_buf->shielded_output_hash); + } + sapling_output_offset = SAPLING_INDEX_HASH_SHIELDEDOUTPUTHASH; + } else if (tx_version == TX_VERSION_NU5) { + nu5_hash_sapling_outputs(start_outputdata, tmp_buf->shielded_output_hash); + sapling_output_offset = NU5_INDEX_HASH_SHIELDEDOUTPUTHASH; + } else { + return zxerr_unknown; + } + + if (MEMCMP(tmp_buf->shielded_output_hash, + txdata + start_sighashdata() + sapling_output_offset, + HASH_SIZE) != 0) { + return zxerr_unknown; + } + + return zxerr_ok; // or some code for ok +} - if (MEMCMP(ncm.step4.valuecommitment, start_outputdata + INDEX_OUTPUT_VALUECMT + i * OUTPUT_TX_LEN,VALUE_COMMITMENT_SIZE) != 0){ - MEMZERO(&ncm, sizeof(tmp_checkoutput)); - return zxerr_unknown; - } +typedef struct { + union { + // STEP 1 + struct { // MAX SIZE --> 160 + uint8_t dummy[MAX_SIZE - EPK_SIZE - ESK_SIZE]; + uint8_t epk[EPK_SIZE]; // computed from receiver diversifier + uint8_t esk[ESK_SIZE]; + } step1; + + struct { + uint8_t chachanonce[CHACHA_NONCE_SIZE]; + uint8_t compactout[COMPACT_OUT_SIZE]; + uint8_t sharedkey[SHARED_KEY_SIZE]; + uint8_t epk[EPK_SIZE]; + uint8_t esk[ESK_SIZE]; + } step2; + + struct { + uint8_t dummy[MAX_SIZE - OVK_SIZE - VALUE_COMMITMENT_SIZE - + NOTE_COMMITMENT_SIZE - EPK_SIZE - ESK_SIZE]; + uint8_t ovk[OVK_SIZE]; + uint8_t valuecmt[VALUE_COMMITMENT_SIZE]; + uint8_t notecmt[NOTE_COMMITMENT_SIZE]; + uint8_t epk[EPK_SIZE]; + uint8_t esk[ESK_SIZE]; + } step3; + + struct { + uint8_t dummy[MAX_SIZE - PRF_INPUT_SIZE - ESK_SIZE]; + uint8_t prfinput[PRF_INPUT_SIZE]; + uint8_t esk[ESK_SIZE]; + } step4; + + struct { + uint8_t outkey[OUT_KEY_SIZE]; + uint8_t dummy[MAX_SIZE - OUT_KEY_SIZE - PKD_SIZE - ESK_SIZE]; + uint8_t pkd[PKD_SIZE]; + uint8_t esk[ESK_SIZE]; + } step5; + + struct { + uint8_t outkey[OUT_KEY_SIZE]; + uint8_t + dummy[MAX_SIZE - OUT_KEY_SIZE - ENC_CIPHER_SIZE - CHACHA_NONCE_SIZE]; + uint8_t chachanonce[CHACHA_NONCE_SIZE]; + uint8_t encciph[ENC_CIPHER_SIZE]; + } step6; + + struct { + uint8_t hashseed[OVK_SET_SIZE]; + uint8_t outkey[OUT_KEY_SIZE]; + uint8_t encciph_part1[ENC_CIPHER_HALVE_SIZE]; + uint8_t encciph_part2[ENC_CIPHER_HALVE_SIZE]; + uint8_t chachanonce[CHACHA_NONCE_SIZE]; + } step3b; + struct { + uint8_t hashseed[OVK_SET_SIZE]; + uint8_t outkey[OUT_KEY_SIZE]; + uint8_t encciph[ENC_CIPHER_SIZE]; + uint8_t chachanonce[CHACHA_NONCE_SIZE]; + } step4b; + }; +} tmp_enc; - if(MEMCMP(ncm.step4.notecommitment, start_outputdata + INDEX_OUTPUT_NOTECMT + i * OUTPUT_TX_LEN,NOTE_COMMITMENT_SIZE) != 0){ - MEMZERO(&ncm, sizeof(tmp_checkoutput)); - return zxerr_unknown; - } +// handleCheckandSign step 8/11 +zxerr_t crypto_checkencryptions_sapling(uint8_t *buffer, uint16_t bufferLen, + const uint8_t *txdata) { + zemu_log_stack("crypto_checkencryptions_sapling"); + MEMZERO(buffer, bufferLen); + tmp_enc *tmp = (tmp_enc *)buffer; + + const uint8_t *start_outputdata = + (uint8_t *)(txdata + length_t_in_data() + length_spenddata()); + + // the path in zip32 is [FIRST_VALUE, COIN_TYPE, p] where p is u32 and last + // part of hdPath + for (uint8_t i = 0; i < outputlist_len(); i++) { + // retrieve info on list of outputs stored in flash + const output_item_t *item = outputlist_retrieve_item(i); + if (item == NULL) { + return zxerr_unknown; + } + // compute random ephemeral private and public keys (esk,epk) from seed and + // diversifier + rseed_get_esk_epk(item->rseed, (uint8_t *)item->div, tmp->step1.esk, + tmp->step1.epk); + CHECK_APP_CANARY() - MEMZERO(&ncm, sizeof(tmp_checkoutput)); + // compare the computed epk to that provided in the transaction data + if (MEMCMP(tmp->step1.epk, + start_outputdata + INDEX_OUTPUT_EPK + i * OUTPUT_TX_LEN, + EPK_SIZE) != 0) { + return zxerr_unknown; } - tmp_buf_checkoutput *const tmp_buf = (tmp_buf_checkoutput *) buffer; - - size_t sapling_output_offset = 0; - if (tx_version==TX_VERSION_SAPLING) { - if (outputlist_len() > 0) { - shielded_output_hash(start_outputdata, length_outputdata(), tmp_buf->shielded_output_hash); - } - sapling_output_offset = SAPLING_INDEX_HASH_SHIELDEDOUTPUTHASH; - } else if (tx_version == TX_VERSION_NU5) { - nu5_hash_sapling_outputs(start_outputdata, tmp_buf->shielded_output_hash); - sapling_output_offset = NU5_INDEX_HASH_SHIELDEDOUTPUTHASH; - } else { + // get shared key (used as encryption key) from esk, epk and pkd + ka_to_key(tmp->step1.esk, (uint8_t *)item->pkd, tmp->step1.epk, + tmp->step2.sharedkey); + CHECK_APP_CANARY() + // encode (div, value rseed and memotype) into step2.compactout ready to be + // encrypted + prepare_enccompact_input((uint8_t *)item->div, item->value, + (uint8_t *)item->rseed, item->memotype, + tmp->step2.compactout); + CHECK_APP_CANARY() + MEMZERO(tmp->step2.chachanonce, CHACHA_NONCE_SIZE); + // encrypt the previously obtained encoding, and store it in + // step2.compactoutput (reusing the same memory for input and output) + chacha(tmp->step2.compactout, tmp->step2.compactout, COMPACT_OUT_SIZE, + tmp->step2.sharedkey, tmp->step2.chachanonce, 1); + CHECK_APP_CANARY() + // check that the computed encryption is the same as that provided in the + // transaction data + if (MEMCMP(tmp->step2.compactout, + start_outputdata + INDEX_OUTPUT_ENC + i * OUTPUT_TX_LEN, + COMPACT_OUT_SIZE) != 0) { + return zxerr_unknown; + } + + // if an ovk was provided + if (item->ovk[0] != 0x00) { + // copy ovk, the value commitment and note-commitment from flash memory + // and transaction to local tmp structure so as to hash + MEMCPY(tmp->step3.ovk, item->ovk + 1, OVK_SIZE); + MEMCPY(tmp->step3.valuecmt, + start_outputdata + INDEX_OUTPUT_VALUECMT + i * OUTPUT_TX_LEN, + VALUE_COMMITMENT_SIZE); + MEMCPY(tmp->step3.notecmt, + start_outputdata + INDEX_OUTPUT_NOTECMT + i * OUTPUT_TX_LEN, + NOTE_COMMITMENT_SIZE); + // Note that tmp->step4.prfinput is the same memory chunk as the + // concatenation of tmp->step3.ovk || tmp->step3.valuecmt || + // tmp->step3.notecmt || tmp->step3.epk so next we hash that + // concatenation, and store hash in tmp->step5.outkey + blake2b_prf(tmp->step4.prfinput, tmp->step5.outkey); + CHECK_APP_CANARY() + + // get pkd from flash memory, store it in tmp->step5.pkd + MEMCPY(tmp->step5.pkd, item->pkd, PKD_SIZE); + + MEMZERO(tmp->step6.chachanonce, CHACHA_NONCE_SIZE); + + // tmp->step6.encciph = tmp->step5.pkd || tmp->step5.esk + // encrypt that, using as encryption key the output of the blake2b PRF + // store resulting ciphertext in tmp->step6.encciph + chacha(tmp->step6.encciph, tmp->step6.encciph, ENC_CIPHER_SIZE, + tmp->step6.outkey, tmp->step6.chachanonce, 1); + CHECK_APP_CANARY() + + // check that the computed encryption is the same as that provided in the + // transaction data + if (MEMCMP(tmp->step6.encciph, + start_outputdata + INDEX_OUTPUT_OUT + i * OUTPUT_TX_LEN, + ENC_CIPHER_SIZE) != 0) { return zxerr_unknown; - } + } - if(MEMCMP(tmp_buf->shielded_output_hash, txdata + start_sighashdata() + sapling_output_offset, HASH_SIZE) != 0){ + // if no ovk was provided + } else { + // copy the contents of flash memory for ovk, and hash it. This hash will + // be the encryption key + MEMCPY(tmp->step3b.hashseed, item->ovk, OVK_SET_SIZE); + cx_hash_sha256(tmp->step3b.hashseed, OVK_SET_SIZE, tmp->step3b.outkey, + CX_SHA256_SIZE); + // replace the first 0x00 of the copied ovk with 0x01, hash again, this + // will be the first half of the plaintext to encrypt + tmp->step3b.hashseed[0] = 0x01; + cx_hash_sha256(tmp->step3b.hashseed, OVK_SET_SIZE, + tmp->step3b.encciph_part1, CX_SHA256_SIZE); + // replace the first 0x01 of the copied ovk with 0x02, hash again, this + // will be the second half of the plaintext to encrypt + tmp->step3b.hashseed[0] = 0x02; + cx_hash_sha256(tmp->step3b.hashseed, OVK_SET_SIZE, + tmp->step3b.encciph_part2, CX_SHA256_SIZE); + MEMZERO(tmp->step3b.chachanonce, CHACHA_NONCE_SIZE); + // tmp->step4b.encciph = tmp->step3b.encciph_part1 || + // tmp->step3b.encciph_part2 encrypt and compare computed encryption to + // that provided in the transaction data + chacha(tmp->step4b.encciph, tmp->step4b.encciph, ENC_CIPHER_SIZE, + tmp->step4b.outkey, tmp->step4b.chachanonce, 1); + if (MEMCMP(tmp->step4b.encciph, + start_outputdata + INDEX_OUTPUT_OUT + i * OUTPUT_TX_LEN, + ENC_CIPHER_SIZE) != 0) { return zxerr_unknown; + } } - - return zxerr_ok; //or some code for ok -} - -typedef struct { - union { - // STEP 1 - struct { // MAX SIZE --> 160 - uint8_t dummy[MAX_SIZE - EPK_SIZE - ESK_SIZE]; - uint8_t epk[EPK_SIZE]; //computed from receiver diversifier - uint8_t esk[ESK_SIZE]; - } step1; - - struct{ - uint8_t chachanonce[CHACHA_NONCE_SIZE]; - uint8_t compactout[COMPACT_OUT_SIZE]; - uint8_t sharedkey[SHARED_KEY_SIZE]; - uint8_t epk[EPK_SIZE]; - uint8_t esk[ESK_SIZE]; - } step2; - - struct{ - uint8_t dummy[MAX_SIZE - OVK_SIZE - VALUE_COMMITMENT_SIZE - NOTE_COMMITMENT_SIZE - EPK_SIZE - ESK_SIZE]; - uint8_t ovk[OVK_SIZE]; - uint8_t valuecmt[VALUE_COMMITMENT_SIZE]; - uint8_t notecmt[NOTE_COMMITMENT_SIZE]; - uint8_t epk[EPK_SIZE]; - uint8_t esk[ESK_SIZE]; - }step3; - - struct{ - uint8_t dummy[MAX_SIZE - PRF_INPUT_SIZE - ESK_SIZE]; - uint8_t prfinput[PRF_INPUT_SIZE]; - uint8_t esk[ESK_SIZE]; - }step4; - - struct{ - uint8_t outkey[OUT_KEY_SIZE]; - uint8_t dummy[MAX_SIZE - OUT_KEY_SIZE - PKD_SIZE - ESK_SIZE]; - uint8_t pkd[PKD_SIZE]; - uint8_t esk[ESK_SIZE]; - }step5; - - struct{ - uint8_t outkey[OUT_KEY_SIZE]; - uint8_t dummy[MAX_SIZE - OUT_KEY_SIZE - ENC_CIPHER_SIZE - CHACHA_NONCE_SIZE]; - uint8_t chachanonce[CHACHA_NONCE_SIZE]; - uint8_t encciph[ENC_CIPHER_SIZE]; - }step6; - - struct{ - uint8_t hashseed[OVK_SET_SIZE]; - uint8_t outkey[OUT_KEY_SIZE]; - uint8_t encciph_part1[ENC_CIPHER_HALVE_SIZE]; - uint8_t encciph_part2[ENC_CIPHER_HALVE_SIZE]; - uint8_t chachanonce[CHACHA_NONCE_SIZE]; - }step3b; - struct{ - uint8_t hashseed[OVK_SET_SIZE]; - uint8_t outkey[OUT_KEY_SIZE]; - uint8_t encciph[ENC_CIPHER_SIZE]; - uint8_t chachanonce[CHACHA_NONCE_SIZE]; - }step4b; - }; -} tmp_enc; - -// handleCheckandSign step 8/11 -zxerr_t crypto_checkencryptions_sapling(uint8_t *buffer, uint16_t bufferLen, const uint8_t *txdata) { - zemu_log_stack("crypto_checkencryptions_sapling"); + CHECK_APP_CANARY() MEMZERO(buffer, bufferLen); - tmp_enc *tmp = (tmp_enc *)buffer; - - const uint8_t *start_outputdata = (uint8_t *)(txdata + length_t_in_data() + length_spenddata()); - - //the path in zip32 is [FIRST_VALUE, COIN_TYPE, p] where p is u32 and last part of hdPath - for(uint8_t i = 0; i < outputlist_len(); i++) { - // retrieve info on list of outputs stored in flash - const output_item_t *item = outputlist_retrieve_item(i); - if (item == NULL){ - return zxerr_unknown; - } - // compute random ephemeral private and public keys (esk,epk) from seed and diversifier - rseed_get_esk_epk(item->rseed,(uint8_t *) item->div, tmp->step1.esk, tmp->step1.epk); - CHECK_APP_CANARY() - - // compare the computed epk to that provided in the transaction data - if (MEMCMP(tmp->step1.epk, start_outputdata + INDEX_OUTPUT_EPK + i * OUTPUT_TX_LEN, EPK_SIZE) != 0){ - return zxerr_unknown; - } - - // get shared key (used as encryption key) from esk, epk and pkd - ka_to_key(tmp->step1.esk, (uint8_t *) item->pkd, tmp->step1.epk, tmp->step2.sharedkey); - CHECK_APP_CANARY() - // encode (div, value rseed and memotype) into step2.compactout ready to be encrypted - prepare_enccompact_input((uint8_t *) item->div, item->value, (uint8_t *) item->rseed, item->memotype, tmp->step2.compactout); - CHECK_APP_CANARY() - MEMZERO(tmp->step2.chachanonce,CHACHA_NONCE_SIZE); - // encrypt the previously obtained encoding, and store it in step2.compactoutput (reusing the same memory for input and output) - chacha(tmp->step2.compactout, tmp->step2.compactout, COMPACT_OUT_SIZE, tmp->step2.sharedkey, tmp->step2.chachanonce,1); - CHECK_APP_CANARY() - // check that the computed encryption is the same as that provided in the transaction data - if (MEMCMP(tmp->step2.compactout, start_outputdata + INDEX_OUTPUT_ENC + i * OUTPUT_TX_LEN, COMPACT_OUT_SIZE) != 0) { - return zxerr_unknown; - } - - // if an ovk was provided - if (item->ovk[0] != 0x00) { - // copy ovk, the value commitment and note-commitment from flash memory and transaction to - // local tmp structure so as to hash - MEMCPY(tmp->step3.ovk, item->ovk + 1, OVK_SIZE); - MEMCPY(tmp->step3.valuecmt, start_outputdata + INDEX_OUTPUT_VALUECMT + i* OUTPUT_TX_LEN,VALUE_COMMITMENT_SIZE); - MEMCPY(tmp->step3.notecmt, start_outputdata + INDEX_OUTPUT_NOTECMT + i* OUTPUT_TX_LEN,NOTE_COMMITMENT_SIZE); - // Note that tmp->step4.prfinput is the same memory chunk as the concatenation of - // tmp->step3.ovk || tmp->step3.valuecmt || tmp->step3.notecmt || tmp->step3.epk - // so next we hash that concatenation, and store hash in tmp->step5.outkey - blake2b_prf(tmp->step4.prfinput, tmp->step5.outkey); - CHECK_APP_CANARY() - - // get pkd from flash memory, store it in tmp->step5.pkd - MEMCPY(tmp->step5.pkd, item->pkd, PKD_SIZE); - - MEMZERO(tmp->step6.chachanonce,CHACHA_NONCE_SIZE); - - // tmp->step6.encciph = tmp->step5.pkd || tmp->step5.esk - // encrypt that, using as encryption key the output of the blake2b PRF - // store resulting ciphertext in tmp->step6.encciph - chacha(tmp->step6.encciph, tmp->step6.encciph, ENC_CIPHER_SIZE, tmp->step6.outkey, tmp->step6.chachanonce,1); - CHECK_APP_CANARY() - - // check that the computed encryption is the same as that provided in the transaction data - if (MEMCMP(tmp->step6.encciph, start_outputdata + INDEX_OUTPUT_OUT + i * OUTPUT_TX_LEN, ENC_CIPHER_SIZE) != 0) { - return zxerr_unknown; - } - - // if no ovk was provided - } else { - // copy the contents of flash memory for ovk, and hash it. This hash will be the encryption key - MEMCPY(tmp->step3b.hashseed, item->ovk, OVK_SET_SIZE); - cx_hash_sha256(tmp->step3b.hashseed, OVK_SET_SIZE, tmp->step3b.outkey, CX_SHA256_SIZE); - // replace the first 0x00 of the copied ovk with 0x01, hash again, this will be - // the first half of the plaintext to encrypt - tmp->step3b.hashseed[0] = 0x01; - cx_hash_sha256(tmp->step3b.hashseed, OVK_SET_SIZE, tmp->step3b.encciph_part1, CX_SHA256_SIZE); - // replace the first 0x01 of the copied ovk with 0x02, hash again, this will be - // the second half of the plaintext to encrypt - tmp->step3b.hashseed[0] = 0x02; - cx_hash_sha256(tmp->step3b.hashseed, OVK_SET_SIZE, tmp->step3b.encciph_part2, CX_SHA256_SIZE); - MEMZERO(tmp->step3b.chachanonce,CHACHA_NONCE_SIZE); - // tmp->step4b.encciph = tmp->step3b.encciph_part1 || tmp->step3b.encciph_part2 - // encrypt and compare computed encryption to that provided in the transaction data - chacha(tmp->step4b.encciph, tmp->step4b.encciph, ENC_CIPHER_SIZE, tmp->step4b.outkey, tmp->step4b.chachanonce,1); - if (MEMCMP(tmp->step4b.encciph, start_outputdata + INDEX_OUTPUT_OUT + i * OUTPUT_TX_LEN, ENC_CIPHER_SIZE) != 0){ - return zxerr_unknown; - } - } - CHECK_APP_CANARY() - MEMZERO(buffer, bufferLen); - } + } - MEMZERO(buffer, bufferLen); - return zxerr_ok; //or some code for ok + MEMZERO(buffer, bufferLen); + return zxerr_ok; // or some code for ok } -void address_to_script(uint8_t *address, uint8_t *output){ - uint8_t script[SCRIPT_SIZE] = {0}; - script[0] = 0x19; - script[1] = 0x76; - script[2] = 0xa9; - script[3] = 0x14; - - uint8_t tmp[HASH_SIZE] = {0}; - cx_hash_sha256(address, PK_LEN_SECP256K1, tmp, CX_SHA256_SIZE); - ripemd160(tmp, CX_SHA256_SIZE, script + SCRIPT_CONSTS_SIZE); - script[24] = 0x88; - script[25] = 0xac; - MEMCPY(output, script, SCRIPT_SIZE); +void address_to_script(uint8_t *address, uint8_t *output) { + uint8_t script[SCRIPT_SIZE] = {0}; + script[0] = 0x19; + script[1] = 0x76; + script[2] = 0xa9; + script[3] = 0x14; + + uint8_t tmp[HASH_SIZE] = {0}; + cx_hash_sha256(address, PK_LEN_SECP256K1, tmp, CX_SHA256_SIZE); + ripemd160(tmp, CX_SHA256_SIZE, script + SCRIPT_CONSTS_SIZE); + script[24] = 0x88; + script[25] = 0xac; + MEMCPY(output, script, SCRIPT_SIZE); } typedef struct { - union { - // STEP 1 - struct { - uint8_t r[SIG_R_SIZE]; - uint8_t s[SIG_S_SIZE]; - uint8_t v; - // DER signature max size should be 73 - // https://bitcoin.stackexchange.com/questions/77191/what-is-the-maximum-size-of-a-der-encoded-ecdsa-signature#77192 - uint8_t der_signature[DER_MAX_SIZE]; - } step1; - - struct { - uint8_t rs[SIG_R_SIZE + SIG_S_SIZE]; - uint8_t dummy[DER_MAX_SIZE + 1]; - } step2; - }; + union { + // STEP 1 + struct { + uint8_t r[SIG_R_SIZE]; + uint8_t s[SIG_S_SIZE]; + uint8_t v; + // DER signature max size should be 73 + // https://bitcoin.stackexchange.com/questions/77191/what-is-the-maximum-size-of-a-der-encoded-ecdsa-signature#77192 + uint8_t der_signature[DER_MAX_SIZE]; + } step1; + + struct { + uint8_t rs[SIG_R_SIZE + SIG_S_SIZE]; + uint8_t dummy[DER_MAX_SIZE + 1]; + } step2; + }; } __attribute__((packed)) signature_tr; // handleCheckandSign step 9/11 -zxerr_t crypto_sign_and_check_transparent(uint8_t *buffer, uint16_t bufferLen, const uint8_t *txdata, const uint16_t txdatalen, const uint8_t tx_version) { - zemu_log_stack("crypto_sign_and_check_transparent"); - if(t_inlist_len() == 0){ - return zxerr_ok; - } - MEMZERO(buffer, bufferLen); - - // todo: not always SAPLING_LENGTH_HASH_DATA - if(length_t_in_data() + length_spenddata() + length_outputdata() + SAPLING_LENGTH_HASH_DATA != txdatalen){ - return zxerr_unknown; - } - - if(get_state() != STATE_VERIFIED_ALL_TXDATA ){ - return zxerr_unknown; - } - - uint8_t *start_tindata = (uint8_t *)txdata; - uint8_t *start_signdata = (uint8_t *)(txdata + start_sighashdata()); - - uint8_t *out = (uint8_t *) buffer; - MEMZERO(out, bufferLen); - - cx_ecfp_public_key_t cx_publicKey = {0}; - cx_ecfp_private_key_t cx_privateKey = {0}; - uint8_t privateKeyData[64] = {0}; - uint8_t pubKey[PUB_KEY_SIZE+1] = {0}; - uint8_t script[SCRIPT_SIZE] = {0}; - uint8_t message_digest[HASH_SIZE] = {0}; - - unsigned int info = 0; - signature_tr *const signature = (signature_tr *) buffer; - // Temporarily get sk from Ed25519 - zxerr_t error = zxerr_unknown; - CHECK_APP_CANARY() - const u_int8_t tInListLen = t_inlist_len(); - for (uint8_t i = 0; i < tInListLen; i++) { - const t_input_item_t *item = t_inlist_retrieve_item(i); - - CATCH_CXERROR(os_derive_bip32_no_throw(CX_CURVE_256K1, - item->path, - HDPATH_LEN_DEFAULT, - privateKeyData, NULL)) - CATCH_CXERROR(cx_ecfp_init_private_key_no_throw(CX_CURVE_256K1, privateKeyData, SK_SECP256K1_SIZE, &cx_privateKey)) - CATCH_CXERROR(cx_ecfp_init_public_key_no_throw(CX_CURVE_256K1, NULL, 0, &cx_publicKey)) - CATCH_CXERROR(cx_ecfp_generate_pair_no_throw(CX_CURVE_256K1, &cx_publicKey, &cx_privateKey, 1)) - - for (int j = 0; j < PUB_KEY_SIZE; j++) { - pubKey[j] = cx_publicKey.W[SIG_S_SIZE + SIG_R_SIZE - j]; - } - cx_publicKey.W[0] = cx_publicKey.W[SIG_S_SIZE + SIG_R_SIZE] & 1 ? 0x03 : 0x02; // "Compress" public key in place - if ((cx_publicKey.W[SIG_R_SIZE] & 1) != 0) { - pubKey[PUB_KEY_SIZE - 1] |= 0x80; - } - MEMCPY(pubKey, cx_publicKey.W, PK_LEN_SECP256K1); - address_to_script(pubKey,script); - if(MEMCMP(script,(uint8_t *)(start_tindata + INDEX_TIN_SCRIPT + i * T_IN_TX_LEN), SCRIPT_SIZE) != 0){ - goto catch_cx_error; - } - if(MEMCMP(item->script, script, SCRIPT_SIZE) != 0){ - goto catch_cx_error; - } - - uint64_t value = 0; - { - parser_context_t pars_ctx; - parser_error_t pars_err; - - pars_ctx.offset = 0; - pars_ctx.buffer = start_tindata + INDEX_TIN_VALUE + i * T_IN_TX_LEN; - pars_ctx.bufferLen = 8; - pars_err = _readUInt64(&pars_ctx, &value); - if (pars_err != parser_ok){ - goto catch_cx_error; - } - } - - if(value != item->value){ - goto catch_cx_error; - } - signature_script_hash(start_tindata, start_signdata, SAPLING_LENGTH_HASH_DATA, start_tindata + i * T_IN_TX_LEN, T_IN_TX_LEN, i, tx_version, message_digest); - size_t signatureLen = DER_MAX_SIZE; - CATCH_CXERROR(cx_ecdsa_sign_no_throw(&cx_privateKey, - CX_RND_RFC6979 | CX_LAST, - CX_SHA256, - message_digest, - CX_SHA256_SIZE, - signature->step1.der_signature, - &signatureLen, - &info)) - - if (convertDERtoRSV(signature->step1.der_signature, info, signature->step1.r, signature->step1.s, &signature->step1.v) != no_error || - transparent_signatures_append(signature->step2.rs) != zxerr_ok) { - goto catch_cx_error; - } - } - error = zxerr_ok; +zxerr_t crypto_sign_and_check_transparent(uint8_t *buffer, uint16_t bufferLen, + const uint8_t *txdata, + const uint16_t txdatalen, + const uint8_t tx_version) { + zemu_log_stack("crypto_sign_and_check_transparent"); + if (t_inlist_len() == 0) { + return zxerr_ok; + } + MEMZERO(buffer, bufferLen); + + // todo: not always SAPLING_LENGTH_HASH_DATA + if (length_t_in_data() + length_spenddata() + length_outputdata() + + SAPLING_LENGTH_HASH_DATA != + txdatalen) { + return zxerr_unknown; + } + + if (get_state() != STATE_VERIFIED_ALL_TXDATA) { + return zxerr_unknown; + } + + uint8_t *start_tindata = (uint8_t *)txdata; + uint8_t *start_signdata = (uint8_t *)(txdata + start_sighashdata()); + + uint8_t *out = (uint8_t *)buffer; + MEMZERO(out, bufferLen); + + cx_ecfp_public_key_t cx_publicKey = {0}; + cx_ecfp_private_key_t cx_privateKey = {0}; + uint8_t privateKeyData[64] = {0}; + uint8_t pubKey[PUB_KEY_SIZE + 1] = {0}; + uint8_t script[SCRIPT_SIZE] = {0}; + uint8_t message_digest[HASH_SIZE] = {0}; + + unsigned int info = 0; + signature_tr *const signature = (signature_tr *)buffer; + // Temporarily get sk from Ed25519 + zxerr_t error = zxerr_unknown; + CHECK_APP_CANARY() + const u_int8_t tInListLen = t_inlist_len(); + for (uint8_t i = 0; i < tInListLen; i++) { + const t_input_item_t *item = t_inlist_retrieve_item(i); + + CATCH_CXERROR(os_derive_bip32_no_throw( + CX_CURVE_256K1, item->path, HDPATH_LEN_DEFAULT, privateKeyData, NULL)) + CATCH_CXERROR(cx_ecfp_init_private_key_no_throw( + CX_CURVE_256K1, privateKeyData, SK_SECP256K1_SIZE, &cx_privateKey)) + CATCH_CXERROR(cx_ecfp_init_public_key_no_throw(CX_CURVE_256K1, NULL, 0, + &cx_publicKey)) + CATCH_CXERROR(cx_ecfp_generate_pair_no_throw(CX_CURVE_256K1, &cx_publicKey, + &cx_privateKey, 1)) + + for (int j = 0; j < PUB_KEY_SIZE; j++) { + pubKey[j] = cx_publicKey.W[SIG_S_SIZE + SIG_R_SIZE - j]; + } + cx_publicKey.W[0] = cx_publicKey.W[SIG_S_SIZE + SIG_R_SIZE] & 1 + ? 0x03 + : 0x02; // "Compress" public key in place + if ((cx_publicKey.W[SIG_R_SIZE] & 1) != 0) { + pubKey[PUB_KEY_SIZE - 1] |= 0x80; + } + MEMCPY(pubKey, cx_publicKey.W, PK_LEN_SECP256K1); + address_to_script(pubKey, script); + if (MEMCMP(script, + (uint8_t *)(start_tindata + INDEX_TIN_SCRIPT + i * T_IN_TX_LEN), + SCRIPT_SIZE) != 0) { + goto catch_cx_error; + } + if (MEMCMP(item->script, script, SCRIPT_SIZE) != 0) { + goto catch_cx_error; + } + + uint64_t value = 0; + { + parser_context_t pars_ctx; + parser_error_t pars_err; + + pars_ctx.offset = 0; + pars_ctx.buffer = start_tindata + INDEX_TIN_VALUE + i * T_IN_TX_LEN; + pars_ctx.bufferLen = 8; + pars_err = _readUInt64(&pars_ctx, &value); + if (pars_err != parser_ok) { + goto catch_cx_error; + } + } + + if (value != item->value) { + goto catch_cx_error; + } + signature_script_hash(start_tindata, start_signdata, + SAPLING_LENGTH_HASH_DATA, + start_tindata + i * T_IN_TX_LEN, T_IN_TX_LEN, i, + tx_version, message_digest); + size_t signatureLen = DER_MAX_SIZE; + CATCH_CXERROR(cx_ecdsa_sign_no_throw( + &cx_privateKey, CX_RND_RFC6979 | CX_LAST, CX_SHA256, message_digest, + CX_SHA256_SIZE, signature->step1.der_signature, &signatureLen, &info)) + + if (convertDERtoRSV(signature->step1.der_signature, info, + signature->step1.r, signature->step1.s, + &signature->step1.v) != no_error || + transparent_signatures_append(signature->step2.rs) != zxerr_ok) { + goto catch_cx_error; + } + } + error = zxerr_ok; catch_cx_error: - MEMZERO(&cx_publicKey, sizeof(cx_publicKey)); - MEMZERO(&cx_privateKey, sizeof(cx_privateKey)); - MEMZERO(privateKeyData, sizeof(privateKeyData)); - MEMZERO(pubKey, sizeof(pubKey)); - MEMZERO(script, sizeof(script)); - MEMZERO(message_digest, sizeof(message_digest)); - - return error; + MEMZERO(&cx_publicKey, sizeof(cx_publicKey)); + MEMZERO(&cx_privateKey, sizeof(cx_privateKey)); + MEMZERO(privateKeyData, sizeof(privateKeyData)); + MEMZERO(pubKey, sizeof(pubKey)); + MEMZERO(script, sizeof(script)); + MEMZERO(message_digest, sizeof(message_digest)); + + return error; } - typedef struct { - union { - // STEP 1 - struct { - uint8_t zip32_seed[ZIP32_SEED_SIZE]; - } step1; - - struct { - uint8_t ask[ASK_SIZE]; - uint8_t nsk[NSK_SIZE]; - } step2; - // STEP 2 - struct { - uint8_t rsk[ASK_SIZE]; - } step3; - }; + union { + // STEP 1 + struct { + uint8_t zip32_seed[ZIP32_SEED_SIZE]; + } step1; + + struct { + uint8_t ask[ASK_SIZE]; + uint8_t nsk[NSK_SIZE]; + } step2; + // STEP 2 + struct { + uint8_t rsk[ASK_SIZE]; + } step3; + }; } tmp_sign_s; // handleCheckandSign step 10/11 -zxerr_t crypto_signspends_sapling(uint8_t *buffer, uint16_t bufferLen, const uint8_t *txdata, const uint16_t txdatalen, const uint8_t tx_version) { - zemu_log_stack("crypto_signspends_sapling"); - if(spendlist_len() == 0){ - return zxerr_ok; - } - - MEMZERO(buffer, bufferLen); - - if(get_state() != STATE_VERIFIED_ALL_TXDATA ){ - return zxerr_unknown; - } - - if(length_t_in_data() + length_spenddata() + length_outputdata() + SAPLING_LENGTH_HASH_DATA != txdatalen){ - return zxerr_unknown; - } - - uint8_t *start_signdata = (uint8_t *)(txdata + start_sighashdata()); - uint8_t message[HASH_SIZE + 32] = {0}; - signature_hash(txdata, start_signdata,SAPLING_LENGTH_HASH_DATA, tx_version, message + 32); - tmp_sign_s tmp = {0}; - - //the path in zip32 is [FIRST_VALUE, COIN_TYPE, p] where p is u32 and last part of hdPath - // Temporarily get sk from Ed25519 - const uint8_t spendListLen = spendlist_len(); - for (uint8_t i = 0; i < spendListLen; i++) { - CHECK_ZXERROR_AND_CLEAN(crypto_fillSaplingSeed(tmp.step1.zip32_seed)) - const spend_item_t *item = spendlist_retrieve_item(i); - if (item == NULL){ - CHECK_ZXERROR_AND_CLEAN(zxerr_unknown) - } - // combining these causes a stack overflow - randomized_secret_from_seed(tmp.step1.zip32_seed,item->path, (uint8_t *)item->alpha, tmp.step3.rsk); - rsk_to_rk((uint8_t *)tmp.step3.rsk, message); - - sign_redjubjub(tmp.step3.rsk, message, buffer); - CHECK_ZXERROR_AND_CLEAN(spend_signatures_append(buffer)) - MEMZERO(&tmp, sizeof(tmp_sign_s)); - CHECK_APP_CANARY() +zxerr_t crypto_signspends_sapling(uint8_t *buffer, uint16_t bufferLen, + const uint8_t *txdata, + const uint16_t txdatalen, + const uint8_t tx_version) { + zemu_log_stack("crypto_signspends_sapling"); + if (spendlist_len() == 0) { + return zxerr_ok; + } + + MEMZERO(buffer, bufferLen); + + if (get_state() != STATE_VERIFIED_ALL_TXDATA) { + return zxerr_unknown; + } + + if (length_t_in_data() + length_spenddata() + length_outputdata() + + SAPLING_LENGTH_HASH_DATA != + txdatalen) { + return zxerr_unknown; + } + + uint8_t *start_signdata = (uint8_t *)(txdata + start_sighashdata()); + uint8_t message[HASH_SIZE + 32] = {0}; + signature_hash(txdata, start_signdata, SAPLING_LENGTH_HASH_DATA, tx_version, + message + 32); + tmp_sign_s tmp = {0}; + + // the path in zip32 is [FIRST_VALUE, COIN_TYPE, p] where p is u32 and last + // part of hdPath + // Temporarily get sk from Ed25519 + const uint8_t spendListLen = spendlist_len(); + for (uint8_t i = 0; i < spendListLen; i++) { + CHECK_ZXERROR_AND_CLEAN(crypto_fillSaplingSeed(tmp.step1.zip32_seed)) + const spend_item_t *item = spendlist_retrieve_item(i); + if (item == NULL) { + CHECK_ZXERROR_AND_CLEAN(zxerr_unknown) } + // combining these causes a stack overflow + randomized_secret_from_seed(tmp.step1.zip32_seed, item->path, + (uint8_t *)item->alpha, tmp.step3.rsk); + rsk_to_rk((uint8_t *)tmp.step3.rsk, message); + sign_redjubjub(tmp.step3.rsk, message, buffer); + CHECK_ZXERROR_AND_CLEAN(spend_signatures_append(buffer)) MEMZERO(&tmp, sizeof(tmp_sign_s)); - return zxerr_ok; + CHECK_APP_CANARY() + } + + MEMZERO(&tmp, sizeof(tmp_sign_s)); + return zxerr_ok; } // handleExtractTransparentSignature -zxerr_t crypto_extract_transparent_signature(uint8_t *buffer, uint16_t bufferLen){ - if(!transparent_signatures_more_extract()){ - return zxerr_unknown; - } - - if(get_state() != STATE_SIGNED_TX){ - return zxerr_unknown; - } - - MEMZERO(buffer, bufferLen); - return get_next_transparent_signature(buffer); +zxerr_t crypto_extract_transparent_signature(uint8_t *buffer, + uint16_t bufferLen) { + if (!transparent_signatures_more_extract()) { + return zxerr_unknown; + } + + if (get_state() != STATE_SIGNED_TX) { + return zxerr_unknown; + } + + MEMZERO(buffer, bufferLen); + return get_next_transparent_signature(buffer); } // handleExtractSpendSignature -zxerr_t crypto_extract_spend_signature(uint8_t *buffer, uint16_t bufferLen){ - if(!spend_signatures_more_extract()){ - return zxerr_unknown; - } +zxerr_t crypto_extract_spend_signature(uint8_t *buffer, uint16_t bufferLen) { + if (!spend_signatures_more_extract()) { + return zxerr_unknown; + } - if(get_state() != STATE_SIGNED_TX){ - return zxerr_unknown; - } + if (get_state() != STATE_SIGNED_TX) { + return zxerr_unknown; + } - MEMZERO(buffer, bufferLen); - return get_next_spend_signature(buffer); + MEMZERO(buffer, bufferLen); + return get_next_spend_signature(buffer); } // handleInitTX step 2/2 -- AND -- handleCheckandSign step 11/11 -zxerr_t crypto_hash_messagebuffer(uint8_t *buffer, uint16_t bufferLen, const uint8_t *txdata, uint16_t txdataLen){ - if(bufferLen < CX_SHA256_SIZE){ - return zxerr_unknown; - } - cx_hash_sha256(txdata, txdataLen, buffer, CX_SHA256_SIZE); // SHA256 - return zxerr_ok; +zxerr_t crypto_hash_messagebuffer(uint8_t *buffer, uint16_t bufferLen, + const uint8_t *txdata, uint16_t txdataLen) { + if (bufferLen < CX_SHA256_SIZE) { + return zxerr_unknown; + } + cx_hash_sha256(txdata, txdataLen, buffer, CX_SHA256_SIZE); // SHA256 + return zxerr_ok; } typedef struct { - uint8_t ivk[IVK_SIZE]; - uint8_t default_div[DIV_SIZE]; + uint8_t ivk[IVK_SIZE]; + uint8_t default_div[DIV_SIZE]; } tmp_sapling_ivk_and_default_div; -// handleGetKeyIVK: return the incoming viewing key for a given path and the default diversifier -zxerr_t crypto_ivk_sapling(uint8_t *buffer, uint16_t bufferLen, uint32_t p, uint16_t *replyLen) { - zemu_log_stack("crypto_ivk_sapling"); +// handleGetKeyIVK: return the incoming viewing key for a given path and the +// default diversifier +zxerr_t crypto_ivk_sapling(uint8_t *buffer, uint16_t bufferLen, uint32_t p, + uint16_t *replyLen) { + zemu_log_stack("crypto_ivk_sapling"); - tmp_sapling_ivk_and_default_div *out = (tmp_sapling_ivk_and_default_div *) buffer; - MEMZERO(buffer, bufferLen); + tmp_sapling_ivk_and_default_div *out = + (tmp_sapling_ivk_and_default_div *)buffer; + MEMZERO(buffer, bufferLen); - //the path in zip32 is [FIRST_VALUE, COIN_TYPE, p] where p is u32 and last part of hdPath - uint8_t zip32_seed[ZIP32_SEED_SIZE] = {0}; - - // Temporarily get sk from Ed25519 - if (crypto_fillSaplingSeed(zip32_seed) != zxerr_ok) { - MEMZERO(buffer, bufferLen); - MEMZERO(zip32_seed, sizeof(zip32_seed)); - *replyLen = 0; - return zxerr_unknown; - } + // the path in zip32 is [FIRST_VALUE, COIN_TYPE, p] where p is u32 and last + // part of hdPath + uint8_t zip32_seed[ZIP32_SEED_SIZE] = {0}; - CHECK_APP_CANARY() - // get incomming viewing key - zip32_ivk(zip32_seed, out->ivk, p); - CHECK_APP_CANARY() - // get default diversifier for start index 0 - get_default_diversifier_without_start_index(zip32_seed, p, out->default_div); + // Temporarily get sk from Ed25519 + if (crypto_fillSaplingSeed(zip32_seed) != zxerr_ok) { + MEMZERO(buffer, bufferLen); MEMZERO(zip32_seed, sizeof(zip32_seed)); - CHECK_APP_CANARY() - *replyLen = IVK_SIZE + DIV_SIZE; - return zxerr_ok; + *replyLen = 0; + return zxerr_unknown; + } + + CHECK_APP_CANARY() + // get incomming viewing key + zip32_ivk(zip32_seed, out->ivk, p); + CHECK_APP_CANARY() + // get default diversifier for start index 0 + get_default_diversifier_without_start_index(zip32_seed, p, out->default_div); + MEMZERO(zip32_seed, sizeof(zip32_seed)); + CHECK_APP_CANARY() + *replyLen = IVK_SIZE + DIV_SIZE; + return zxerr_ok; } // handleGetKeyOVK -zxerr_t crypto_ovk_sapling(uint8_t *buffer, uint16_t bufferLen, uint32_t p, uint16_t *replyLen){ - MEMZERO(buffer, bufferLen); - - zemu_log_stack("crypto_ovk_sapling"); - uint8_t zip32_seed[ZIP32_SEED_SIZE] = {0}; - +zxerr_t crypto_ovk_sapling(uint8_t *buffer, uint16_t bufferLen, uint32_t p, + uint16_t *replyLen) { + MEMZERO(buffer, bufferLen); - // Temporarily get sk from Ed25519 - if (crypto_fillSaplingSeed(zip32_seed) != zxerr_ok) { - MEMZERO(zip32_seed, sizeof(zip32_seed)); - MEMZERO(buffer, bufferLen); - *replyLen = 0; - return zxerr_unknown; - } - CHECK_APP_CANARY() + zemu_log_stack("crypto_ovk_sapling"); + uint8_t zip32_seed[ZIP32_SEED_SIZE] = {0}; - zip32_ovk(zip32_seed, buffer, p); - CHECK_APP_CANARY() + // Temporarily get sk from Ed25519 + if (crypto_fillSaplingSeed(zip32_seed) != zxerr_ok) { MEMZERO(zip32_seed, sizeof(zip32_seed)); + MEMZERO(buffer, bufferLen); + *replyLen = 0; + return zxerr_unknown; + } + CHECK_APP_CANARY() - *replyLen = OVK_SIZE; - return zxerr_ok; + zip32_ovk(zip32_seed, buffer, p); + CHECK_APP_CANARY() + MEMZERO(zip32_seed, sizeof(zip32_seed)); + + *replyLen = OVK_SIZE; + return zxerr_ok; } typedef struct { - uint8_t fvk[AK_SIZE + NK_SIZE + OVK_SIZE]; + uint8_t fvk[AK_SIZE + NK_SIZE + OVK_SIZE]; } tmp_sapling_fvk; // handleGetKeyFVK: return the full viewing key for a given path -zxerr_t crypto_fvk_sapling(uint8_t *buffer, uint16_t bufferLen, uint32_t p, uint16_t *replyLen) { +zxerr_t crypto_fvk_sapling(uint8_t *buffer, uint16_t bufferLen, uint32_t p, + uint16_t *replyLen) { - zemu_log_stack("crypto_fvk_sapling"); + zemu_log_stack("crypto_fvk_sapling"); - MEMZERO(buffer, bufferLen); - tmp_sapling_fvk *out = (tmp_sapling_fvk *) buffer; - - //the path in zip32 is [FIRST_VALUE, COIN_TYPE, p] where p is u32 and last part of hdPath - uint8_t zip32_seed[ZIP32_SEED_SIZE] = {0}; - - // Temporarily get sk from Ed25519 - if (crypto_fillSaplingSeed(zip32_seed) !=zxerr_ok) { - MEMZERO(zip32_seed, sizeof(zip32_seed)); - MEMZERO(buffer, bufferLen); - *replyLen = 0; - return zxerr_unknown; - } - CHECK_APP_CANARY() + MEMZERO(buffer, bufferLen); + tmp_sapling_fvk *out = (tmp_sapling_fvk *)buffer; - // get full viewing key - zip32_fvk(zip32_seed, out->fvk, p); - CHECK_APP_CANARY() + // the path in zip32 is [FIRST_VALUE, COIN_TYPE, p] where p is u32 and last + // part of hdPath + uint8_t zip32_seed[ZIP32_SEED_SIZE] = {0}; + // Temporarily get sk from Ed25519 + if (crypto_fillSaplingSeed(zip32_seed) != zxerr_ok) { MEMZERO(zip32_seed, sizeof(zip32_seed)); - *replyLen = AK_SIZE + NK_SIZE + OVK_SIZE; - return zxerr_ok; + MEMZERO(buffer, bufferLen); + *replyLen = 0; + return zxerr_unknown; + } + CHECK_APP_CANARY() + + // get full viewing key + zip32_fvk(zip32_seed, out->fvk, p); + CHECK_APP_CANARY() + + MEMZERO(zip32_seed, sizeof(zip32_seed)); + *replyLen = AK_SIZE + NK_SIZE + OVK_SIZE; + return zxerr_ok; } // handleGetNullifier -zxerr_t crypto_nullifier_sapling(uint8_t *buffer, uint16_t bufferLen, uint64_t notepos, uint8_t *cm, - uint16_t *replyLen){ - zemu_log_stack("crypto_nullifier_sapling"); +zxerr_t crypto_nullifier_sapling(uint8_t *buffer, uint16_t bufferLen, + uint64_t notepos, uint8_t *cm, + uint16_t *replyLen) { + zemu_log_stack("crypto_nullifier_sapling"); - MEMZERO(buffer, bufferLen); + MEMZERO(buffer, bufferLen); - uint8_t zip32_seed[ZIP32_SEED_SIZE] = {0}; - uint8_t nsk[NSK_SIZE] = {0}; - - if (crypto_fillSaplingSeed(zip32_seed) !=zxerr_ok) { - MEMZERO(zip32_seed, sizeof(zip32_seed)); - MEMZERO(buffer, bufferLen); - *replyLen = 0; - return zxerr_unknown; - } - CHECK_APP_CANARY() - // nk can be computed from nsk which itself can be computed from the seed. - zip32_nsk_from_seed(zip32_seed, nsk); - compute_nullifier(cm, notepos, nsk, buffer); - CHECK_APP_CANARY() + uint8_t zip32_seed[ZIP32_SEED_SIZE] = {0}; + uint8_t nsk[NSK_SIZE] = {0}; + if (crypto_fillSaplingSeed(zip32_seed) != zxerr_ok) { MEMZERO(zip32_seed, sizeof(zip32_seed)); - MEMZERO(nsk, sizeof(nsk)); - *replyLen = NULLIFIER_SIZE; - return zxerr_ok; + MEMZERO(buffer, bufferLen); + *replyLen = 0; + return zxerr_unknown; + } + CHECK_APP_CANARY() + // nk can be computed from nsk which itself can be computed from the seed. + zip32_nsk_from_seed(zip32_seed, nsk); + compute_nullifier(cm, notepos, nsk, buffer); + CHECK_APP_CANARY() + + MEMZERO(zip32_seed, sizeof(zip32_seed)); + MEMZERO(nsk, sizeof(nsk)); + *replyLen = NULLIFIER_SIZE; + return zxerr_ok; } // handleGetDiversifierList -zxerr_t crypto_diversifier_with_startindex(uint8_t *buffer, uint32_t p, const uint8_t *startindex, uint16_t *replylen) { - zemu_log_stack("crypto_get_diversifiers_sapling"); +zxerr_t crypto_diversifier_with_startindex(uint8_t *buffer, uint32_t p, + const uint8_t *startindex, + uint16_t *replylen) { + zemu_log_stack("crypto_get_diversifiers_sapling"); - //the path in zip32 is [FIRST_VALUE, COIN_TYPE, p] where p is u32 and last part of hdPath - uint8_t zip32_seed[ZIP32_SEED_SIZE] = {0}; + // the path in zip32 is [FIRST_VALUE, COIN_TYPE, p] where p is u32 and last + // part of hdPath + uint8_t zip32_seed[ZIP32_SEED_SIZE] = {0}; - // Temporarily get sk from Ed25519 - if (crypto_fillSaplingSeed(zip32_seed) !=zxerr_ok) { - MEMZERO(zip32_seed, sizeof(zip32_seed)); - *replylen = 0; - return zxerr_unknown; - } - CHECK_APP_CANARY() + // Temporarily get sk from Ed25519 + if (crypto_fillSaplingSeed(zip32_seed) != zxerr_ok) { + MEMZERO(zip32_seed, sizeof(zip32_seed)); + *replylen = 0; + return zxerr_unknown; + } + CHECK_APP_CANARY() - get_diversifier_list_withstartindex(zip32_seed, p, startindex, buffer); - for(int i = 0; i < DIV_LIST_LENGTH; i++){ - if (!is_valid_diversifier(buffer + i * DIV_SIZE)){ - MEMZERO(buffer + i * DIV_SIZE, DIV_SIZE); - } + get_diversifier_list_withstartindex(zip32_seed, p, startindex, buffer); + for (int i = 0; i < DIV_LIST_LENGTH; i++) { + if (!is_valid_diversifier(buffer + i * DIV_SIZE)) { + MEMZERO(buffer + i * DIV_SIZE, DIV_SIZE); } + } - MEMZERO(zip32_seed, sizeof(zip32_seed)); - *replylen = DIV_LIST_LENGTH * DIV_SIZE; - return zxerr_ok; + MEMZERO(zip32_seed, sizeof(zip32_seed)); + *replylen = DIV_LIST_LENGTH * DIV_SIZE; + return zxerr_ok; } typedef struct { - union { - struct { - uint8_t diversifier[DIV_SIZE]; - uint8_t pkd[PKD_SIZE]; - }; - struct { - uint8_t address_raw[ADDR_LEN_SAPLING]; - char address_bech32[100]; - }; - struct { - uint8_t dummy[ADDR_LEN_SAPLING]; - uint8_t startindex[DIV_INDEX_SIZE]; - }; + union { + struct { + uint8_t diversifier[DIV_SIZE]; + uint8_t pkd[PKD_SIZE]; + }; + struct { + uint8_t address_raw[ADDR_LEN_SAPLING]; + char address_bech32[100]; + }; + struct { + uint8_t dummy[ADDR_LEN_SAPLING]; + uint8_t startindex[DIV_INDEX_SIZE]; }; + }; } tmp_buf_addr_s; // handleGetAddrSaplingDiv -zxerr_t crypto_fillAddress_with_diversifier_sapling(uint8_t *buffer, uint16_t bufferLen, uint32_t p, uint8_t *div, uint16_t *replyLen) { - if (bufferLen < sizeof(tmp_buf_addr_s)) { - return zxerr_unknown; - } +zxerr_t crypto_fillAddress_with_diversifier_sapling(uint8_t *buffer, + uint16_t bufferLen, + uint32_t p, uint8_t *div, + uint16_t *replyLen) { + if (bufferLen < sizeof(tmp_buf_addr_s)) { + return zxerr_unknown; + } - MEMZERO(buffer, bufferLen); + MEMZERO(buffer, bufferLen); - zemu_log_stack("crypto_fillAddress_with_div_sapling"); + zemu_log_stack("crypto_fillAddress_with_div_sapling"); - tmp_buf_addr_s *const out = (tmp_buf_addr_s *) buffer; + tmp_buf_addr_s *const out = (tmp_buf_addr_s *)buffer; - uint8_t zip32_seed[ZIP32_SEED_SIZE] = {0}; + uint8_t zip32_seed[ZIP32_SEED_SIZE] = {0}; - MEMCPY(out->diversifier, div, DIV_SIZE); - if (!is_valid_diversifier(out->diversifier)){ - return zxerr_unknown; - } - - // Temporarily get sk from Ed25519 - if (crypto_fillSaplingSeed(zip32_seed) != zxerr_ok) { - MEMZERO(zip32_seed, sizeof(zip32_seed)); - *replyLen = 0; - return zxerr_unknown; - } - CHECK_APP_CANARY() - - get_pkd(zip32_seed, p, out->diversifier, out->pkd); - CHECK_APP_CANARY() + MEMCPY(out->diversifier, div, DIV_SIZE); + if (!is_valid_diversifier(out->diversifier)) { + return zxerr_unknown; + } + // Temporarily get sk from Ed25519 + if (crypto_fillSaplingSeed(zip32_seed) != zxerr_ok) { MEMZERO(zip32_seed, sizeof(zip32_seed)); + *replyLen = 0; + return zxerr_unknown; + } + CHECK_APP_CANARY() - if (bech32EncodeFromBytes(out->address_bech32, sizeof_field(tmp_buf_addr_s, address_bech32), - BECH32_HRP, - out->address_raw, - sizeof_field(tmp_buf_addr_s, address_raw), - 1, BECH32_ENCODING_BECH32) != zxerr_ok) { + get_pkd(zip32_seed, p, out->diversifier, out->pkd); + CHECK_APP_CANARY() - MEMZERO(out, bufferLen); - *replyLen = 0; - return zxerr_unknown; - } + MEMZERO(zip32_seed, sizeof(zip32_seed)); - CHECK_APP_CANARY() - *replyLen = sizeof_field(tmp_buf_addr_s, address_raw) + strlen((const char *) out->address_bech32); - return zxerr_ok; + if (bech32EncodeFromBytes(out->address_bech32, + sizeof_field(tmp_buf_addr_s, address_bech32), + BECH32_HRP, out->address_raw, + sizeof_field(tmp_buf_addr_s, address_raw), 1, + BECH32_ENCODING_BECH32) != zxerr_ok) { + + MEMZERO(out, bufferLen); + *replyLen = 0; + return zxerr_unknown; + } + + CHECK_APP_CANARY() + *replyLen = sizeof_field(tmp_buf_addr_s, address_raw) + + strlen((const char *)out->address_bech32); + return zxerr_ok; } // handleGetAddrSapling -zxerr_t crypto_fillAddress_sapling(uint8_t *buffer, uint16_t bufferLen, uint32_t p, uint16_t *replyLen) { - if (bufferLen < sizeof(tmp_buf_addr_s)) { - return zxerr_unknown; - } - - zemu_log_stack("crypto_fillAddress_sapling"); - tmp_buf_addr_s *const out = (tmp_buf_addr_s *) buffer; - MEMZERO(buffer, bufferLen); - - //the path in zip32 is [FIRST_VALUE, COIN_TYPE, p] where p is u32 and last part of hdPath - uint8_t zip32_seed[ZIP32_SEED_SIZE] = {0}; - - // Temporarily get sk from Ed25519 - if (crypto_fillSaplingSeed(zip32_seed) != zxerr_ok) { - MEMZERO(zip32_seed, sizeof(zip32_seed)); - *replyLen = 0; - return zxerr_unknown; - } - CHECK_APP_CANARY() - - get_pkd_from_seed(zip32_seed, p, out->startindex, out->diversifier, out->pkd); - MEMZERO(out + DIV_SIZE, MAX_SIZE_BUF_ADDR - DIV_SIZE); - CHECK_APP_CANARY() - +zxerr_t crypto_fillAddress_sapling(uint8_t *buffer, uint16_t bufferLen, + uint32_t p, uint16_t *replyLen) { + if (bufferLen < sizeof(tmp_buf_addr_s)) { + return zxerr_unknown; + } + + zemu_log_stack("crypto_fillAddress_sapling"); + tmp_buf_addr_s *const out = (tmp_buf_addr_s *)buffer; + MEMZERO(buffer, bufferLen); + + // the path in zip32 is [FIRST_VALUE, COIN_TYPE, p] where p is u32 and last + // part of hdPath + uint8_t zip32_seed[ZIP32_SEED_SIZE] = {0}; + + // Temporarily get sk from Ed25519 + if (crypto_fillSaplingSeed(zip32_seed) != zxerr_ok) { MEMZERO(zip32_seed, sizeof(zip32_seed)); - if (bech32EncodeFromBytes(out->address_bech32, sizeof_field(tmp_buf_addr_s, address_bech32), - BECH32_HRP, - out->address_raw, - sizeof_field(tmp_buf_addr_s, address_raw), - 1, BECH32_ENCODING_BECH32) != zxerr_ok) { - MEMZERO(out, bufferLen); - *replyLen = 0; - return zxerr_unknown; - } - CHECK_APP_CANARY() - - *replyLen = sizeof_field(tmp_buf_addr_s, address_raw) + strlen((const char *) out->address_bech32); - return zxerr_ok; + *replyLen = 0; + return zxerr_unknown; + } + CHECK_APP_CANARY() + + get_pkd_from_seed(zip32_seed, p, out->startindex, out->diversifier, out->pkd); + MEMZERO(out + DIV_SIZE, MAX_SIZE_BUF_ADDR - DIV_SIZE); + CHECK_APP_CANARY() + + MEMZERO(zip32_seed, sizeof(zip32_seed)); + if (bech32EncodeFromBytes(out->address_bech32, + sizeof_field(tmp_buf_addr_s, address_bech32), + BECH32_HRP, out->address_raw, + sizeof_field(tmp_buf_addr_s, address_raw), 1, + BECH32_ENCODING_BECH32) != zxerr_ok) { + MEMZERO(out, bufferLen); + *replyLen = 0; + return zxerr_unknown; + } + CHECK_APP_CANARY() + + *replyLen = sizeof_field(tmp_buf_addr_s, address_raw) + + strlen((const char *)out->address_bech32); + return zxerr_ok; } diff --git a/app/src/crypto.h b/app/src/crypto.h index 71b19e2d..e81bfe28 100644 --- a/app/src/crypto.h +++ b/app/src/crypto.h @@ -1,18 +1,18 @@ /******************************************************************************* -* (c) 2018 -2022 Zondax AG -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -********************************************************************************/ + * (c) 2018 -2022 Zondax AG + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ********************************************************************************/ #pragma once @@ -20,12 +20,11 @@ extern "C" { #endif -#include #include "coin.h" -#include -#include #include "zxerror.h" - +#include +#include +#include extern uint32_t hdPath[HDPATH_LEN_DEFAULT]; @@ -33,55 +32,88 @@ extern address_kind_e addressKind; zxerr_t crypto_fillSaplingSeed(uint8_t *sk); -zxerr_t crypto_fillAddress_secp256k1(uint8_t *buffer, uint16_t bufferLen, uint16_t *replyLen); +zxerr_t crypto_fillAddress_secp256k1(uint8_t *buffer, uint16_t bufferLen, + uint16_t *replyLen); -zxerr_t crypto_fillAddress_sapling(uint8_t *buffer, uint16_t bufferLen, uint32_t p, uint16_t *replyLen); -zxerr_t crypto_fillAddress_with_diversifier_sapling(uint8_t *buffer, uint16_t bufferLen, uint32_t p, uint8_t *div, +zxerr_t crypto_fillAddress_sapling(uint8_t *buffer, uint16_t bufferLen, + uint32_t p, uint16_t *replyLen); +zxerr_t crypto_fillAddress_with_diversifier_sapling(uint8_t *buffer, + uint16_t bufferLen, + uint32_t p, uint8_t *div, uint16_t *replyLen); -zxerr_t crypto_diversifier_with_startindex(uint8_t *buffer, uint32_t p, const uint8_t *startindex, +zxerr_t crypto_diversifier_with_startindex(uint8_t *buffer, uint32_t p, + const uint8_t *startindex, uint16_t *replylen); -zxerr_t crypto_ivk_sapling(uint8_t *buffer, uint16_t bufferLen, uint32_t p, uint16_t *replyLen); -zxerr_t crypto_ovk_sapling(uint8_t *buffer, uint16_t bufferLen, uint32_t p, uint16_t *replyLen); -zxerr_t crypto_fvk_sapling(uint8_t *buffer, uint16_t bufferLen, uint32_t p, uint16_t *replyLen); -zxerr_t crypto_nullifier_sapling(uint8_t *buffer, uint16_t bufferLen, uint64_t notepos, - uint8_t *cm, uint16_t *replyLen); - -zxerr_t crypto_hash_messagebuffer(uint8_t *buffer, uint16_t bufferLen, const uint8_t *txdata, uint16_t txdataLen); +zxerr_t crypto_ivk_sapling(uint8_t *buffer, uint16_t bufferLen, uint32_t p, + uint16_t *replyLen); +zxerr_t crypto_ovk_sapling(uint8_t *buffer, uint16_t bufferLen, uint32_t p, + uint16_t *replyLen); +zxerr_t crypto_fvk_sapling(uint8_t *buffer, uint16_t bufferLen, uint32_t p, + uint16_t *replyLen); +zxerr_t crypto_nullifier_sapling(uint8_t *buffer, uint16_t bufferLen, + uint64_t notepos, uint8_t *cm, + uint16_t *replyLen); -zxerr_t crypto_checkspend_sapling(uint8_t *buffer, uint16_t bufferLen, const uint8_t *spenddata, uint16_t spenddatalen, const uint8_t tx_version); +zxerr_t crypto_hash_messagebuffer(uint8_t *buffer, uint16_t bufferLen, + const uint8_t *txdata, uint16_t txdataLen); -zxerr_t crypto_checkoutput_sapling(uint8_t *buffer, uint16_t bufferLen, const uint8_t *outputdata, - const uint16_t outputdatalen, const uint8_t tx_version); +zxerr_t crypto_checkspend_sapling(uint8_t *buffer, uint16_t bufferLen, + const uint8_t *spenddata, + uint16_t spenddatalen, + const uint8_t tx_version); -zxerr_t crypto_checkencryptions_sapling(uint8_t *buffer, uint16_t bufferLen, const uint8_t *outputdata); +zxerr_t crypto_checkoutput_sapling(uint8_t *buffer, uint16_t bufferLen, + const uint8_t *outputdata, + const uint16_t outputdatalen, + const uint8_t tx_version); -uint16_t crypto_key_exchange(uint8_t *buffer, uint16_t bufferLen, const uint8_t *txdata, const uint16_t txdatalen); -zxerr_t crypto_extracttx_sapling(uint8_t *buffer, uint16_t bufferLen, const uint8_t *txdata, const uint16_t txdatalen); +zxerr_t crypto_checkencryptions_sapling(uint8_t *buffer, uint16_t bufferLen, + const uint8_t *outputdata); -zxerr_t crypto_extract_spend_proofkeyandrnd(uint8_t *buffer, uint16_t bufferLen); +uint16_t crypto_key_exchange(uint8_t *buffer, uint16_t bufferLen, + const uint8_t *txdata, const uint16_t txdatalen); +zxerr_t crypto_extracttx_sapling(uint8_t *buffer, uint16_t bufferLen, + const uint8_t *txdata, + const uint16_t txdatalen); -zxerr_t crypto_extract_output_rnd(uint8_t *buffer, uint16_t bufferLen, uint16_t *replyLen); +zxerr_t crypto_extract_spend_proofkeyandrnd(uint8_t *buffer, + uint16_t bufferLen); -zxerr_t crypto_signspends_sapling(uint8_t *buffer, uint16_t bufferLen, const uint8_t *signdata, uint16_t signdatalen, const uint8_t tx_version); +zxerr_t crypto_extract_output_rnd(uint8_t *buffer, uint16_t bufferLen, + uint16_t *replyLen); +zxerr_t crypto_signspends_sapling(uint8_t *buffer, uint16_t bufferLen, + const uint8_t *signdata, uint16_t signdatalen, + const uint8_t tx_version); zxerr_t crypto_extract_spend_signature(uint8_t *buffer, uint16_t bufferLen); -zxerr_t crypto_check_prevouts(uint8_t *buffer, uint16_t bufferLen, const uint8_t *txdata, const uint8_t tx_version); +zxerr_t crypto_check_prevouts(uint8_t *buffer, uint16_t bufferLen, + const uint8_t *txdata, const uint8_t tx_version); -zxerr_t crypto_check_sequence(uint8_t *buffer, uint16_t bufferLen, const uint8_t *txdata, const uint8_t tx_version); +zxerr_t crypto_check_sequence(uint8_t *buffer, uint16_t bufferLen, + const uint8_t *txdata, const uint8_t tx_version); -zxerr_t crypto_check_outputs(uint8_t *buffer, uint16_t bufferLen, const uint8_t *txdata, const uint16_t txdatalen, const uint8_t tx_version); +zxerr_t crypto_check_outputs(uint8_t *buffer, uint16_t bufferLen, + const uint8_t *txdata, const uint16_t txdatalen, + const uint8_t tx_version); -zxerr_t crypto_check_joinsplits(uint8_t *buffer, uint16_t bufferLen, const uint8_t *txdata, const uint8_t tx_version); +zxerr_t crypto_check_joinsplits(uint8_t *buffer, uint16_t bufferLen, + const uint8_t *txdata, + const uint8_t tx_version); -zxerr_t crypto_check_valuebalance(uint8_t *buffer, uint16_t bufferLen, const uint8_t *txdata, const uint8_t tx_version); +zxerr_t crypto_check_valuebalance(uint8_t *buffer, uint16_t bufferLen, + const uint8_t *txdata, + const uint8_t tx_version); void address_to_script(uint8_t *address, uint8_t *output); -zxerr_t -crypto_sign_and_check_transparent(uint8_t *buffer, uint16_t bufferLen, const uint8_t *txdata, const uint16_t txdatalen, const uint8_t tx_version); -zxerr_t crypto_extract_transparent_signature(uint8_t *buffer, uint16_t bufferLen); +zxerr_t crypto_sign_and_check_transparent(uint8_t *buffer, uint16_t bufferLen, + const uint8_t *txdata, + const uint16_t txdatalen, + const uint8_t tx_version); +zxerr_t crypto_extract_transparent_signature(uint8_t *buffer, + uint16_t bufferLen); #ifdef __cplusplus } #endif diff --git a/app/src/index_NU5.h b/app/src/index_NU5.h index 14af7876..c770cfbd 100644 --- a/app/src/index_NU5.h +++ b/app/src/index_NU5.h @@ -1,36 +1,35 @@ /******************************************************************************* -* (c) 2018 -2022 Zondax AG -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -********************************************************************************/ + * (c) 2018 -2022 Zondax AG + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ********************************************************************************/ #include -#define NU5_LENGTH_HASH_DATA 220 +#define NU5_LENGTH_HASH_DATA 220 -#define NU5_INDEX_HASH_VERSION 0 -#define NU5_INDEX_HASH_VERSION_GROUP_ID 4 -#define NU5_INDEX_HASH_CONSENSUS_BRANCH_ID 8 -#define NU5_INDEX_HASH_LOCK_TIME 12 -#define NU5_INDEX_EXPIRY_HEIGHT 16 +#define NU5_INDEX_HASH_VERSION 0 +#define NU5_INDEX_HASH_VERSION_GROUP_ID 4 +#define NU5_INDEX_HASH_CONSENSUS_BRANCH_ID 8 +#define NU5_INDEX_HASH_LOCK_TIME 12 +#define NU5_INDEX_EXPIRY_HEIGHT 16 -#define NU5_INDEX_HASH_PREVOUTSHASH 20 // 32 bytes -#define NU5_INDEX_HASH_SEQUENCEHASH 52 // 32 bytes -#define NU5_INDEX_HASH_OUTPUTSHASH 84 // 32 bytes -#define NU5_INDEX_HASH_SHIELDEDSPENDHASH 116 // 32 bytes -#define NU5_INDEX_HASH_SHIELDEDOUTPUTHASH 148 // 32 bytes -#define NU5_INDEX_HASH_VALUEBALANCE 180 // 64 bit -#define NU5_INDEX_HASH_ORCHARDHASH 188 // of length 32 +#define NU5_INDEX_HASH_PREVOUTSHASH 20 // 32 bytes +#define NU5_INDEX_HASH_SEQUENCEHASH 52 // 32 bytes +#define NU5_INDEX_HASH_OUTPUTSHASH 84 // 32 bytes +#define NU5_INDEX_HASH_SHIELDEDSPENDHASH 116 // 32 bytes +#define NU5_INDEX_HASH_SHIELDEDOUTPUTHASH 148 // 32 bytes +#define NU5_INDEX_HASH_VALUEBALANCE 180 // 64 bit +#define NU5_INDEX_HASH_ORCHARDHASH 188 // of length 32 - -#define NU5_VALUEBALANCE_SIZE 8 // 64 bit +#define NU5_VALUEBALANCE_SIZE 8 // 64 bit diff --git a/app/src/index_sapling.c b/app/src/index_sapling.c index c869fd15..415260fb 100644 --- a/app/src/index_sapling.c +++ b/app/src/index_sapling.c @@ -1,42 +1,34 @@ /******************************************************************************* -* (c) 2020 Zondax AG -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -********************************************************************************/ + * (c) 2020 Zondax AG + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ********************************************************************************/ #include "index_sapling.h" #include "nvdata.h" -uint16_t length_t_in_data() { - return t_inlist_len() * T_IN_TX_LEN; -}; +uint16_t length_t_in_data() { return t_inlist_len() * T_IN_TX_LEN; }; -uint16_t length_spend_old_data() { - return spendlist_len() * SPEND_OLD_TX_LEN; -} +uint16_t length_spend_old_data() { return spendlist_len() * SPEND_OLD_TX_LEN; } uint16_t length_spenddata() { - return spendlist_len() * (SPEND_TX_LEN + SPEND_OLD_TX_LEN); + return spendlist_len() * (SPEND_TX_LEN + SPEND_OLD_TX_LEN); }; -uint16_t length_outputdata() { - return outputlist_len() * OUTPUT_TX_LEN; -}; +uint16_t length_outputdata() { return outputlist_len() * OUTPUT_TX_LEN; }; -uint16_t length_spend_new_data() { - return spendlist_len() * SPEND_TX_LEN; -}; +uint16_t length_spend_new_data() { return spendlist_len() * SPEND_TX_LEN; }; uint16_t start_sighashdata() { - return length_t_in_data() + length_spenddata() + length_outputdata(); + return length_t_in_data() + length_spenddata() + length_outputdata(); }; diff --git a/app/src/index_sapling.h b/app/src/index_sapling.h index 4acfa02a..0f53f1c4 100644 --- a/app/src/index_sapling.h +++ b/app/src/index_sapling.h @@ -1,81 +1,84 @@ /******************************************************************************* -* (c) 2018 -2022 Zondax AG -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -********************************************************************************/ + * (c) 2018 -2022 Zondax AG + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ********************************************************************************/ #include -#define T_IN_INPUT_LEN 54 //fixme: maybe add more options to HDPATH -#define T_OUT_INPUT_LEN 34 -#define SPEND_INPUT_LEN 55 -#define OUTPUT_INPUT_LEN 85 - -#define INDEX_INPUT_TIN_PATH 0 -#define INDEX_INPUT_TIN_SCRIPT 20 -#define INDEX_INPUT_TIN_VALUE 46 - -#define INDEX_INPUT_TOUT_ADDR 0 -#define INDEX_INPUT_TOUT_VALUE 26 - -#define INDEX_INPUT_SPENDPOS 0 -#define INDEX_INPUT_INPUTDIV 4 -#define INDEX_INPUT_INPUTPKD 15 -#define INDEX_INPUT_INPUTVALUE 47 - -#define INDEX_INPUT_OUTPUTDIV 0 -#define INDEX_INPUT_OUTPUTPKD 11 -#define INDEX_INPUT_OUTPUTVALUE 43 -#define INDEX_INPUT_OUTPUTMEMO 51 -#define INDEX_INPUT_OUTPUTOVK 52 - -#define SPEND_EXTRACT_LEN 128 -#define OUTPUT_EXTRACT_LEN 64 - -#define T_IN_TX_LEN 74 // size of tx_in encoded as in bitcoin. The same across all tx versions -#define SPEND_OLD_TX_LEN 40 -#define SPEND_TX_LEN 320 // cv (32) + anchor (32) + nullifier (32) + rk (32) + zkproof (192) -#define OUTPUT_TX_LEN 948 - -#define INDEX_TIN_PREVOUT 0 -#define INDEX_TIN_SCRIPT 36 -#define INDEX_TIN_VALUE 62 -#define INDEX_TIN_SEQ 70 - -#define INDEX_SPEND_OLD_RCM 0 -#define INDEX_SPEND_OLD_NOTEPOS 32 - -#define INDEX_SPEND_VALUECMT 0 -#define INDEX_SPEND_ANCHOR 32 -#define INDEX_SPEND_NF 64 -#define INDEX_SPEND_RK 96 - -#define INDEX_OUTPUT_VALUECMT 0 -#define INDEX_OUTPUT_NOTECMT 32 -#define INDEX_OUTPUT_EPK 64 -#define INDEX_OUTPUT_ENC 96 -#define INDEX_OUTPUT_ENC_MEMO 96 + 52 // contents of the encrypted memo field -#define INDEX_OUTPUT_ENC_AEAD_TAG 96 + 564 // contents of the encrypted memo field -#define INDEX_OUTPUT_OUT 676 - -#define SAPLING_LENGTH_HASH_DATA 220 -#define SAPLING_INDEX_HASH_PREVOUTSHASH 8 -#define SAPLING_INDEX_HASH_SEQUENCEHASH 40 -#define SAPLING_INDEX_HASH_OUTPUTSHASH 72 -#define SAPLING_INDEX_HASH_JOINSPLITSHASH 104 -#define SAPLING_INDEX_HASH_SHIELDEDSPENDHASH 136 -#define SAPLING_INDEX_HASH_SHIELDEDOUTPUTHASH 168 -#define SAPLING_INDEX_HASH_VALUEBALANCE 208 +#define T_IN_INPUT_LEN 54 // fixme: maybe add more options to HDPATH +#define T_OUT_INPUT_LEN 34 +#define SPEND_INPUT_LEN 55 +#define OUTPUT_INPUT_LEN 85 + +#define INDEX_INPUT_TIN_PATH 0 +#define INDEX_INPUT_TIN_SCRIPT 20 +#define INDEX_INPUT_TIN_VALUE 46 + +#define INDEX_INPUT_TOUT_ADDR 0 +#define INDEX_INPUT_TOUT_VALUE 26 + +#define INDEX_INPUT_SPENDPOS 0 +#define INDEX_INPUT_INPUTDIV 4 +#define INDEX_INPUT_INPUTPKD 15 +#define INDEX_INPUT_INPUTVALUE 47 + +#define INDEX_INPUT_OUTPUTDIV 0 +#define INDEX_INPUT_OUTPUTPKD 11 +#define INDEX_INPUT_OUTPUTVALUE 43 +#define INDEX_INPUT_OUTPUTMEMO 51 +#define INDEX_INPUT_OUTPUTOVK 52 + +#define SPEND_EXTRACT_LEN 128 +#define OUTPUT_EXTRACT_LEN 64 + +#define T_IN_TX_LEN \ + 74 // size of tx_in encoded as in bitcoin. The same across all tx versions +#define SPEND_OLD_TX_LEN 40 +#define SPEND_TX_LEN \ + 320 // cv (32) + anchor (32) + nullifier (32) + rk (32) + zkproof (192) +#define OUTPUT_TX_LEN 948 + +#define INDEX_TIN_PREVOUT 0 +#define INDEX_TIN_SCRIPT 36 +#define INDEX_TIN_VALUE 62 +#define INDEX_TIN_SEQ 70 + +#define INDEX_SPEND_OLD_RCM 0 +#define INDEX_SPEND_OLD_NOTEPOS 32 + +#define INDEX_SPEND_VALUECMT 0 +#define INDEX_SPEND_ANCHOR 32 +#define INDEX_SPEND_NF 64 +#define INDEX_SPEND_RK 96 + +#define INDEX_OUTPUT_VALUECMT 0 +#define INDEX_OUTPUT_NOTECMT 32 +#define INDEX_OUTPUT_EPK 64 +#define INDEX_OUTPUT_ENC 96 +#define INDEX_OUTPUT_ENC_MEMO 96 + 52 // contents of the encrypted memo field +#define INDEX_OUTPUT_ENC_AEAD_TAG \ + 96 + 564 // contents of the encrypted memo field +#define INDEX_OUTPUT_OUT 676 + +#define SAPLING_LENGTH_HASH_DATA 220 +#define SAPLING_INDEX_HASH_PREVOUTSHASH 8 +#define SAPLING_INDEX_HASH_SEQUENCEHASH 40 +#define SAPLING_INDEX_HASH_OUTPUTSHASH 72 +#define SAPLING_INDEX_HASH_JOINSPLITSHASH 104 +#define SAPLING_INDEX_HASH_SHIELDEDSPENDHASH 136 +#define SAPLING_INDEX_HASH_SHIELDEDOUTPUTHASH 168 +#define SAPLING_INDEX_HASH_VALUEBALANCE 208 uint16_t length_t_in_data(); diff --git a/app/src/jubjub.c b/app/src/jubjub.c index c0275162..40ff1aa0 100644 --- a/app/src/jubjub.c +++ b/app/src/jubjub.c @@ -1,384 +1,384 @@ /******************************************************************************* -* (c) 2021 Zondax AG -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -********************************************************************************/ + * (c) 2021 Zondax AG + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ********************************************************************************/ -#include -#include #include "jubjub.h" #include "cx.h" +#include +#include +unsigned char const JUBJUB_FR_MODULUS_BYTES[JUBJUB_SCALAR_BYTES] = { + 14, 125, 180, 234, 101, 51, 175, 169, 6, 103, 59, + 1, 1, 52, 59, 0, 166, 104, 32, 147, 204, 200, + 16, 130, 208, 151, 14, 94, 214, 247, 44, 183}; -unsigned char const JUBJUB_FR_MODULUS_BYTES[JUBJUB_SCALAR_BYTES] = {14, 125, 180, 234, 101, 51, 175, 169, 6, 103, 59, 1, - 1, 52, 59, 0, 166, 104, 32, 147, 204, 200, 16, 130, - 208, 151, 14, 94, 214, 247, 44, 183}; - -unsigned char const JUBJUB_FQ_MODULUS_BYTES[JUBJUB_FIELD_BYTES] = {0x73, 0xed, 0xa7, 0x53, 0x29, 0x9d, 0x7d, 0x48, 0x33, - 0x39, 0xd8, 0x08, 0x09, 0xa1, 0xd8, 0x05, 0x53, 0xbd, - 0xa4, 0x02, 0xff, 0xfe, 0x5b, 0xfe, 0xff, 0xff, 0xff, - 0xff, 0x00, 0x00, 0x00, 0x01}; +unsigned char const JUBJUB_FQ_MODULUS_BYTES[JUBJUB_FIELD_BYTES] = { + 0x73, 0xed, 0xa7, 0x53, 0x29, 0x9d, 0x7d, 0x48, 0x33, 0x39, 0xd8, + 0x08, 0x09, 0xa1, 0xd8, 0x05, 0x53, 0xbd, 0xa4, 0x02, 0xff, 0xfe, + 0x5b, 0xfe, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x01}; -const jubjub_fq JUBJUB_FQ_ZERO = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; +const jubjub_fq JUBJUB_FQ_ZERO = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; -const jubjub_fq JUBJUB_FQ_ONE = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}; +const jubjub_fq JUBJUB_FQ_ONE = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}; -const jubjub_fq JUBJUB_FQ_EDWARDS_D = { - 42, 147, 24, 231, 75, 250, 43, 72, 245, 253, 146, 7, 230, 189, 127, 212, 41, 45, 127, 109, 55, 87, 157, 38, 1, - 6, 95, 214, 214, 52, 62, 177 -}; +const jubjub_fq JUBJUB_FQ_EDWARDS_D = {42, 147, 24, 231, 75, 250, 43, 72, + 245, 253, 146, 7, 230, 189, 127, 212, + 41, 45, 127, 109, 55, 87, 157, 38, + 1, 6, 95, 214, 214, 52, 62, 177}; -const jubjub_fq JUBJUB_FQ_EDWARDS_2D = {85, 38, 49, 206, 151, 244, 86, 145, 235, 251, 36, 15, 205, - 122, 255, 168, 82, 90, 254, 218, 110, 175, 58, 76, 2, 12, - 191, 173, 172, 104, 125, 98}; +const jubjub_fq JUBJUB_FQ_EDWARDS_2D = { + 85, 38, 49, 206, 151, 244, 86, 145, 235, 251, 36, 15, 205, 122, 255, 168, + 82, 90, 254, 218, 110, 175, 58, 76, 2, 12, 191, 173, 172, 104, 125, 98}; const jubjub_fq JUBJUB_FQ_SQRT_T = { - 0, 0, 0, 0, 57, 246, 211, 169, 148, 206, 190, 164, 25, 156, 236, 4, 4, 208, 236, 2, 169, 222, 210, 1, 127, 255, - 45, 255, 127, 255, 255, 255 -}; + 0, 0, 0, 0, 57, 246, 211, 169, 148, 206, 190, 164, 25, 156, 236, 4, + 4, 208, 236, 2, 169, 222, 210, 1, 127, 255, 45, 255, 127, 255, 255, 255}; const jubjub_fq JUBJUB_FQ_ROOT_OF_UNITY = { - 22, 162, 161, 158, 223, 232, 31, 32, 208, 155, 104, 25, 34, 200, 19, 180, 182, 54, 131, 80, 140, 34, 128, 185, - 56, 41, 151, 31, 67, 159, 13, 43 -}; + 22, 162, 161, 158, 223, 232, 31, 32, 208, 155, 104, 25, 34, 200, 19, 180, + 182, 54, 131, 80, 140, 34, 128, 185, 56, 41, 151, 31, 67, 159, 13, 43}; const jubjub_extendedpoint JUBJUB_GEN = { - .U = {9, 38, 212, 243, 32, 89, 199, 18, 212, 24, 167, 255, 38, 117, 59, 106, 213, 185, 167, 211, 239, 142, 40, - 39, 71, 191, 70, 146, 10, 149, 167, 83}, - .V = {87, 161, 1, 158, 109, 233, 182, 117, 83, 187, 55, 208, 194, 28, 253, 5, 109, 101, 103, 77, 206, 219, 221, - 188, 48, 86, 50, 173, 170, 242, 181, 48}, - .Z = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}, - .T1 = {9, 38, 212, 243, 32, 89, 199, 18, 212, 24, 167, 255, 38, 117, 59, 106, 213, 185, 167, 211, 239, 142, 40, - 39, 71, 191, 70, 146, 10, 149, 167, 83}, - .T2 = {87, 161, 1, 158, 109, 233, 182, 117, 83, 187, 55, 208, 194, 28, 253, 5, 109, 101, 103, 77, 206, 219, 221, - 188, 48, 86, 50, 173, 170, 242, 181, 48}, + .U = {9, 38, 212, 243, 32, 89, 199, 18, 212, 24, 167, + 255, 38, 117, 59, 106, 213, 185, 167, 211, 239, 142, + 40, 39, 71, 191, 70, 146, 10, 149, 167, 83}, + .V = {87, 161, 1, 158, 109, 233, 182, 117, 83, 187, 55, + 208, 194, 28, 253, 5, 109, 101, 103, 77, 206, 219, + 221, 188, 48, 86, 50, 173, 170, 242, 181, 48}, + .Z = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}, + .T1 = {9, 38, 212, 243, 32, 89, 199, 18, 212, 24, 167, + 255, 38, 117, 59, 106, 213, 185, 167, 211, 239, 142, + 40, 39, 71, 191, 70, 146, 10, 149, 167, 83}, + .T2 = {87, 161, 1, 158, 109, 233, 182, 117, 83, 187, 55, + 208, 194, 28, 253, 5, 109, 101, 103, 77, 206, 219, + 221, 188, 48, 86, 50, 173, 170, 242, 181, 48}, }; const jubjub_extendedpoint JUBJUB_ID = { - .U = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, - .V = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}, - .Z = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}, - .T1 = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, - .T2 = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, + .U = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, + .V = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}, + .Z = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}, + .T1 = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, + .T2 = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, }; void u8_cmov(uint8_t *r, uint8_t a, uint8_t bit) { - uint8_t b = bit & 0x01; - uint8_t mask = (uint8_t)(-(int8_t) b); - uint8_t h, x; - h = *r; - x = h ^ a; - x &= mask; - *r = *r ^ x; + uint8_t b = bit & 0x01; + uint8_t mask = (uint8_t)(-(int8_t)b); + uint8_t h, x; + h = *r; + x = h ^ a; + x &= mask; + *r = *r ^ x; } void jubjub_field_frombytes(jubjub_fq r, const uint8_t *s) { - MEMZERO(r, sizeof(jubjub_fq)); - MEMCPY(r, s, sizeof(jubjub_fq)); - cx_math_modm_no_throw(r, JUBJUB_FIELD_BYTES, JUBJUB_FQ_MODULUS_BYTES, JUBJUB_FIELD_BYTES); + MEMZERO(r, sizeof(jubjub_fq)); + MEMCPY(r, s, sizeof(jubjub_fq)); + cx_math_modm_no_throw(r, JUBJUB_FIELD_BYTES, JUBJUB_FQ_MODULUS_BYTES, + JUBJUB_FIELD_BYTES); } int jubjub_field_iszero(const jubjub_fq r) { - return cx_math_is_zero(r, JUBJUB_FIELD_BYTES); + return cx_math_is_zero(r, JUBJUB_FIELD_BYTES); } uint8_t jubjub_field_is_equal(const jubjub_fq a, const jubjub_fq b) { - return (MEMCMP(a, b, sizeof(jubjub_fq)) == 0) & 0x01; + return (MEMCMP(a, b, sizeof(jubjub_fq)) == 0) & 0x01; } void jubjub_field_one(jubjub_fq r) { - MEMZERO(r, sizeof(jubjub_fq)); - MEMCPY(r, JUBJUB_FQ_ONE, sizeof(jubjub_fq)); + MEMZERO(r, sizeof(jubjub_fq)); + MEMCPY(r, JUBJUB_FQ_ONE, sizeof(jubjub_fq)); } void jubjub_field_copy(jubjub_fq r, const jubjub_fq a) { - MEMZERO(r, sizeof(jubjub_fq)); - MEMCPY(r, a, sizeof(jubjub_fq)); + MEMZERO(r, sizeof(jubjub_fq)); + MEMCPY(r, a, sizeof(jubjub_fq)); } void jubjub_field_mult(jubjub_fq r, const jubjub_fq a, const jubjub_fq b) { - cx_math_multm_no_throw(r, a, b, JUBJUB_FQ_MODULUS_BYTES, JUBJUB_FIELD_BYTES); + cx_math_multm_no_throw(r, a, b, JUBJUB_FQ_MODULUS_BYTES, JUBJUB_FIELD_BYTES); } void jubjub_field_add(jubjub_fq r, const jubjub_fq a, const jubjub_fq b) { - cx_math_addm_no_throw(r, a, b, JUBJUB_FQ_MODULUS_BYTES, JUBJUB_FIELD_BYTES); + cx_math_addm_no_throw(r, a, b, JUBJUB_FQ_MODULUS_BYTES, JUBJUB_FIELD_BYTES); } void jubjub_field_sub(jubjub_fq r, const jubjub_fq a, const jubjub_fq b) { - cx_math_subm_no_throw(r, a, b, JUBJUB_FQ_MODULUS_BYTES, JUBJUB_FIELD_BYTES); + cx_math_subm_no_throw(r, a, b, JUBJUB_FQ_MODULUS_BYTES, JUBJUB_FIELD_BYTES); } void jubjub_field_inverse(jubjub_fq r, jubjub_fq a) { - cx_math_invprimem_no_throw(r, a, JUBJUB_FQ_MODULUS_BYTES, JUBJUB_FIELD_BYTES); + cx_math_invprimem_no_throw(r, a, JUBJUB_FQ_MODULUS_BYTES, JUBJUB_FIELD_BYTES); } void jubjub_field_square(jubjub_fq r, jubjub_fq a) { - cx_math_multm_no_throw(r, a, a, JUBJUB_FQ_MODULUS_BYTES, JUBJUB_FIELD_BYTES); + cx_math_multm_no_throw(r, a, a, JUBJUB_FQ_MODULUS_BYTES, JUBJUB_FIELD_BYTES); } void jubjub_field_double(jubjub_fq r, jubjub_fq a) { - cx_math_addm_no_throw(r, a, a, JUBJUB_FQ_MODULUS_BYTES, JUBJUB_FIELD_BYTES); + cx_math_addm_no_throw(r, a, a, JUBJUB_FQ_MODULUS_BYTES, JUBJUB_FIELD_BYTES); } void jubjub_field_pow_t(jubjub_fq r, const jubjub_fq a) { - cx_math_powm_no_throw(r, a, JUBJUB_FQ_SQRT_T, JUBJUB_FIELD_BYTES, JUBJUB_FQ_MODULUS_BYTES, JUBJUB_FIELD_BYTES); + cx_math_powm_no_throw(r, a, JUBJUB_FQ_SQRT_T, JUBJUB_FIELD_BYTES, + JUBJUB_FQ_MODULUS_BYTES, JUBJUB_FIELD_BYTES); } void jubjub_field_negate(jubjub_fq r, const jubjub_fq a) { - cx_math_subm_no_throw(r, JUBJUB_FQ_ZERO, a, JUBJUB_FQ_MODULUS_BYTES, JUBJUB_FIELD_BYTES); + cx_math_subm_no_throw(r, JUBJUB_FQ_ZERO, a, JUBJUB_FQ_MODULUS_BYTES, + JUBJUB_FIELD_BYTES); } void jubjub_field_cmov(jubjub_fq r, const jubjub_fq a, uint8_t bit) { - uint8_t b = bit & 0x01; - uint8_t mask = (uint8_t)(-(int8_t) b); - jubjub_fq h, x; - for (int i = 0; i < JUBJUB_FIELD_BYTES; i++) { - h[i] = r[i]; - x[i] = h[i] ^ a[i]; - x[i] &= mask; - r[i] = r[i] ^ x[i]; - } + uint8_t b = bit & 0x01; + uint8_t mask = (uint8_t)(-(int8_t)b); + jubjub_fq h, x; + for (int i = 0; i < JUBJUB_FIELD_BYTES; i++) { + h[i] = r[i]; + x[i] = h[i] ^ a[i]; + x[i] &= mask; + r[i] = r[i] ^ x[i]; + } } zxerr_t jubjub_field_sqrt(jubjub_fq r, const jubjub_fq a) { - jubjub_fq w, x, b, z; - jubjub_field_pow_t(w, a); - - uint8_t v = 32; - jubjub_field_mult(x, a, w); - jubjub_field_mult(b, x, w); - jubjub_field_copy(z, JUBJUB_FQ_ROOT_OF_UNITY); - jubjub_fq tmp; - //uint8_t index = 0; - for (uint8_t max_v = 32; max_v >= 1; max_v--) { - uint8_t k = 1; - jubjub_field_square(tmp, b); - uint8_t j_less_than_v = 1; - for (uint8_t j = 2; j < max_v; j++) { - uint8_t tmp_is_one = jubjub_field_is_equal(tmp, JUBJUB_FQ_ONE); - jubjub_fq squared; - jubjub_field_copy(squared, z); - jubjub_field_cmov(squared, tmp, !tmp_is_one); - jubjub_field_square(squared, squared); - jubjub_field_cmov(tmp, squared, !tmp_is_one); - jubjub_fq new_z; - jubjub_field_copy(new_z, squared); - jubjub_field_cmov(new_z, z, !tmp_is_one); - j_less_than_v &= !(j == v); - u8_cmov(&k, j, !tmp_is_one); - jubjub_field_cmov(z, new_z, j_less_than_v); - } - - jubjub_fq result; - jubjub_field_mult(result, x, z); - uint8_t b_is_one = jubjub_field_is_equal(b, JUBJUB_FQ_ONE); - - jubjub_field_cmov(x, result, !b_is_one); - jubjub_field_square(z, z); - jubjub_field_mult(b, b, z); - v = k; + jubjub_fq w, x, b, z; + jubjub_field_pow_t(w, a); + + uint8_t v = 32; + jubjub_field_mult(x, a, w); + jubjub_field_mult(b, x, w); + jubjub_field_copy(z, JUBJUB_FQ_ROOT_OF_UNITY); + jubjub_fq tmp; + // uint8_t index = 0; + for (uint8_t max_v = 32; max_v >= 1; max_v--) { + uint8_t k = 1; + jubjub_field_square(tmp, b); + uint8_t j_less_than_v = 1; + for (uint8_t j = 2; j < max_v; j++) { + uint8_t tmp_is_one = jubjub_field_is_equal(tmp, JUBJUB_FQ_ONE); + jubjub_fq squared; + jubjub_field_copy(squared, z); + jubjub_field_cmov(squared, tmp, !tmp_is_one); + jubjub_field_square(squared, squared); + jubjub_field_cmov(tmp, squared, !tmp_is_one); + jubjub_fq new_z; + jubjub_field_copy(new_z, squared); + jubjub_field_cmov(new_z, z, !tmp_is_one); + j_less_than_v &= !(j == v); + u8_cmov(&k, j, !tmp_is_one); + jubjub_field_cmov(z, new_z, j_less_than_v); } - jubjub_field_square(w, x); - uint8_t correct = jubjub_field_is_equal(w, a); + jubjub_fq result; + jubjub_field_mult(result, x, z); + uint8_t b_is_one = jubjub_field_is_equal(b, JUBJUB_FQ_ONE); - if (!correct) { - return zxerr_unknown; - } + jubjub_field_cmov(x, result, !b_is_one); + jubjub_field_square(z, z); + jubjub_field_mult(b, b, z); + v = k; + } + + jubjub_field_square(w, x); + uint8_t correct = jubjub_field_is_equal(w, a); + + if (!correct) { + return zxerr_unknown; + } - jubjub_field_copy(r, x); - return zxerr_ok; + jubjub_field_copy(r, x); + return zxerr_ok; } -void jubjub_extendedpoint_cmov(jubjub_extendedpoint *r, jubjub_extendedpoint p, unsigned int bit) { - jubjub_field_cmov(r->U, p.U, bit); - jubjub_field_cmov(r->V, p.V, bit); - jubjub_field_cmov(r->Z, p.Z, bit); - jubjub_field_cmov(r->T1, p.T1, bit); - jubjub_field_cmov(r->T1, p.T2, bit); +void jubjub_extendedpoint_cmov(jubjub_extendedpoint *r, jubjub_extendedpoint p, + unsigned int bit) { + jubjub_field_cmov(r->U, p.U, bit); + jubjub_field_cmov(r->V, p.V, bit); + jubjub_field_cmov(r->Z, p.Z, bit); + jubjub_field_cmov(r->T1, p.T1, bit); + jubjub_field_cmov(r->T1, p.T2, bit); } -void jubjub_extendedpoint_normalize(jubjub_extendedpoint *r, jubjub_extendedpoint p) { - jubjub_fq zinv; - jubjub_field_inverse(zinv, r->Z); - jubjub_field_one(r->Z); - jubjub_field_mult(r->U, p.U, zinv); - jubjub_field_mult(r->V, p.V, zinv); - jubjub_field_copy(r->T1, p.U); - jubjub_field_copy(r->T2, p.V); +void jubjub_extendedpoint_normalize(jubjub_extendedpoint *r, + jubjub_extendedpoint p) { + jubjub_fq zinv; + jubjub_field_inverse(zinv, r->Z); + jubjub_field_one(r->Z); + jubjub_field_mult(r->U, p.U, zinv); + jubjub_field_mult(r->V, p.V, zinv); + jubjub_field_copy(r->T1, p.U); + jubjub_field_copy(r->T2, p.V); } void jubjub_extendedpoint_add(jubjub_extendedpoint *r, jubjub_extendedpoint p) { - //jubjub_extendedpoint np; - //jubjub_extendedpoint_normalize(&np, p); - //extendednielspoint - jubjub_fq v_minus_u, v_plus_u, t2d; - - jubjub_field_add(v_plus_u, p.V, p.U); - jubjub_field_sub(v_minus_u, p.V, p.U); - jubjub_field_mult(t2d, p.T1, p.T2); - jubjub_field_mult(t2d, t2d, JUBJUB_FQ_EDWARDS_2D); - - jubjub_fq a, b, c, d; - - jubjub_field_sub(a, r->V, r->U); - jubjub_field_mult(a, a, v_minus_u); - - jubjub_field_add(b, r->V, r->U); - jubjub_field_mult(b, b, v_plus_u); - - jubjub_field_mult(c, r->T1, r->T2); - jubjub_field_mult(c, c, t2d); - - jubjub_field_mult(d, r->Z, p.Z); - jubjub_field_double(d, d); - - //completed point - jubjub_fq u, v, z, t; - jubjub_field_sub(u, b, a); - jubjub_field_add(v, b, a); - jubjub_field_add(z, d, c); - jubjub_field_sub(t, d, c); - - //completed point to extended - jubjub_field_mult(r->U, u, t); - jubjub_field_mult(r->V, v, z); - jubjub_field_mult(r->Z, t, z); - jubjub_field_copy(r->T1, u); - jubjub_field_copy(r->T2, v); - + // jubjub_extendedpoint np; + // jubjub_extendedpoint_normalize(&np, p); + // extendednielspoint + jubjub_fq v_minus_u, v_plus_u, t2d; + + jubjub_field_add(v_plus_u, p.V, p.U); + jubjub_field_sub(v_minus_u, p.V, p.U); + jubjub_field_mult(t2d, p.T1, p.T2); + jubjub_field_mult(t2d, t2d, JUBJUB_FQ_EDWARDS_2D); + + jubjub_fq a, b, c, d; + + jubjub_field_sub(a, r->V, r->U); + jubjub_field_mult(a, a, v_minus_u); + + jubjub_field_add(b, r->V, r->U); + jubjub_field_mult(b, b, v_plus_u); + + jubjub_field_mult(c, r->T1, r->T2); + jubjub_field_mult(c, c, t2d); + + jubjub_field_mult(d, r->Z, p.Z); + jubjub_field_double(d, d); + + // completed point + jubjub_fq u, v, z, t; + jubjub_field_sub(u, b, a); + jubjub_field_add(v, b, a); + jubjub_field_add(z, d, c); + jubjub_field_sub(t, d, c); + + // completed point to extended + jubjub_field_mult(r->U, u, t); + jubjub_field_mult(r->V, v, z); + jubjub_field_mult(r->Z, t, z); + jubjub_field_copy(r->T1, u); + jubjub_field_copy(r->T2, v); } -void jubjub_extendedpoint_double(jubjub_extendedpoint *r, jubjub_extendedpoint p) { - - jubjub_fq uu, vv; - jubjub_fq zz2, uv2; - jubjub_fq vv_plus_uu, vv_minus_uu; +void jubjub_extendedpoint_double(jubjub_extendedpoint *r, + jubjub_extendedpoint p) { - jubjub_field_square(uu, p.U); - jubjub_field_square(vv, p.V); + jubjub_fq uu, vv; + jubjub_fq zz2, uv2; + jubjub_fq vv_plus_uu, vv_minus_uu; - jubjub_field_square(zz2, p.Z); - jubjub_field_double(zz2, zz2); + jubjub_field_square(uu, p.U); + jubjub_field_square(vv, p.V); - jubjub_field_add(uv2, p.U, p.V); - jubjub_field_square(uv2, uv2); + jubjub_field_square(zz2, p.Z); + jubjub_field_double(zz2, zz2); - jubjub_field_add(vv_plus_uu, vv, uu); - jubjub_field_sub(vv_minus_uu, vv, uu); + jubjub_field_add(uv2, p.U, p.V); + jubjub_field_square(uv2, uv2); - //completed point - jubjub_fq u, v, z, t; - jubjub_field_sub(u, uv2, vv_plus_uu); - jubjub_field_copy(v, vv_plus_uu); - jubjub_field_copy(z, vv_minus_uu); - jubjub_field_sub(t, zz2, vv_minus_uu); + jubjub_field_add(vv_plus_uu, vv, uu); + jubjub_field_sub(vv_minus_uu, vv, uu); + // completed point + jubjub_fq u, v, z, t; + jubjub_field_sub(u, uv2, vv_plus_uu); + jubjub_field_copy(v, vv_plus_uu); + jubjub_field_copy(z, vv_minus_uu); + jubjub_field_sub(t, zz2, vv_minus_uu); - //completed point to extended - jubjub_field_mult(r->U, u, t); - jubjub_field_mult(r->V, v, z); - jubjub_field_mult(r->Z, t, z); - jubjub_field_copy(r->T1, u); - jubjub_field_copy(r->T2, v); - + // completed point to extended + jubjub_field_mult(r->U, u, t); + jubjub_field_mult(r->V, v, z); + jubjub_field_mult(r->Z, t, z); + jubjub_field_copy(r->T1, u); + jubjub_field_copy(r->T2, v); } -void jubjub_extendedpoint_scalarmult(jubjub_extendedpoint *r, jubjub_fr scalar) { - jubjub_extendedpoint p, dummy; - MEMCPY(&p, &JUBJUB_ID, sizeof(jubjub_extendedpoint)); - //skip the first 4 bits as they are always 0 - for (int i = 4; i < 8 * JUBJUB_SCALAR_BYTES; i++) { - uint8_t di = (scalar[i / 8] >> (7 - (i % 8))) & 0x01; - jubjub_extendedpoint_double(&p, p); - MEMCPY(&dummy, &p, sizeof(jubjub_extendedpoint)); - jubjub_extendedpoint_add(&dummy, *r); - jubjub_extendedpoint_cmov(&p, dummy, di); - } - MEMCPY(r, &p, sizeof(jubjub_extendedpoint)); +void jubjub_extendedpoint_scalarmult(jubjub_extendedpoint *r, + jubjub_fr scalar) { + jubjub_extendedpoint p, dummy; + MEMCPY(&p, &JUBJUB_ID, sizeof(jubjub_extendedpoint)); + // skip the first 4 bits as they are always 0 + for (int i = 4; i < 8 * JUBJUB_SCALAR_BYTES; i++) { + uint8_t di = (scalar[i / 8] >> (7 - (i % 8))) & 0x01; + jubjub_extendedpoint_double(&p, p); + MEMCPY(&dummy, &p, sizeof(jubjub_extendedpoint)); + jubjub_extendedpoint_add(&dummy, *r); + jubjub_extendedpoint_cmov(&p, dummy, di); + } + MEMCPY(r, &p, sizeof(jubjub_extendedpoint)); } void jubjub_extendedpoint_tobytes(uint8_t *s, jubjub_extendedpoint p) { - jubjub_fq x, y, zinv; - jubjub_field_inverse(zinv, p.Z); - jubjub_field_mult(x, p.U, zinv); - jubjub_field_mult(y, p.V, zinv); + jubjub_fq x, y, zinv; + jubjub_field_inverse(zinv, p.Z); + jubjub_field_mult(x, p.U, zinv); + jubjub_field_mult(y, p.V, zinv); - MEMCPY(s, y, sizeof(jubjub_fq)); - s[0] |= (x[31] << 7); - SWAP_ENDIAN_BYTES(&s[0]); + MEMCPY(s, y, sizeof(jubjub_fq)); + s[0] |= (x[31] << 7); + SWAP_ENDIAN_BYTES(&s[0]); } zxerr_t jubjub_extendedpoint_frombytes(jubjub_extendedpoint *p, uint8_t *s) { - uint8_t b[JUBJUB_FIELD_BYTES]; - MEMCPY(b, s, JUBJUB_FIELD_BYTES); - SWAP_ENDIAN_BYTES(&b[0]); - - uint8_t sign = b[0] >> 7; - b[0] &= 0x7f; - - jubjub_fq v, v2, v3, u; - - jubjub_field_frombytes(v, b); - jubjub_field_square(v2, v); - jubjub_field_copy(v3, v2); - jubjub_field_mult(v2, v2, JUBJUB_FQ_EDWARDS_D); - jubjub_field_add(v2, v2, JUBJUB_FQ_ONE); - - if (jubjub_field_iszero(v2)) { - return zxerr_unknown; - } - - jubjub_field_inverse(v2, v2); - jubjub_field_sub(v3, v3, JUBJUB_FQ_ONE); - jubjub_field_mult(v3, v3, v2); - if (jubjub_field_sqrt(u, v3) != zxerr_ok) { - return zxerr_unknown; - } - - uint8_t flip_sign = (u[JUBJUB_FIELD_BYTES - 1] ^ sign) & 1; - jubjub_fq u_neg; - jubjub_field_negate(u_neg, u); - jubjub_field_cmov(u, u_neg, flip_sign); - - jubjub_field_copy(p->U, u); - jubjub_field_copy(p->V, v); - jubjub_field_copy(p->Z, JUBJUB_FQ_ONE); - jubjub_field_copy(p->T1, u); - jubjub_field_copy(p->T2, v); - return zxerr_ok; + uint8_t b[JUBJUB_FIELD_BYTES]; + MEMCPY(b, s, JUBJUB_FIELD_BYTES); + SWAP_ENDIAN_BYTES(&b[0]); + + uint8_t sign = b[0] >> 7; + b[0] &= 0x7f; + + jubjub_fq v, v2, v3, u; + + jubjub_field_frombytes(v, b); + jubjub_field_square(v2, v); + jubjub_field_copy(v3, v2); + jubjub_field_mult(v2, v2, JUBJUB_FQ_EDWARDS_D); + jubjub_field_add(v2, v2, JUBJUB_FQ_ONE); + + if (jubjub_field_iszero(v2)) { + return zxerr_unknown; + } + + jubjub_field_inverse(v2, v2); + jubjub_field_sub(v3, v3, JUBJUB_FQ_ONE); + jubjub_field_mult(v3, v3, v2); + if (jubjub_field_sqrt(u, v3) != zxerr_ok) { + return zxerr_unknown; + } + + uint8_t flip_sign = (u[JUBJUB_FIELD_BYTES - 1] ^ sign) & 1; + jubjub_fq u_neg; + jubjub_field_negate(u_neg, u); + jubjub_field_cmov(u, u_neg, flip_sign); + + jubjub_field_copy(p->U, u); + jubjub_field_copy(p->V, v); + jubjub_field_copy(p->Z, JUBJUB_FQ_ONE); + jubjub_field_copy(p->T1, u); + jubjub_field_copy(p->T2, v); + return zxerr_ok; } diff --git a/app/src/jubjub.h b/app/src/jubjub.h index dadb4a9a..e3364db7 100644 --- a/app/src/jubjub.h +++ b/app/src/jubjub.h @@ -1,55 +1,58 @@ /******************************************************************************* -* (c) 2021 Zondax AG -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -********************************************************************************/ + * (c) 2021 Zondax AG + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ********************************************************************************/ #include -#define JUBJUB_SCALAR_BYTES 32 -#define JUBJUB_FIELD_BYTES 32 +#define JUBJUB_SCALAR_BYTES 32 +#define JUBJUB_FIELD_BYTES 32 typedef unsigned char jubjub_fr[JUBJUB_SCALAR_BYTES]; typedef unsigned char jubjub_fq[JUBJUB_FIELD_BYTES]; typedef struct { - jubjub_fq U; - jubjub_fq V; - jubjub_fq Z; - jubjub_fq T1; - jubjub_fq T2; + jubjub_fq U; + jubjub_fq V; + jubjub_fq Z; + jubjub_fq T1; + jubjub_fq T2; } jubjub_extendedpoint; extern const jubjub_extendedpoint JUBJUB_GEN; -#define SWAP_BYTES(x, y, tmp) { \ - tmp = x; \ - x = y; \ - y = tmp;\ -} - -#define SWAP_ENDIAN_U64(x, tmp) { \ - SWAP_BYTES(*x, *(x + 7), tmp); \ -SWAP_BYTES(*(x+1), *(x + 6), tmp); \ -SWAP_BYTES(*(x+2), *(x + 5), tmp); \ -SWAP_BYTES(*(x+3), *(x + 4), tmp); \ -} - -#define SWAP_ENDIAN_BYTES(x) { \ - uint8_t tmp = 0; \ - for (int i = 0; i < 32/2; i++){ \ - SWAP_BYTES(*(x + i), *(x + (32-1-i)), tmp); \ - } \ -} +#define SWAP_BYTES(x, y, tmp) \ + { \ + tmp = x; \ + x = y; \ + y = tmp; \ + } + +#define SWAP_ENDIAN_U64(x, tmp) \ + { \ + SWAP_BYTES(*x, *(x + 7), tmp); \ + SWAP_BYTES(*(x + 1), *(x + 6), tmp); \ + SWAP_BYTES(*(x + 2), *(x + 5), tmp); \ + SWAP_BYTES(*(x + 3), *(x + 4), tmp); \ + } + +#define SWAP_ENDIAN_BYTES(x) \ + { \ + uint8_t tmp = 0; \ + for (int i = 0; i < 32 / 2; i++) { \ + SWAP_BYTES(*(x + i), *(x + (32 - 1 - i)), tmp); \ + } \ + } void jubjub_extendedpoint_tobytes(uint8_t *s, jubjub_extendedpoint p); diff --git a/app/src/key.c b/app/src/key.c index 9683b290..815454ed 100644 --- a/app/src/key.c +++ b/app/src/key.c @@ -1,88 +1,87 @@ /******************************************************************************* -* (c) 2020 Zondax AG -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -********************************************************************************/ + * (c) 2020 Zondax AG + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ********************************************************************************/ -#include +#include "actions.h" +#include "app_mode.h" #include "coin.h" +#include "crypto.h" #include "zxerror.h" -#include "zxmacros.h" #include "zxformat.h" -#include "app_mode.h" -#include "crypto.h" -#include "actions.h" +#include "zxmacros.h" +#include zxerr_t key_getNumItems(uint8_t *num_items) { - zemu_log_stack("key_getNumItems"); - *num_items = 1; - if (app_mode_expert()) { - *num_items = 2; - } - return zxerr_ok; + zemu_log_stack("key_getNumItems"); + *num_items = 1; + if (app_mode_expert()) { + *num_items = 2; + } + return zxerr_ok; } -zxerr_t key_getItem(int8_t displayIdx, - char *outKey, uint16_t outKeyLen, - char *outVal, uint16_t outValLen, - uint8_t pageIdx, uint8_t *pageCount) { - snprintf(outKey, outKeyLen, "?"); - snprintf(outVal, outValLen, "?"); +zxerr_t key_getItem(int8_t displayIdx, char *outKey, uint16_t outKeyLen, + char *outVal, uint16_t outValLen, uint8_t pageIdx, + uint8_t *pageCount) { + snprintf(outKey, outKeyLen, "?"); + snprintf(outVal, outValLen, "?"); - zemu_log_stack("key_getItem"); - switch (displayIdx) { - case 0: { - zemu_log_stack("case 0"); - char tmpBuffer[100]; - MEMZERO(tmpBuffer, sizeof(tmpBuffer)); - switch (key_state.kind) { - case key_ovk: - snprintf(outKey, outKeyLen, "Send OVK?"); - array_to_hexstr(tmpBuffer, sizeof(tmpBuffer), G_io_apdu_buffer, 32); - pageString(outVal, outValLen, tmpBuffer, pageIdx, pageCount); - return zxerr_ok; - case key_ivk: - snprintf(outKey, outKeyLen, "Send IVK?"); - array_to_hexstr(tmpBuffer, sizeof(tmpBuffer), G_io_apdu_buffer, 32); - pageString(outVal, outValLen, tmpBuffer, pageIdx, pageCount); - return zxerr_ok; - case key_fvk: - snprintf(outKey, outKeyLen, "Send FVK?\n"); - array_to_hexstr(tmpBuffer, sizeof(tmpBuffer), G_io_apdu_buffer, 32); - pageString(outVal, outValLen, tmpBuffer, pageIdx, pageCount); - return zxerr_ok; - case nf: - zemu_log_stack("Send NF?"); - snprintf(outKey, outKeyLen, "Send NF?"); - array_to_hexstr(tmpBuffer, sizeof(tmpBuffer), G_io_apdu_buffer, 32); - pageString(outVal, outValLen, tmpBuffer, pageIdx, pageCount); - return zxerr_ok; - default: - return zxerr_unknown; - } - } - case 1: { - if (!app_mode_expert()) { - return zxerr_no_data; - } - - snprintf(outKey, outKeyLen, "Your Path"); - char buffer[300]; - bip32_to_str(buffer, sizeof(buffer), hdPath, HDPATH_LEN_DEFAULT); - pageString(outVal, outValLen, buffer, pageIdx, pageCount); - return zxerr_ok; - } - default: - return zxerr_no_data; + zemu_log_stack("key_getItem"); + switch (displayIdx) { + case 0: { + zemu_log_stack("case 0"); + char tmpBuffer[100]; + MEMZERO(tmpBuffer, sizeof(tmpBuffer)); + switch (key_state.kind) { + case key_ovk: + snprintf(outKey, outKeyLen, "Send OVK?"); + array_to_hexstr(tmpBuffer, sizeof(tmpBuffer), G_io_apdu_buffer, 32); + pageString(outVal, outValLen, tmpBuffer, pageIdx, pageCount); + return zxerr_ok; + case key_ivk: + snprintf(outKey, outKeyLen, "Send IVK?"); + array_to_hexstr(tmpBuffer, sizeof(tmpBuffer), G_io_apdu_buffer, 32); + pageString(outVal, outValLen, tmpBuffer, pageIdx, pageCount); + return zxerr_ok; + case key_fvk: + snprintf(outKey, outKeyLen, "Send FVK?\n"); + array_to_hexstr(tmpBuffer, sizeof(tmpBuffer), G_io_apdu_buffer, 32); + pageString(outVal, outValLen, tmpBuffer, pageIdx, pageCount); + return zxerr_ok; + case nf: + zemu_log_stack("Send NF?"); + snprintf(outKey, outKeyLen, "Send NF?"); + array_to_hexstr(tmpBuffer, sizeof(tmpBuffer), G_io_apdu_buffer, 32); + pageString(outVal, outValLen, tmpBuffer, pageIdx, pageCount); + return zxerr_ok; + default: + return zxerr_unknown; + } + } + case 1: { + if (!app_mode_expert()) { + return zxerr_no_data; } + + snprintf(outKey, outKeyLen, "Your Path"); + char buffer[300]; + bip32_to_str(buffer, sizeof(buffer), hdPath, HDPATH_LEN_DEFAULT); + pageString(outVal, outValLen, buffer, pageIdx, pageCount); + return zxerr_ok; + } + default: + return zxerr_no_data; + } } diff --git a/app/src/key.h b/app/src/key.h index 56d3b399..ffef4036 100644 --- a/app/src/key.h +++ b/app/src/key.h @@ -1,18 +1,18 @@ /******************************************************************************* -* (c) 2020 Zondax AG -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -********************************************************************************/ + * (c) 2020 Zondax AG + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ********************************************************************************/ #pragma once @@ -24,10 +24,9 @@ extern "C" { zxerr_t key_getNumItems(uint8_t *num_items); /// Gets an specific item from the address view (including paging) -zxerr_t key_getItem(int8_t displayIdx, - char *outKey, uint16_t outKeyLen, - char *outValue, uint16_t outValueLen, - uint8_t pageIdx, uint8_t *pageCount); +zxerr_t key_getItem(int8_t displayIdx, char *outKey, uint16_t outKeyLen, + char *outValue, uint16_t outValueLen, uint8_t pageIdx, + uint8_t *pageCount); #ifdef __cplusplus } diff --git a/app/src/nvdata.c b/app/src/nvdata.c index c60ce0de..90d311e3 100644 --- a/app/src/nvdata.c +++ b/app/src/nvdata.c @@ -1,46 +1,43 @@ /******************************************************************************* -* (c) 2020 Zondax AG -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -********************************************************************************/ + * (c) 2020 Zondax AG + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ********************************************************************************/ -#include "os.h" -#include "cx.h" -#include "coin.h" -#include "app_main.h" #include "nvdata.h" +#include "app_main.h" +#include "coin.h" #include "constants.h" +#include "cx.h" +#include "os.h" #include "view.h" -t_inlist_t NV_CONST -N_t_inlist_impl __attribute__ ((aligned(64))); +t_inlist_t NV_CONST N_t_inlist_impl __attribute__((aligned(64))); #define N_t_inlist (*(NV_VOLATILE t_inlist_t *)PIC(&N_t_inlist_impl)) -t_outlist_t NV_CONST -N_t_outlist_impl __attribute__ ((aligned(64))); +t_outlist_t NV_CONST N_t_outlist_impl __attribute__((aligned(64))); #define N_t_outlist (*(NV_VOLATILE t_outlist_t *)PIC(&N_t_outlist_impl)) -spendlist_t NV_CONST -N_spendlist_impl __attribute__ ((aligned(64))); +spendlist_t NV_CONST N_spendlist_impl __attribute__((aligned(64))); #define N_spendlist (*(NV_VOLATILE spendlist_t *)PIC(&N_spendlist_impl)) -outputlist_t NV_CONST -N_outputlist_impl __attribute__ ((aligned(64))); +outputlist_t NV_CONST N_outputlist_impl __attribute__((aligned(64))); #define N_outputlist (*(NV_VOLATILE outputlist_t *)PIC(&N_outputlist_impl)) -transaction_info_t NV_CONST -N_transaction_info_impl __attribute__ ((aligned(64))); -#define N_transactioninfo (*(NV_VOLATILE transaction_info_t *)PIC(&N_transaction_info_impl)) +transaction_info_t NV_CONST N_transaction_info_impl + __attribute__((aligned(64))); +#define N_transactioninfo \ + (*(NV_VOLATILE transaction_info_t *)PIC(&N_transaction_info_impl)) transaction_header_t transaction_header; @@ -50,351 +47,346 @@ transaction_header_t transaction_header; ////////////////////////////////////////////////////////////// zxerr_t t_inlist_append_item(uint32_t *p, uint8_t *script, uint64_t v) { - zemu_log_stack("let's append"); - if (transaction_header.t_in_len >= T_IN_LIST_SIZE) { - return zxerr_unknown; - } + zemu_log_stack("let's append"); + if (transaction_header.t_in_len >= T_IN_LIST_SIZE) { + return zxerr_unknown; + } - transaction_header.total_value += v; + transaction_header.total_value += v; - t_input_item_t newitem; - MEMCPY(newitem.path, (uint8_t *)p, PATH_SIZE * sizeof(uint32_t)); - MEMCPY(newitem.script, script, SCRIPT_SIZE); - newitem.value = v; + t_input_item_t newitem; + MEMCPY(newitem.path, (uint8_t *)p, PATH_SIZE * sizeof(uint32_t)); + MEMCPY(newitem.script, script, SCRIPT_SIZE); + newitem.value = v; - MEMCPY_NV((void *) &N_t_inlist.items[transaction_header.t_in_len], - &newitem, sizeof(t_input_item_t)); + MEMCPY_NV((void *)&N_t_inlist.items[transaction_header.t_in_len], &newitem, + sizeof(t_input_item_t)); - transaction_header.t_in_len += 1; - zemu_log_stack("appended"); - return zxerr_ok; + transaction_header.t_in_len += 1; + zemu_log_stack("appended"); + return zxerr_ok; } t_input_item_t *t_inlist_retrieve_item(uint8_t i) { - if (transaction_header.t_in_len < i) { - return NULL; - } else { - return (t_input_item_t *) &N_t_inlist.items[i]; - } + if (transaction_header.t_in_len < i) { + return NULL; + } else { + return (t_input_item_t *)&N_t_inlist.items[i]; + } } zxerr_t t_outlist_append_item(uint8_t *addr, uint64_t v) { - if (transaction_header.t_out_len >= T_OUT_LIST_SIZE) { - return zxerr_unknown; - } + if (transaction_header.t_out_len >= T_OUT_LIST_SIZE) { + return zxerr_unknown; + } - transaction_header.total_value -= v; + transaction_header.total_value -= v; - t_output_item_t newitem; - MEMCPY(newitem.address, addr, SCRIPT_SIZE); - newitem.value = v; + t_output_item_t newitem; + MEMCPY(newitem.address, addr, SCRIPT_SIZE); + newitem.value = v; - MEMCPY_NV((void *) &N_t_outlist.items[transaction_header.t_out_len], - &newitem, sizeof(t_output_item_t)); + MEMCPY_NV((void *)&N_t_outlist.items[transaction_header.t_out_len], &newitem, + sizeof(t_output_item_t)); - transaction_header.t_out_len += 1; - return zxerr_ok; + transaction_header.t_out_len += 1; + return zxerr_ok; } t_output_item_t *t_outlist_retrieve_item(uint8_t i) { - if (transaction_header.t_out_len < i) { - return NULL; - } else { - return (t_output_item_t *) &N_t_outlist.items[i]; - } + if (transaction_header.t_out_len < i) { + return NULL; + } else { + return (t_output_item_t *)&N_t_outlist.items[i]; + } } -uint8_t t_inlist_len() { - return transaction_header.t_in_len; -} +uint8_t t_inlist_len() { return transaction_header.t_in_len; } // Returns the list of all transparent input amounts. -uint64_t t_inlist_retrieve_item_amount(uint8_t i){ - return N_t_inlist.items[i].value; +uint64_t t_inlist_retrieve_item_amount(uint8_t i) { + return N_t_inlist.items[i].value; } -void t_inlist_retrieve_item_script(uint8_t i, uint8_t *output){ - MEMCPY(output, (const void *) N_t_inlist.items[i].script, SCRIPT_SIZE); +void t_inlist_retrieve_item_script(uint8_t i, uint8_t *output) { + MEMCPY(output, (const void *)N_t_inlist.items[i].script, SCRIPT_SIZE); } -uint8_t t_outlist_len() { - return transaction_header.t_out_len; -} +uint8_t t_outlist_len() { return transaction_header.t_out_len; } bool transparent_signatures_more_extract() { - return transaction_header.t_sign_index > 0; + return transaction_header.t_sign_index > 0; } - zxerr_t transparent_signatures_append(uint8_t *signature) { - if (transaction_header.t_sign_index >= transaction_header.t_in_len) { - return zxerr_unknown; - } - MEMCPY_NV((void *) &N_transactioninfo.transparent_signatures[transaction_header.t_sign_index], + if (transaction_header.t_sign_index >= transaction_header.t_in_len) { + return zxerr_unknown; + } + MEMCPY_NV((void *)&N_transactioninfo + .transparent_signatures[transaction_header.t_sign_index], signature, SIGNATURE_SIZE); - transaction_header.t_sign_index++; - return zxerr_ok; + transaction_header.t_sign_index++; + return zxerr_ok; } zxerr_t get_next_transparent_signature(uint8_t *result) { - uint8_t index = transaction_header.t_in_len - transaction_header.t_sign_index; - if (transaction_header.t_in_len <= index || index < 0) { - return zxerr_unknown; - } - MEMCPY(result, (void *) &N_transactioninfo.transparent_signatures[index], SIGNATURE_SIZE); - transaction_header.t_sign_index--; - if (!transparent_signatures_more_extract() && !spend_signatures_more_extract()) { - transaction_reset(); - view_idle_show(0, NULL); - } - return zxerr_ok; + uint8_t index = transaction_header.t_in_len - transaction_header.t_sign_index; + if (transaction_header.t_in_len <= index || index < 0) { + return zxerr_unknown; + } + MEMCPY(result, (void *)&N_transactioninfo.transparent_signatures[index], + SIGNATURE_SIZE); + transaction_header.t_sign_index--; + if (!transparent_signatures_more_extract() && + !spend_signatures_more_extract()) { + transaction_reset(); + view_idle_show(0, NULL); + } + return zxerr_ok; } bool spend_signatures_more_extract() { - return transaction_header.spends_sign_index > 0; + return transaction_header.spends_sign_index > 0; } zxerr_t spend_signatures_append(uint8_t *signature) { - if (transaction_header.spends_sign_index >= transaction_header.spendlist_len) { - return zxerr_unknown; - } + if (transaction_header.spends_sign_index >= + transaction_header.spendlist_len) { + return zxerr_unknown; + } - MEMCPY_NV((void *) &N_transactioninfo.spend_signatures[transaction_header.spends_sign_index], + MEMCPY_NV((void *)&N_transactioninfo + .spend_signatures[transaction_header.spends_sign_index], signature, SIGNATURE_SIZE); - transaction_header.spends_sign_index++; - return zxerr_ok; + transaction_header.spends_sign_index++; + return zxerr_ok; } zxerr_t get_next_spend_signature(uint8_t *result) { - uint8_t index = transaction_header.spendlist_len - transaction_header.spends_sign_index; - if (transaction_header.spendlist_len <= index || index < 0) { - return zxerr_unknown; - } - MEMCPY(result, (void *) &N_transactioninfo.spend_signatures[index], SIGNATURE_SIZE); - transaction_header.spends_sign_index--; - if (!transparent_signatures_more_extract() && !spend_signatures_more_extract()) { - transaction_reset(); - view_idle_show(0, NULL); - } - return zxerr_ok; + uint8_t index = + transaction_header.spendlist_len - transaction_header.spends_sign_index; + if (transaction_header.spendlist_len <= index || index < 0) { + return zxerr_unknown; + } + MEMCPY(result, (void *)&N_transactioninfo.spend_signatures[index], + SIGNATURE_SIZE); + transaction_header.spends_sign_index--; + if (!transparent_signatures_more_extract() && + !spend_signatures_more_extract()) { + transaction_reset(); + view_idle_show(0, NULL); + } + return zxerr_ok; } void transaction_reset() { - MEMZERO(&transaction_header, sizeof(transaction_header_t)); - zeroize_flashstorage(); + MEMZERO(&transaction_header, sizeof(transaction_header_t)); + zeroize_flashstorage(); } -bool spendlist_is_active() { - return transaction_header.spendlist_len > 0; -} +bool spendlist_is_active() { return transaction_header.spendlist_len > 0; } -zxerr_t spendlist_append_item(uint32_t p, uint64_t v, uint8_t *div, uint8_t *pkd, uint8_t *rcm, uint8_t *alpha) { - if (transaction_header.spendlist_len >= SPEND_LIST_SIZE) { - return zxerr_unknown; - } +zxerr_t spendlist_append_item(uint32_t p, uint64_t v, uint8_t *div, + uint8_t *pkd, uint8_t *rcm, uint8_t *alpha) { + if (transaction_header.spendlist_len >= SPEND_LIST_SIZE) { + return zxerr_unknown; + } - transaction_header.sapling_value += v; - transaction_header.total_value += v; - uint32_t path = p | 0x80000000; + transaction_header.sapling_value += v; + transaction_header.total_value += v; + uint32_t path = p | 0x80000000; - spend_item_t newitem; - newitem.path = path; - newitem.value = v; - MEMCPY(newitem.div, div, DIV_SIZE); - MEMCPY(newitem.pkd, pkd, PKD_SIZE); - MEMCPY(newitem.rcmvalue, rcm, RCM_SIZE); - MEMCPY(newitem.alpha, alpha, ALPHA_SIZE); + spend_item_t newitem; + newitem.path = path; + newitem.value = v; + MEMCPY(newitem.div, div, DIV_SIZE); + MEMCPY(newitem.pkd, pkd, PKD_SIZE); + MEMCPY(newitem.rcmvalue, rcm, RCM_SIZE); + MEMCPY(newitem.alpha, alpha, ALPHA_SIZE); - MEMCPY_NV((void *) &N_spendlist.items[transaction_header.spendlist_len], + MEMCPY_NV((void *)&N_spendlist.items[transaction_header.spendlist_len], &newitem, sizeof(spend_item_t)); - transaction_header.spendlist_len += 1; - return zxerr_ok; + transaction_header.spendlist_len += 1; + return zxerr_ok; } spend_item_t *spendlist_retrieve_item(uint8_t i) { - if (transaction_header.spendlist_len < i) { - return NULL; - } else { - return (spend_item_t *) &N_spendlist.items[i]; - } + if (transaction_header.spendlist_len < i) { + return NULL; + } else { + return (spend_item_t *)&N_spendlist.items[i]; + } } spend_item_t *spendlist_extract_next() { - if (transaction_header.spendlist_len <= transaction_header.spenddata_extract_index) { - return NULL; - } else { - spend_item_t *result = (spend_item_t *) &N_spendlist.items[transaction_header.spenddata_extract_index]; - transaction_header.spenddata_extract_index += 1; - return result; - } + if (transaction_header.spendlist_len <= + transaction_header.spenddata_extract_index) { + return NULL; + } else { + spend_item_t *result = + (spend_item_t *)&N_spendlist + .items[transaction_header.spenddata_extract_index]; + transaction_header.spenddata_extract_index += 1; + return result; + } } bool spendlist_more_extract() { - return transaction_header.spendlist_len > transaction_header.spenddata_extract_index; + return transaction_header.spendlist_len > + transaction_header.spenddata_extract_index; } -uint8_t spendlist_len() { - return transaction_header.spendlist_len; -} +uint8_t spendlist_len() { return transaction_header.spendlist_len; } -bool outputlist_is_active() { - return transaction_header.outputlist_len > 0; -} +bool outputlist_is_active() { return transaction_header.outputlist_len > 0; } -zxerr_t outputlist_append_item(uint8_t *d, uint8_t *pkd, uint64_t v, uint8_t memotype, uint8_t *ovk, uint8_t *rcmv, +zxerr_t outputlist_append_item(uint8_t *d, uint8_t *pkd, uint64_t v, + uint8_t memotype, uint8_t *ovk, uint8_t *rcmv, uint8_t *rseed) { - if (transaction_header.outputlist_len >= OUTPUT_LIST_SIZE) { - return zxerr_unknown; - } - transaction_header.sapling_value -= v; - transaction_header.total_value -= v; - - output_item_t newitem; - newitem.value = v; - MEMCPY(newitem.rcmvalue, rcmv, RCM_V_SIZE); - MEMCPY(newitem.rseed, rseed, RSEED_SIZE); - MEMCPY(newitem.div, d, DIV_SIZE); - MEMCPY(newitem.pkd, pkd, PKD_SIZE); - MEMCPY(newitem.ovk, ovk, OVK_SET_SIZE); - newitem.memotype = memotype; - MEMCPY_NV((void *) &N_outputlist.items[transaction_header.outputlist_len], + if (transaction_header.outputlist_len >= OUTPUT_LIST_SIZE) { + return zxerr_unknown; + } + transaction_header.sapling_value -= v; + transaction_header.total_value -= v; + + output_item_t newitem; + newitem.value = v; + MEMCPY(newitem.rcmvalue, rcmv, RCM_V_SIZE); + MEMCPY(newitem.rseed, rseed, RSEED_SIZE); + MEMCPY(newitem.div, d, DIV_SIZE); + MEMCPY(newitem.pkd, pkd, PKD_SIZE); + MEMCPY(newitem.ovk, ovk, OVK_SET_SIZE); + newitem.memotype = memotype; + MEMCPY_NV((void *)&N_outputlist.items[transaction_header.outputlist_len], &newitem, sizeof(output_item_t)); - transaction_header.outputlist_len += 1; - return zxerr_ok; + transaction_header.outputlist_len += 1; + return zxerr_ok; } output_item_t *outputlist_retrieve_item(uint8_t i) { - if (transaction_header.outputlist_len < i) { - return NULL; - } else { - return (output_item_t *) &N_outputlist.items[i]; - } + if (transaction_header.outputlist_len < i) { + return NULL; + } else { + return (output_item_t *)&N_outputlist.items[i]; + } } output_item_t *outputlist_extract_next() { - if (transaction_header.outputlist_len <= transaction_header.outputdata_extract_index) { - return NULL; - } else { - output_item_t *result = (output_item_t *) &N_outputlist.items[transaction_header.outputdata_extract_index]; - transaction_header.outputdata_extract_index += 1; - return result; - } + if (transaction_header.outputlist_len <= + transaction_header.outputdata_extract_index) { + return NULL; + } else { + output_item_t *result = + (output_item_t *)&N_outputlist + .items[transaction_header.outputdata_extract_index]; + transaction_header.outputdata_extract_index += 1; + return result; + } } bool outputlist_more_extract() { - return transaction_header.outputlist_len > transaction_header.outputdata_extract_index; + return transaction_header.outputlist_len > + transaction_header.outputdata_extract_index; } -uint8_t outputlist_len() { - return transaction_header.outputlist_len; -} +uint8_t outputlist_len() { return transaction_header.outputlist_len; } // valueBalance is not the total value, but the // net value of Sapling Spend transfers minus Output transfers. // i.e. the contents of the Sapling value pool -int64_t get_valuebalance() { - return transaction_header.sapling_value; -} -uint64_t get_totalvalue() { - return transaction_header.total_value; -} -uint8_t get_state() { - return transaction_header.state; -} +int64_t get_valuebalance() { return transaction_header.sapling_value; } +uint64_t get_totalvalue() { return transaction_header.total_value; } +uint8_t get_state() { return transaction_header.state; } -void set_state(uint8_t state) { - transaction_header.state = state; -} +void set_state(uint8_t state) { transaction_header.state = state; } -void state_reset() { - transaction_header.state = STATE_INITIAL; -} +void state_reset() { transaction_header.state = STATE_INITIAL; } void zeroize_tin_data() { - uint32_t p[PATH_SIZE]; - uint8_t s[SCRIPT_SIZE]; - uint64_t v = 0; - MEMZERO(p, sizeof(p)); - MEMZERO(s, sizeof(s)); - transaction_header.t_in_len = 0; - for (int i = 0; i < T_IN_LIST_SIZE; i++) { - t_inlist_append_item(p, s, v); - } - transaction_header.t_in_len = 0; + uint32_t p[PATH_SIZE]; + uint8_t s[SCRIPT_SIZE]; + uint64_t v = 0; + MEMZERO(p, sizeof(p)); + MEMZERO(s, sizeof(s)); + transaction_header.t_in_len = 0; + for (int i = 0; i < T_IN_LIST_SIZE; i++) { + t_inlist_append_item(p, s, v); + } + transaction_header.t_in_len = 0; } void zeroize_tout_data() { - uint8_t s[SCRIPT_SIZE]; - uint64_t v = 0; - MEMZERO(s, sizeof(s)); - transaction_header.t_out_len = 0; - for (int i = 0; i < T_OUT_LIST_SIZE; i++) { - t_outlist_append_item(s, v); - } - transaction_header.t_out_len = 0; + uint8_t s[SCRIPT_SIZE]; + uint64_t v = 0; + MEMZERO(s, sizeof(s)); + transaction_header.t_out_len = 0; + for (int i = 0; i < T_OUT_LIST_SIZE; i++) { + t_outlist_append_item(s, v); + } + transaction_header.t_out_len = 0; } void zeroize_spend_data() { - uint32_t p = 0; - uint64_t v = 0; - uint8_t div[DIV_SIZE]; - uint8_t pkd[PKD_SIZE]; - uint8_t rcm[RCM_SIZE]; - uint8_t alpha[ALPHA_SIZE]; - MEMZERO(div, sizeof(div)); - MEMZERO(pkd, sizeof(pkd)); - MEMZERO(rcm, sizeof(rcm)); - MEMZERO(alpha, sizeof(alpha)); - transaction_header.spendlist_len = 0; - for (int i = 0; i < SPEND_LIST_SIZE; i++) { - spendlist_append_item(p, v, div, pkd, rcm, alpha); - } - transaction_header.spendlist_len = 0; + uint32_t p = 0; + uint64_t v = 0; + uint8_t div[DIV_SIZE]; + uint8_t pkd[PKD_SIZE]; + uint8_t rcm[RCM_SIZE]; + uint8_t alpha[ALPHA_SIZE]; + MEMZERO(div, sizeof(div)); + MEMZERO(pkd, sizeof(pkd)); + MEMZERO(rcm, sizeof(rcm)); + MEMZERO(alpha, sizeof(alpha)); + transaction_header.spendlist_len = 0; + for (int i = 0; i < SPEND_LIST_SIZE; i++) { + spendlist_append_item(p, v, div, pkd, rcm, alpha); + } + transaction_header.spendlist_len = 0; } void zeroize_output_data() { - uint64_t v = 0; - uint8_t div[DIV_SIZE]; - uint8_t pkd[PKD_SIZE]; - uint8_t ovk[OVK_SIZE]; - uint8_t rcmv[RCM_V_SIZE]; - uint8_t rseed[RSEED_SIZE]; - uint8_t memotype = 0x00; - MEMZERO(div, sizeof(div)); - MEMZERO(pkd, sizeof(pkd)); - MEMZERO(ovk, sizeof(ovk)); - MEMZERO(rcmv, sizeof(rcmv)); - MEMZERO(rseed, sizeof(rseed)); - transaction_header.outputlist_len = 0; - for (int i = 0; i < OUTPUT_LIST_SIZE; i++) { - outputlist_append_item(div, pkd, v, memotype, ovk, rcmv, rseed); - } - transaction_header.outputlist_len = 0; + uint64_t v = 0; + uint8_t div[DIV_SIZE]; + uint8_t pkd[PKD_SIZE]; + uint8_t ovk[OVK_SIZE]; + uint8_t rcmv[RCM_V_SIZE]; + uint8_t rseed[RSEED_SIZE]; + uint8_t memotype = 0x00; + MEMZERO(div, sizeof(div)); + MEMZERO(pkd, sizeof(pkd)); + MEMZERO(ovk, sizeof(ovk)); + MEMZERO(rcmv, sizeof(rcmv)); + MEMZERO(rseed, sizeof(rseed)); + transaction_header.outputlist_len = 0; + for (int i = 0; i < OUTPUT_LIST_SIZE; i++) { + outputlist_append_item(div, pkd, v, memotype, ovk, rcmv, rseed); + } + transaction_header.outputlist_len = 0; } void zeroize_signatures() { - uint8_t sig[SIGNATURE_SIZE]; - MEMZERO(sig, SIGNATURE_SIZE); - - transaction_header.t_sign_index = 0; - for (int i = 0; i < T_IN_LIST_SIZE; i++) { - transparent_signatures_append(sig); - } - transaction_header.t_sign_index = 0; - - transaction_header.spends_sign_index = 0; - for (int i = 0; i < T_IN_LIST_SIZE; i++) { - spend_signatures_append(sig); - } - transaction_header.spends_sign_index = 0; + uint8_t sig[SIGNATURE_SIZE]; + MEMZERO(sig, SIGNATURE_SIZE); + + transaction_header.t_sign_index = 0; + for (int i = 0; i < T_IN_LIST_SIZE; i++) { + transparent_signatures_append(sig); + } + transaction_header.t_sign_index = 0; + + transaction_header.spends_sign_index = 0; + for (int i = 0; i < T_IN_LIST_SIZE; i++) { + spend_signatures_append(sig); + } + transaction_header.spends_sign_index = 0; } void zeroize_flashstorage() { - zeroize_tin_data(); - zeroize_tout_data(); - zeroize_spend_data(); - zeroize_output_data(); - zeroize_signatures(); + zeroize_tin_data(); + zeroize_tout_data(); + zeroize_spend_data(); + zeroize_output_data(); + zeroize_signatures(); } diff --git a/app/src/nvdata.h b/app/src/nvdata.h index e9f36325..c89f92b2 100644 --- a/app/src/nvdata.h +++ b/app/src/nvdata.h @@ -1,89 +1,89 @@ /******************************************************************************* -* (c) 2018 -2022 Zondax AG -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -********************************************************************************/ + * (c) 2018 -2022 Zondax AG + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ********************************************************************************/ #pragma once -#include "zxmacros.h" -#include -#include "zxerror.h" #include "coin.h" #include "constants.h" +#include "zxerror.h" +#include "zxmacros.h" +#include typedef struct { - uint32_t path[PATH_SIZE]; - uint8_t script[SCRIPT_SIZE]; - uint64_t value; + uint32_t path[PATH_SIZE]; + uint8_t script[SCRIPT_SIZE]; + uint64_t value; } t_input_item_t; typedef struct { - uint8_t address[SCRIPT_SIZE]; - uint64_t value; + uint8_t address[SCRIPT_SIZE]; + uint64_t value; } t_output_item_t; typedef struct { - t_input_item_t items[T_IN_LIST_SIZE]; + t_input_item_t items[T_IN_LIST_SIZE]; } t_inlist_t; typedef struct { - t_output_item_t items[T_OUT_LIST_SIZE]; + t_output_item_t items[T_OUT_LIST_SIZE]; } t_outlist_t; typedef struct { - uint32_t path; - uint64_t value; - uint8_t div[DIV_SIZE]; - uint8_t pkd[PKD_SIZE]; - uint8_t rcmvalue[RCM_SIZE]; - uint8_t alpha[ALPHA_SIZE]; + uint32_t path; + uint64_t value; + uint8_t div[DIV_SIZE]; + uint8_t pkd[PKD_SIZE]; + uint8_t rcmvalue[RCM_SIZE]; + uint8_t alpha[ALPHA_SIZE]; } spend_item_t; typedef struct { - uint64_t total_value; - int64_t sapling_value; - uint8_t state; - uint8_t t_in_len; - uint8_t t_out_len; - uint8_t spendlist_len; - uint8_t outputlist_len; - uint8_t spenddata_extract_index; - uint8_t outputdata_extract_index; - uint8_t spends_sign_index; - uint8_t t_sign_index; + uint64_t total_value; + int64_t sapling_value; + uint8_t state; + uint8_t t_in_len; + uint8_t t_out_len; + uint8_t spendlist_len; + uint8_t outputlist_len; + uint8_t spenddata_extract_index; + uint8_t outputdata_extract_index; + uint8_t spends_sign_index; + uint8_t t_sign_index; } transaction_header_t; typedef struct { - spend_item_t items[SPEND_LIST_SIZE]; + spend_item_t items[SPEND_LIST_SIZE]; } spendlist_t; typedef struct { - uint8_t div[DIV_SIZE]; - uint8_t pkd[PKD_SIZE]; - uint64_t value; - uint8_t memotype; - uint8_t rcmvalue[RCM_V_SIZE]; - uint8_t rseed[RSEED_SIZE]; - uint8_t ovk[OVK_SET_SIZE]; + uint8_t div[DIV_SIZE]; + uint8_t pkd[PKD_SIZE]; + uint64_t value; + uint8_t memotype; + uint8_t rcmvalue[RCM_V_SIZE]; + uint8_t rseed[RSEED_SIZE]; + uint8_t ovk[OVK_SET_SIZE]; } output_item_t; typedef struct { - output_item_t items[SPEND_LIST_SIZE]; + output_item_t items[SPEND_LIST_SIZE]; } outputlist_t; typedef struct { - uint8_t transparent_signatures[T_IN_LIST_SIZE][64]; - uint8_t spend_signatures[SPEND_LIST_SIZE][64]; + uint8_t transparent_signatures[T_IN_LIST_SIZE][64]; + uint8_t spend_signatures[SPEND_LIST_SIZE][64]; } transaction_info_t; #ifdef __cplusplus @@ -92,22 +92,22 @@ extern "C" { void transaction_reset(); -//statemachine API +// statemachine API uint8_t get_state(); void state_reset(); void set_state(uint8_t state); -#define STATE_INITIAL 0 -#define STATE_PROCESSED_INPUTS 1 -#define STATE_PROCESSED_SPEND_EXTRACTIONS 2 -#define STATE_PROCESSED_ALL_EXTRACTIONS 3 -#define STATE_CHECKING_ALL_TXDATA 4 -#define STATE_VERIFIED_ALL_TXDATA 5 -#define STATE_SIGNED_TX 6 +#define STATE_INITIAL 0 +#define STATE_PROCESSED_INPUTS 1 +#define STATE_PROCESSED_SPEND_EXTRACTIONS 2 +#define STATE_PROCESSED_ALL_EXTRACTIONS 3 +#define STATE_CHECKING_ALL_TXDATA 4 +#define STATE_VERIFIED_ALL_TXDATA 5 +#define STATE_SIGNED_TX 6 -//metadata flash api +// metadata flash api int64_t get_valuebalance(); uint64_t get_totalvalue(); @@ -126,7 +126,7 @@ zxerr_t spend_signatures_append(uint8_t *signature); zxerr_t get_next_spend_signature(uint8_t *result); -//transparent TxIN API +// transparent TxIN API zxerr_t t_inlist_append_item(uint32_t *p, uint8_t *script, uint64_t v); t_input_item_t *t_inlist_retrieve_item(uint8_t i); @@ -137,17 +137,18 @@ uint64_t t_inlist_retrieve_item_amount(uint8_t i); void t_inlist_retrieve_item_script(uint8_t i, uint8_t *output); -//transparent TXOUT API +// transparent TXOUT API zxerr_t t_outlist_append_item(uint8_t *addr, uint64_t v); t_output_item_t *t_outlist_retrieve_item(uint8_t i); uint8_t t_outlist_len(); -//spendlist flashstorage API +// spendlist flashstorage API bool spendlist_is_active(); -zxerr_t spendlist_append_item(uint32_t p, uint64_t v, uint8_t *div, uint8_t *pkd, uint8_t *rcm, uint8_t *alpha); +zxerr_t spendlist_append_item(uint32_t p, uint64_t v, uint8_t *div, + uint8_t *pkd, uint8_t *rcm, uint8_t *alpha); uint8_t spendlist_len(); @@ -159,10 +160,11 @@ spend_item_t *spendlist_extract_next(); bool spendlist_more_extract(); -//outputlist flashstorage API +// outputlist flashstorage API bool outputlist_is_active(); -zxerr_t outputlist_append_item(uint8_t *d, uint8_t *pkd, uint64_t v, uint8_t memotype, uint8_t *ovk, uint8_t *rcmv, +zxerr_t outputlist_append_item(uint8_t *d, uint8_t *pkd, uint64_t v, + uint8_t memotype, uint8_t *ovk, uint8_t *rcmv, uint8_t *rseed); uint8_t outputlist_len(); diff --git a/app/src/parser.c b/app/src/parser.c index 2e158927..98f20aee 100644 --- a/app/src/parser.c +++ b/app/src/parser.c @@ -1,422 +1,431 @@ /******************************************************************************* -* (c) 2018 -2022 Zondax AG -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -********************************************************************************/ + * (c) 2018 -2022 Zondax AG + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ********************************************************************************/ -#include -#include -#include -#include "app_mode.h" #include "parser.h" -#include "parser_impl.h" +#include "app_mode.h" #include "parser_common.h" +#include "parser_impl.h" +#include +#include +#include +#include "base58.h" +#include "bech32.h" #include "coin.h" +#include "nvdata.h" #include "parser_txdef.h" #include "rslib.h" -#include "nvdata.h" -#include "bech32.h" -#include "base58.h" #include "view.h" #include -#define DEFAULT_MEMOTYPE 0xf6 +#define DEFAULT_MEMOTYPE 0xf6 typedef enum { - type_tin = 0, - type_tout = 1, - type_sspend = 2, - type_sout = 3, - type_txfee = 4, + type_tin = 0, + type_tout = 1, + type_sspend = 2, + type_sout = 3, + type_txfee = 4, } sapling_parser_type_e; typedef struct { - sapling_parser_type_e type; - uint8_t index; + sapling_parser_type_e type; + uint8_t index; } parser_sapling_t; -parser_error_t parser_sapling_path_with_div(const uint8_t *data, size_t dataLen, parser_addr_div_t *prs) { - if (dataLen < 15) { - return parser_context_unexpected_size; - } - parser_context_t pars_ctx; - parser_error_t pars_err; - pars_ctx.offset = 0; - pars_ctx.buffer = data; - pars_ctx.bufferLen = 4; - uint32_t p = 0; - pars_err = _readUInt32(&pars_ctx, &p); - if (pars_err != parser_ok) { - return pars_err; - } - prs->path = p | 0x80000000; - memcpy(prs->div, data + 4, 11); - return parser_ok; +parser_error_t parser_sapling_path_with_div(const uint8_t *data, size_t dataLen, + parser_addr_div_t *prs) { + if (dataLen < 15) { + return parser_context_unexpected_size; + } + parser_context_t pars_ctx; + parser_error_t pars_err; + pars_ctx.offset = 0; + pars_ctx.buffer = data; + pars_ctx.bufferLen = 4; + uint32_t p = 0; + pars_err = _readUInt32(&pars_ctx, &p); + if (pars_err != parser_ok) { + return pars_err; + } + prs->path = p | 0x80000000; + memcpy(prs->div, data + 4, 11); + return parser_ok; } -parser_error_t parser_sapling_path(const uint8_t *data, size_t dataLen, uint32_t *p) { - if (dataLen < 4) { - return parser_context_unexpected_size; - } - parser_context_t pars_ctx; - parser_error_t pars_err; - pars_ctx.offset = 0; - pars_ctx.buffer = data; - pars_ctx.bufferLen = 4; - pars_err = _readUInt32(&pars_ctx, p); - if (pars_err != parser_ok) { - return pars_err; - } - *p |= 0x80000000; - return parser_ok; +parser_error_t parser_sapling_path(const uint8_t *data, size_t dataLen, + uint32_t *p) { + if (dataLen < 4) { + return parser_context_unexpected_size; + } + parser_context_t pars_ctx; + parser_error_t pars_err; + pars_ctx.offset = 0; + pars_ctx.buffer = data; + pars_ctx.bufferLen = 4; + pars_err = _readUInt32(&pars_ctx, p); + if (pars_err != parser_ok) { + return pars_err; + } + *p |= 0x80000000; + return parser_ok; } void view_tx_state() { - #if !defined(TARGET_STAX) - uint8_t state = get_state(); - switch (state) { - case STATE_PROCESSED_INPUTS: - case STATE_PROCESSED_SPEND_EXTRACTIONS: { - view_message_show("Zcash", "Step [1/5]"); - break; - } - - case STATE_PROCESSED_ALL_EXTRACTIONS: { - view_message_show("Zcash", "Step [2/5]"); - break; - } - - case STATE_CHECKING_ALL_TXDATA: { - view_message_show("Zcash", "Step [3/5]"); - break; - } - - case STATE_VERIFIED_ALL_TXDATA: { - view_message_show("Zcash", "Step [4/5]"); - break; - } - - case STATE_SIGNED_TX: { - view_message_show("Zcash", "Step [5/5]"); - break; - } - - default: { - view_idle_show(0, NULL); - } - } - UX_WAIT_DISPLAYED(); - #endif - return; +#if !defined(TARGET_STAX) + uint8_t state = get_state(); + switch (state) { + case STATE_PROCESSED_INPUTS: + case STATE_PROCESSED_SPEND_EXTRACTIONS: { + view_message_show("Zcash", "Step [1/5]"); + break; + } + + case STATE_PROCESSED_ALL_EXTRACTIONS: { + view_message_show("Zcash", "Step [2/5]"); + break; + } + + case STATE_CHECKING_ALL_TXDATA: { + view_message_show("Zcash", "Step [3/5]"); + break; + } + + case STATE_VERIFIED_ALL_TXDATA: { + view_message_show("Zcash", "Step [4/5]"); + break; + } + + case STATE_SIGNED_TX: { + view_message_show("Zcash", "Step [5/5]"); + break; + } + + default: { + view_idle_show(0, NULL); + } + } + UX_WAIT_DISPLAYED(); +#endif + return; } -parser_error_t parser_parse(parser_context_t *ctx, const uint8_t *data, size_t dataLen) { - CHECK_PARSER_ERR(parser_init(ctx, data, dataLen)) - +parser_error_t parser_parse(parser_context_t *ctx, const uint8_t *data, + size_t dataLen) { + CHECK_PARSER_ERR(parser_init(ctx, data, dataLen)) - - return parser_ok; + return parser_ok; } parser_error_t parser_validate() { - // Iterate through all items to check that all can be shown and are valid - uint8_t numItems = 0; - CHECK_PARSER_ERR(parser_getNumItems(&numItems)) + // Iterate through all items to check that all can be shown and are valid + uint8_t numItems = 0; + CHECK_PARSER_ERR(parser_getNumItems(&numItems)) - char tmpKey[30]; - char tmpVal[30]; + char tmpKey[30]; + char tmpVal[30]; - for (uint8_t idx = 0; idx < numItems; idx++) { - uint8_t pageCount = 0; - CHECK_PARSER_ERR(parser_getItem( idx, tmpKey, sizeof(tmpKey), tmpVal, sizeof(tmpVal), 0, &pageCount)) - } + for (uint8_t idx = 0; idx < numItems; idx++) { + uint8_t pageCount = 0; + CHECK_PARSER_ERR(parser_getItem(idx, tmpKey, sizeof(tmpKey), tmpVal, + sizeof(tmpVal), 0, &pageCount)) + } - return parser_ok; + return parser_ok; } parser_error_t parser_sapling_display_value(uint64_t value, char *outVal, uint16_t outValLen, uint8_t pageIdx, uint8_t *pageCount) { - char tmpBuffer[100]; - fpuint64_to_str(tmpBuffer, sizeof(tmpBuffer), value, 8); - pageString(outVal, outValLen, tmpBuffer, pageIdx, pageCount); - return parser_ok; + char tmpBuffer[100]; + fpuint64_to_str(tmpBuffer, sizeof(tmpBuffer), value, 8); + pageString(outVal, outValLen, tmpBuffer, pageIdx, pageCount); + return parser_ok; } -parser_error_t parser_sapling_display_address_t(const uint8_t *addr, char *outVal, - uint16_t outValLen, uint8_t pageIdx, +parser_error_t parser_sapling_display_address_t(const uint8_t *addr, + char *outVal, + uint16_t outValLen, + uint8_t pageIdx, uint8_t *pageCount) { - MEMZERO(outVal, outValLen); + MEMZERO(outVal, outValLen); - uint8_t address[VERSION_SIZE + CX_RIPEMD160_SIZE + CX_SHA256_SIZE]; - address[0] = VERSION_P2PKH >> 8; - address[1] = VERSION_P2PKH & 0xFF; - MEMCPY(address + VERSION_SIZE, addr + 4, CX_RIPEMD160_SIZE); + uint8_t address[VERSION_SIZE + CX_RIPEMD160_SIZE + CX_SHA256_SIZE]; + address[0] = VERSION_P2PKH >> 8; + address[1] = VERSION_P2PKH & 0xFF; + MEMCPY(address + VERSION_SIZE, addr + 4, CX_RIPEMD160_SIZE); - cx_hash_sha256(address, - VERSION_SIZE + CX_RIPEMD160_SIZE, - address + VERSION_SIZE + CX_RIPEMD160_SIZE, - CX_SHA256_SIZE); + cx_hash_sha256(address, VERSION_SIZE + CX_RIPEMD160_SIZE, + address + VERSION_SIZE + CX_RIPEMD160_SIZE, CX_SHA256_SIZE); - cx_hash_sha256(address + VERSION_SIZE + CX_RIPEMD160_SIZE, CX_SHA256_SIZE, - address + VERSION_SIZE + CX_RIPEMD160_SIZE, CX_SHA256_SIZE); + cx_hash_sha256(address + VERSION_SIZE + CX_RIPEMD160_SIZE, CX_SHA256_SIZE, + address + VERSION_SIZE + CX_RIPEMD160_SIZE, CX_SHA256_SIZE); - uint8_t tmpBuffer[60]; - size_t outLen = sizeof(tmpBuffer); + uint8_t tmpBuffer[60]; + size_t outLen = sizeof(tmpBuffer); - int err = encode_base58(address, VERSION_SIZE + CX_RIPEMD160_SIZE + CHECKSUM_SIZE, tmpBuffer, &outLen); - if (err != 0) { - return parser_unexpected_error; - } + int err = + encode_base58(address, VERSION_SIZE + CX_RIPEMD160_SIZE + CHECKSUM_SIZE, + tmpBuffer, &outLen); + if (err != 0) { + return parser_unexpected_error; + } - pageString(outVal, outValLen, (char *) tmpBuffer, pageIdx, pageCount); - return parser_ok; + pageString(outVal, outValLen, (char *)tmpBuffer, pageIdx, pageCount); + return parser_ok; } -parser_error_t parser_sapling_display_address_s(uint8_t *div, uint8_t *pkd, char *outVal, - uint16_t outValLen, uint8_t pageIdx, +parser_error_t parser_sapling_display_address_s(uint8_t *div, uint8_t *pkd, + char *outVal, + uint16_t outValLen, + uint8_t pageIdx, uint8_t *pageCount) { - uint8_t address[DIV_SIZE + PKD_SIZE]; - MEMCPY(address, div, DIV_SIZE); - MEMCPY(address + DIV_SIZE, pkd, PKD_SIZE); - char tmpBuffer[100]; - bech32EncodeFromBytes(tmpBuffer, sizeof(tmpBuffer), - BECH32_HRP, - address, - sizeof(address), - 1, BECH32_ENCODING_BECH32); - pageString(outVal, outValLen, tmpBuffer, pageIdx, pageCount); - return parser_ok; + uint8_t address[DIV_SIZE + PKD_SIZE]; + MEMCPY(address, div, DIV_SIZE); + MEMCPY(address + DIV_SIZE, pkd, PKD_SIZE); + char tmpBuffer[100]; + bech32EncodeFromBytes(tmpBuffer, sizeof(tmpBuffer), BECH32_HRP, address, + sizeof(address), 1, BECH32_ENCODING_BECH32); + pageString(outVal, outValLen, tmpBuffer, pageIdx, pageCount); + return parser_ok; } -parser_error_t parser_sapling_getTypes(const uint16_t displayIdx, parser_sapling_t *prs) { - uint16_t index = displayIdx; +parser_error_t parser_sapling_getTypes(const uint16_t displayIdx, + parser_sapling_t *prs) { + uint16_t index = displayIdx; - if (index < t_inlist_len() * NUM_ITEMS_TIN && t_inlist_len() > 0) { - prs->type = type_tin; - prs->index = index; - return parser_ok; - } - index -= t_inlist_len() * NUM_ITEMS_TIN; - if (index < t_outlist_len() * NUM_ITEMS_TOUT && t_outlist_len() > 0) { - prs->type = type_tout; - prs->index = index; - return parser_ok; - } - index -= t_outlist_len() * NUM_ITEMS_TOUT; - if (index < spendlist_len() * NUM_ITEMS_SSPEND && spendlist_len() > 0) { - prs->type = type_sspend; - prs->index = index; - return parser_ok; - } - index -= spendlist_len() * NUM_ITEMS_SSPEND; - if (index < outputlist_len() * NUM_ITEMS_SOUT && outputlist_len() > 0) { - prs->type = type_sout; - prs->index = index; - return parser_ok; - } - prs->type = type_txfee; + if (index < t_inlist_len() * NUM_ITEMS_TIN && t_inlist_len() > 0) { + prs->type = type_tin; + prs->index = index; + return parser_ok; + } + index -= t_inlist_len() * NUM_ITEMS_TIN; + if (index < t_outlist_len() * NUM_ITEMS_TOUT && t_outlist_len() > 0) { + prs->type = type_tout; + prs->index = index; + return parser_ok; + } + index -= t_outlist_len() * NUM_ITEMS_TOUT; + if (index < spendlist_len() * NUM_ITEMS_SSPEND && spendlist_len() > 0) { + prs->type = type_sspend; + prs->index = index; + return parser_ok; + } + index -= spendlist_len() * NUM_ITEMS_SSPEND; + if (index < outputlist_len() * NUM_ITEMS_SOUT && outputlist_len() > 0) { + prs->type = type_sout; + prs->index = index; return parser_ok; + } + prs->type = type_txfee; + return parser_ok; } parser_error_t parser_getNumItems(uint8_t *num_items) { - *num_items = t_inlist_len() * NUM_ITEMS_TIN + - t_outlist_len() * NUM_ITEMS_TOUT + - spendlist_len() * NUM_ITEMS_SSPEND + - outputlist_len() * NUM_ITEMS_SOUT + - NUM_ITEMS_CONST; + *num_items = t_inlist_len() * NUM_ITEMS_TIN + + t_outlist_len() * NUM_ITEMS_TOUT + + spendlist_len() * NUM_ITEMS_SSPEND + + outputlist_len() * NUM_ITEMS_SOUT + NUM_ITEMS_CONST; - return parser_ok; + return parser_ok; } -parser_error_t parser_getItem(uint8_t displayIdx, - char *outKey, uint16_t outKeyLen, - char *outVal, uint16_t outValLen, - uint8_t pageIdx, uint8_t *pageCount) { - MEMZERO(outKey, outKeyLen); - MEMZERO(outVal, outValLen); - snprintf(outKey, outKeyLen, "?"); - snprintf(outVal, outValLen, "?"); - *pageCount = 1; - - uint8_t numItems; - CHECK_PARSER_ERR(parser_getNumItems(&numItems)) - CHECK_APP_CANARY() - - - if (displayIdx < 0 || displayIdx >= numItems) { - return parser_no_data; +parser_error_t parser_getItem(uint8_t displayIdx, char *outKey, + uint16_t outKeyLen, char *outVal, + uint16_t outValLen, uint8_t pageIdx, + uint8_t *pageCount) { + MEMZERO(outKey, outKeyLen); + MEMZERO(outVal, outValLen); + snprintf(outKey, outKeyLen, "?"); + snprintf(outVal, outValLen, "?"); + *pageCount = 1; + + uint8_t numItems; + CHECK_PARSER_ERR(parser_getNumItems(&numItems)) + CHECK_APP_CANARY() + + if (displayIdx < 0 || displayIdx >= numItems) { + return parser_no_data; + } + + parser_sapling_t prs; + MEMZERO(&prs, sizeof(parser_sapling_t)); + CHECK_PARSER_ERR(parser_sapling_getTypes(displayIdx, &prs)); + + // FIXME: what decimals to take for ZECs? + + switch (prs.type) { + case type_tin: { + uint8_t itemnum = prs.index / NUM_ITEMS_TIN; + const t_input_item_t *item = t_inlist_retrieve_item(itemnum); + uint8_t itemtype = prs.index % NUM_ITEMS_TIN; + + switch (itemtype) { + case 0: { + snprintf(outKey, outKeyLen, "T-in addr"); + return parser_sapling_display_address_t(item->script, outVal, outValLen, + pageIdx, pageCount); + } + case 1: { + snprintf(outKey, outKeyLen, "T-in (ZEC)"); + return parser_sapling_display_value(item->value, outVal, outValLen, + pageIdx, pageCount); + } + } + } + + case type_tout: { + uint8_t itemnum = prs.index / NUM_ITEMS_TOUT; + t_output_item_t *item = t_outlist_retrieve_item(itemnum); + uint8_t itemtype = prs.index % NUM_ITEMS_TOUT; + switch (itemtype) { + case 0: { + snprintf(outKey, outKeyLen, "T-out addr"); + return parser_sapling_display_address_t(item->address, outVal, outValLen, + pageIdx, pageCount); + } + case 1: { + snprintf(outKey, outKeyLen, "T-out (ZEC)"); + return parser_sapling_display_value(item->value, outVal, outValLen, + pageIdx, pageCount); + } + } + } + case type_sspend: { + uint8_t itemnum = prs.index / NUM_ITEMS_SSPEND; + spend_item_t *item = spendlist_retrieve_item(itemnum); + uint8_t itemtype = prs.index % NUM_ITEMS_SSPEND; + switch (itemtype) { + case 0: { + snprintf(outKey, outKeyLen, "S-in addr"); + return parser_sapling_display_address_s(item->div, item->pkd, outVal, + outValLen, pageIdx, pageCount); + } + case 1: { + snprintf(outKey, outKeyLen, "S-in (ZEC)"); + return parser_sapling_display_value(item->value, outVal, outValLen, + pageIdx, pageCount); + } + } + } + + case type_sout: { + + uint8_t itemnum = prs.index / NUM_ITEMS_SOUT; + output_item_t *item = outputlist_retrieve_item(itemnum); + uint8_t itemtype = prs.index % NUM_ITEMS_SOUT; + switch (itemtype) { + case 0: { + snprintf(outKey, outKeyLen, "S-out addr"); + return parser_sapling_display_address_s(item->div, item->pkd, outVal, + outValLen, pageIdx, pageCount); + } + case 1: { + snprintf(outKey, outKeyLen, "S-out (ZEC)"); + return parser_sapling_display_value(item->value, outVal, outValLen, + pageIdx, pageCount); + } + case 2: { + snprintf(outKey, outKeyLen, "S-out Memotype"); + if (item->memotype == DEFAULT_MEMOTYPE) { + snprintf(outVal, outValLen, "Default"); + } else { + snprintf(outVal, outValLen, "Custom"); + } + return parser_ok; } - parser_sapling_t prs; - MEMZERO(&prs, sizeof(parser_sapling_t)); - CHECK_PARSER_ERR(parser_sapling_getTypes(displayIdx, &prs)); - - // FIXME: what decimals to take for ZECs? - - switch (prs.type) { - case type_tin : { - uint8_t itemnum = prs.index / NUM_ITEMS_TIN; - const t_input_item_t *item = t_inlist_retrieve_item(itemnum); - uint8_t itemtype = prs.index % NUM_ITEMS_TIN; - - switch (itemtype) { - case 0: { - snprintf(outKey, outKeyLen, "T-in addr"); - return parser_sapling_display_address_t(item->script, outVal, outValLen, pageIdx, pageCount); - } - case 1: { - snprintf(outKey, outKeyLen, "T-in (ZEC)"); - return parser_sapling_display_value(item->value, outVal, outValLen, pageIdx, pageCount); - } - } - } - - case type_tout : { - uint8_t itemnum = prs.index / NUM_ITEMS_TOUT; - t_output_item_t *item = t_outlist_retrieve_item(itemnum); - uint8_t itemtype = prs.index % NUM_ITEMS_TOUT; - switch (itemtype) { - case 0: { - snprintf(outKey, outKeyLen, "T-out addr"); - return parser_sapling_display_address_t(item->address, outVal, outValLen, pageIdx, pageCount); - } - case 1: { - snprintf(outKey, outKeyLen, "T-out (ZEC)"); - return parser_sapling_display_value(item->value, outVal, outValLen, pageIdx, pageCount); - } - } - } - case type_sspend: { - uint8_t itemnum = prs.index / NUM_ITEMS_SSPEND; - spend_item_t *item = spendlist_retrieve_item(itemnum); - uint8_t itemtype = prs.index % NUM_ITEMS_SSPEND; - switch (itemtype) { - case 0: { - snprintf(outKey, outKeyLen, "S-in addr"); - return parser_sapling_display_address_s(item->div, item->pkd, outVal, outValLen, pageIdx, - pageCount); - } - case 1: { - snprintf(outKey, outKeyLen, "S-in (ZEC)"); - return parser_sapling_display_value(item->value, outVal, outValLen, pageIdx, pageCount); - } - } - } - - case type_sout: { - - uint8_t itemnum = prs.index / NUM_ITEMS_SOUT; - output_item_t *item = outputlist_retrieve_item(itemnum); - uint8_t itemtype = prs.index % NUM_ITEMS_SOUT; - switch (itemtype) { - case 0: { - snprintf(outKey, outKeyLen, "S-out addr"); - return parser_sapling_display_address_s(item->div, item->pkd, outVal, outValLen, pageIdx, - pageCount); - } - case 1: { - snprintf(outKey, outKeyLen, "S-out (ZEC)"); - return parser_sapling_display_value(item->value, outVal, outValLen, pageIdx, pageCount); - } - case 2: { - snprintf(outKey, outKeyLen, "S-out Memotype"); - if (item->memotype == DEFAULT_MEMOTYPE) { - snprintf(outVal, outValLen, "Default"); - } else { - snprintf(outVal, outValLen, "Custom"); - } - return parser_ok; - } - - case 3: { - snprintf(outKey, outKeyLen, "S-out OVK"); - uint8_t dummy[OVK_SIZE]; - MEMZERO(dummy, sizeof(dummy)); - if (item->ovk[0] == 0x01) { - char tmpBuffer[100]; - array_to_hexstr(tmpBuffer, sizeof(tmpBuffer), item->ovk + 1, OVK_SIZE); - pageString(outVal, outValLen, tmpBuffer, pageIdx, pageCount); - return parser_ok; - } else { - snprintf(outVal, outValLen, "None"); - } - return parser_ok; - } - } - } - - case type_txfee: { - snprintf(outKey, outKeyLen, "Fee"); - return parser_sapling_display_value(get_totalvalue(), outVal, outValLen, pageIdx, pageCount); - } - - default: { - return parser_no_data; - } + case 3: { + snprintf(outKey, outKeyLen, "S-out OVK"); + uint8_t dummy[OVK_SIZE]; + MEMZERO(dummy, sizeof(dummy)); + if (item->ovk[0] == 0x01) { + char tmpBuffer[100]; + array_to_hexstr(tmpBuffer, sizeof(tmpBuffer), item->ovk + 1, OVK_SIZE); + pageString(outVal, outValLen, tmpBuffer, pageIdx, pageCount); + return parser_ok; + } else { + snprintf(outVal, outValLen, "None"); + } + return parser_ok; } - return parser_ok; + } + } + + case type_txfee: { + snprintf(outKey, outKeyLen, "Fee"); + return parser_sapling_display_value(get_totalvalue(), outVal, outValLen, + pageIdx, pageCount); + } + + default: { + return parser_no_data; + } + } + return parser_ok; } const char *parser_getErrorDescription(parser_error_t err) { - switch (err) { - // General errors - case parser_ok: - return "No error"; - case parser_no_data: - return "No more data"; - case parser_init_context_empty: - return "Initialized empty context"; - case parser_display_idx_out_of_range: - return "display_idx_out_of_range"; - case parser_display_page_out_of_range: - return "display_page_out_of_range"; - case parser_unexpected_error: - return "Unexpected internal error"; - case parser_no_memory_for_state: - return "No enough memory for parser state"; - /////////// Context specific - case parser_context_mismatch: - return "context prefix is invalid"; - case parser_context_unexpected_size: - return "context unexpected size"; - case parser_context_invalid_chars: - return "context invalid chars"; - // Required fields error - // Coin specific - case parser_invalid_output_script: - return "Invalid output script"; - case parser_unexpected_type: - return "Unexpected data type"; - case parser_unexpected_method: - return "Unexpected method"; - case parser_unexpected_buffer_end: - return "Unexpected buffer end"; - case parser_unexpected_value: - return "Unexpected value"; - case parser_unexpected_number_items: - return "Unexpected number of items"; - case parser_unexpected_characters: - return "Unexpected characters"; - case parser_unexpected_field: - return "Unexpected field"; - case parser_value_out_of_range: - return "Value out of range"; - case parser_invalid_address: - return "Invalid address format"; - default: - return "Unrecognized error code"; - } + switch (err) { + // General errors + case parser_ok: + return "No error"; + case parser_no_data: + return "No more data"; + case parser_init_context_empty: + return "Initialized empty context"; + case parser_display_idx_out_of_range: + return "display_idx_out_of_range"; + case parser_display_page_out_of_range: + return "display_page_out_of_range"; + case parser_unexpected_error: + return "Unexpected internal error"; + case parser_no_memory_for_state: + return "No enough memory for parser state"; + /////////// Context specific + case parser_context_mismatch: + return "context prefix is invalid"; + case parser_context_unexpected_size: + return "context unexpected size"; + case parser_context_invalid_chars: + return "context invalid chars"; + // Required fields error + // Coin specific + case parser_invalid_output_script: + return "Invalid output script"; + case parser_unexpected_type: + return "Unexpected data type"; + case parser_unexpected_method: + return "Unexpected method"; + case parser_unexpected_buffer_end: + return "Unexpected buffer end"; + case parser_unexpected_value: + return "Unexpected value"; + case parser_unexpected_number_items: + return "Unexpected number of items"; + case parser_unexpected_characters: + return "Unexpected characters"; + case parser_unexpected_field: + return "Unexpected field"; + case parser_value_out_of_range: + return "Value out of range"; + case parser_invalid_address: + return "Invalid address format"; + default: + return "Unrecognized error code"; + } } diff --git a/app/src/parser.h b/app/src/parser.h index ace10ccd..0814d290 100644 --- a/app/src/parser.h +++ b/app/src/parser.h @@ -1,18 +1,18 @@ /******************************************************************************* -* (c) 2018 -2022 Zondax AG -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -********************************************************************************/ + * (c) 2018 -2022 Zondax AG + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ********************************************************************************/ #pragma once @@ -20,31 +20,34 @@ extern "C" { #endif +#include "crypto.h" +#include "hexutils.h" #include "parser_common.h" #include "parser_txdef.h" -#include "hexutils.h" -#include "crypto.h" -#define NUM_ITEMS_TIN 2 //address, value -#define NUM_ITEMS_TOUT 2 //address, value -#define NUM_ITEMS_SSPEND 2 //address, value -#define NUM_ITEMS_SOUT 4 //address, value, memotype, OVK? -#define NUM_ITEMS_CONST 1 //txfee +#define NUM_ITEMS_TIN 2 // address, value +#define NUM_ITEMS_TOUT 2 // address, value +#define NUM_ITEMS_SSPEND 2 // address, value +#define NUM_ITEMS_SOUT 4 // address, value, memotype, OVK? +#define NUM_ITEMS_CONST 1 // txfee typedef struct { - uint32_t path; - uint8_t div[11]; + uint32_t path; + uint8_t div[11]; } parser_addr_div_t; -parser_error_t parser_sapling_path_with_div(const uint8_t *data, size_t dataLen, parser_addr_div_t *prs); -parser_error_t parser_sapling_path(const uint8_t *data, size_t dataLen, uint32_t *p); +parser_error_t parser_sapling_path_with_div(const uint8_t *data, size_t dataLen, + parser_addr_div_t *prs); +parser_error_t parser_sapling_path(const uint8_t *data, size_t dataLen, + uint32_t *p); void view_tx_state(); const char *parser_getErrorDescription(parser_error_t err); //// parses a tx buffer -parser_error_t parser_parse(parser_context_t *ctx, const uint8_t *data, size_t dataLen); +parser_error_t parser_parse(parser_context_t *ctx, const uint8_t *data, + size_t dataLen); //// verifies tx fields parser_error_t parser_validate(); @@ -53,10 +56,10 @@ parser_error_t parser_validate(); parser_error_t parser_getNumItems(uint8_t *num_items); // retrieves a readable output for each field / page -parser_error_t parser_getItem(uint8_t displayIdx, - char *outKey, uint16_t outKeyLen, - char *outValue, uint16_t outValueLen, - uint8_t pageIdx, uint8_t *pageCount); +parser_error_t parser_getItem(uint8_t displayIdx, char *outKey, + uint16_t outKeyLen, char *outValue, + uint16_t outValueLen, uint8_t pageIdx, + uint8_t *pageCount); void parser_resetState(); diff --git a/app/src/parser_common.h b/app/src/parser_common.h index 0c4b836f..c750abcf 100644 --- a/app/src/parser_common.h +++ b/app/src/parser_common.h @@ -1,18 +1,18 @@ /******************************************************************************* -* (c) 2019 Zondax AG -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -********************************************************************************/ + * (c) 2019 Zondax AG + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ********************************************************************************/ #pragma once #ifdef __cplusplus @@ -20,58 +20,61 @@ extern "C" { #endif #include "parser_txdef.h" -#include #include +#include -#define CHECK_PARSER_ERR(__CALL) { \ - parser_error_t __err = __CALL; \ - CHECK_APP_CANARY() \ - if (__err!=parser_ok) return __err;} +#define CHECK_PARSER_ERR(__CALL) \ + { \ + parser_error_t __err = __CALL; \ + CHECK_APP_CANARY() \ + if (__err != parser_ok) \ + return __err; \ + } typedef enum { - // Generic errors - parser_ok = 0, - parser_no_data, - parser_init_context_empty, - parser_display_idx_out_of_range, - parser_display_page_out_of_range, - parser_unexpected_error, - parser_no_memory_for_state, - // Context related errors - parser_context_mismatch, - parser_context_unexpected_size, - parser_context_invalid_chars, - parser_context_unknown_prefix, - // Required fields - //////////////////////// - // Coin specific - parser_invalid_output_script, - parser_unexpected_type, - parser_unexpected_method, - parser_not_allowed, - parser_not_supported, - parser_unexpected_buffer_end, - parser_unexpected_value, - parser_unexpected_number_items, - parser_unexpected_characters, - parser_unexpected_field, - parser_value_out_of_range, - parser_invalid_address, - parser_value_too_many_bytes, - parser_unexpected_module, - parser_unexpected_callIndex, - parser_unexpected_unparsed_bytes, - parser_print_not_supported, - parser_tx_nesting_not_supported, - parser_tx_nesting_limit_reached, - parser_tx_call_vec_too_large, + // Generic errors + parser_ok = 0, + parser_no_data, + parser_init_context_empty, + parser_display_idx_out_of_range, + parser_display_page_out_of_range, + parser_unexpected_error, + parser_no_memory_for_state, + // Context related errors + parser_context_mismatch, + parser_context_unexpected_size, + parser_context_invalid_chars, + parser_context_unknown_prefix, + // Required fields + //////////////////////// + // Coin specific + parser_invalid_output_script, + parser_unexpected_type, + parser_unexpected_method, + parser_not_allowed, + parser_not_supported, + parser_unexpected_buffer_end, + parser_unexpected_value, + parser_unexpected_number_items, + parser_unexpected_characters, + parser_unexpected_field, + parser_value_out_of_range, + parser_invalid_address, + parser_value_too_many_bytes, + parser_unexpected_module, + parser_unexpected_callIndex, + parser_unexpected_unparsed_bytes, + parser_print_not_supported, + parser_tx_nesting_not_supported, + parser_tx_nesting_limit_reached, + parser_tx_call_vec_too_large, } parser_error_t; typedef struct { - const uint8_t *buffer; - uint16_t bufferLen; - uint16_t offset; - parser_tx_t *tx_obj; + const uint8_t *buffer; + uint16_t bufferLen; + uint16_t offset; + parser_tx_t *tx_obj; } parser_context_t; #ifdef __cplusplus diff --git a/app/src/parser_impl.c b/app/src/parser_impl.c index 9eeb7472..4a010155 100644 --- a/app/src/parser_impl.c +++ b/app/src/parser_impl.c @@ -1,92 +1,94 @@ /******************************************************************************* -* (c) 2019 Zondax AG -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -********************************************************************************/ + * (c) 2019 Zondax AG + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ********************************************************************************/ -#include #include "parser_impl.h" -#include "parser_txdef.h" #include "coin.h" #include "crypto.h" +#include "parser_txdef.h" #include "zxformat.h" +#include -parser_error_t parser_init_context(parser_context_t *ctx, const uint8_t *buffer, uint16_t bufferSize) { - ctx->offset = 0; - ctx->buffer = NULL; - ctx->bufferLen = 0; +parser_error_t parser_init_context(parser_context_t *ctx, const uint8_t *buffer, + uint16_t bufferSize) { + ctx->offset = 0; + ctx->buffer = NULL; + ctx->bufferLen = 0; - if (bufferSize == 0 || buffer == NULL) { - // Not available, use defaults - return parser_init_context_empty; - } + if (bufferSize == 0 || buffer == NULL) { + // Not available, use defaults + return parser_init_context_empty; + } - ctx->buffer = buffer; - ctx->bufferLen = bufferSize; + ctx->buffer = buffer; + ctx->bufferLen = bufferSize; - ZEMU_LOGF(100, "init_context %d bytes", bufferSize); + ZEMU_LOGF(100, "init_context %d bytes", bufferSize); - return parser_ok; + return parser_ok; } -parser_error_t parser_init(parser_context_t *ctx, const uint8_t *buffer, uint16_t bufferSize) { - CHECK_PARSER_ERR(parser_init_context(ctx, buffer, bufferSize)) - return parser_ok; +parser_error_t parser_init(parser_context_t *ctx, const uint8_t *buffer, + uint16_t bufferSize) { + CHECK_PARSER_ERR(parser_init_context(ctx, buffer, bufferSize)) + return parser_ok; } const char *parser_getErrorDescription(parser_error_t err) { - switch (err) { - // General errors - case parser_ok: - return "No error"; - case parser_no_data: - return "No more data"; - case parser_init_context_empty: - return "Initialized empty context"; - case parser_display_idx_out_of_range: - return "display_idx_out_of_range"; - case parser_display_page_out_of_range: - return "display_page_out_of_range"; - // Coin specific - case parser_not_allowed: - return "Not allowed"; - case parser_not_supported: - return "Not supported"; - case parser_unexpected_buffer_end: - return "Unexpected buffer end"; - case parser_unexpected_value: - return "Unexpected value"; - case parser_value_out_of_range: - return "Value out of range"; - case parser_value_too_many_bytes: - return "Value too many bytes"; - case parser_unexpected_module: - return "Unexpected module"; - case parser_unexpected_callIndex: - return "Unexpected call index"; - case parser_unexpected_unparsed_bytes: - return "Unexpected unparsed bytes"; - case parser_print_not_supported: - return "Value cannot be printed"; - case parser_tx_nesting_not_supported: - return "Call nesting not supported"; - case parser_tx_nesting_limit_reached: - return "Max nested calls reached"; - case parser_tx_call_vec_too_large: - return "Call vector exceeds limit"; - default: - return "Unrecognized error code"; - } + switch (err) { + // General errors + case parser_ok: + return "No error"; + case parser_no_data: + return "No more data"; + case parser_init_context_empty: + return "Initialized empty context"; + case parser_display_idx_out_of_range: + return "display_idx_out_of_range"; + case parser_display_page_out_of_range: + return "display_page_out_of_range"; + // Coin specific + case parser_not_allowed: + return "Not allowed"; + case parser_not_supported: + return "Not supported"; + case parser_unexpected_buffer_end: + return "Unexpected buffer end"; + case parser_unexpected_value: + return "Unexpected value"; + case parser_value_out_of_range: + return "Value out of range"; + case parser_value_too_many_bytes: + return "Value too many bytes"; + case parser_unexpected_module: + return "Unexpected module"; + case parser_unexpected_callIndex: + return "Unexpected call index"; + case parser_unexpected_unparsed_bytes: + return "Unexpected unparsed bytes"; + case parser_print_not_supported: + return "Value cannot be printed"; + case parser_tx_nesting_not_supported: + return "Call nesting not supported"; + case parser_tx_nesting_limit_reached: + return "Max nested calls reached"; + case parser_tx_call_vec_too_large: + return "Call vector exceeds limit"; + default: + return "Unrecognized error code"; + } } GEN_DEF_READFIX_UNSIGNED(8) diff --git a/app/src/parser_impl.h b/app/src/parser_impl.h index 5b01153b..e19339d9 100644 --- a/app/src/parser_impl.h +++ b/app/src/parser_impl.h @@ -1,94 +1,111 @@ /******************************************************************************* -* (c) 2019 Zondax AG -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -********************************************************************************/ + * (c) 2019 Zondax AG + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ********************************************************************************/ #pragma once #include "parser_common.h" #include "parser_txdef.h" -#include #include "zxtypes.h" +#include #ifdef __cplusplus extern "C" { #endif -#include #include +#include #include - // Checks that there are at least SIZE bytes available in the buffer -#define CTX_CHECK_AVAIL(CTX, SIZE) \ - if ( (CTX) == NULL || ((CTX)->offset + SIZE) > (CTX)->bufferLen) { return parser_unexpected_buffer_end; } +#define CTX_CHECK_AVAIL(CTX, SIZE) \ + if ((CTX) == NULL || ((CTX)->offset + SIZE) > (CTX)->bufferLen) { \ + return parser_unexpected_buffer_end; \ + } -#define CTX_CHECK_AND_ADVANCE(CTX, SIZE) \ - CTX_CHECK_AVAIL((CTX), (SIZE)) \ - (CTX)->offset += (SIZE); +#define CTX_CHECK_AND_ADVANCE(CTX, SIZE) \ + CTX_CHECK_AVAIL((CTX), (SIZE)) \ + (CTX)->offset += (SIZE); // Checks function input is valid -#define CHECK_INPUT() \ - if (v == NULL) { return parser_no_data; } \ - CTX_CHECK_AVAIL(c, 1) // Checks that there is something available in the buffer - -#define CLEAN_AND_CHECK() \ - MEMZERO(outValue, outValueLen); \ - if (v == NULL) { *pageCount = 0; return parser_no_data; } - -#define GEN_DEF_READARRAY(SIZE) \ - v->_ptr = c->buffer + c->offset; \ - CTX_CHECK_AND_ADVANCE(c, SIZE) \ - return parser_ok; - -#define GEN_DEF_TOSTRING_ARRAY(SIZE) \ - CLEAN_AND_CHECK(); \ - if (v->_ptr == NULL || outValueLen == 0 ) return parser_unexpected_buffer_end; \ - const uint16_t outLenNormalized = (outValueLen - 1) / 2; \ - *pageCount = SIZE / outLenNormalized; \ - if (SIZE % outLenNormalized != 0) *pageCount+=1; \ - const uint16_t pageOffset = pageIdx * outLenNormalized; \ - uint16_t loopmax = outLenNormalized; \ - if (loopmax > SIZE - pageOffset) loopmax = SIZE - pageOffset; \ - for (uint16_t i = 0; i < loopmax; i++) { \ - const uint16_t offset = i << 1u; \ - const uint8_t *c = v->_ptr + pageOffset; \ - snprintf(outValue + offset, outValueLen - offset, "%02x", c[i]); \ - } \ - return parser_ok; - -#define GEN_DEC_READFIX_UNSIGNED(BITS) parser_error_t _readUInt ## BITS(parser_context_t *ctx, uint ## BITS ##_t *value) -#define GEN_DEF_READFIX_UNSIGNED(BITS) parser_error_t _readUInt ## BITS(parser_context_t *ctx, uint ## BITS ##_t *value) \ -{ \ - if (value == NULL) return parser_no_data; \ - *value = 0u; \ - for(uint8_t i=0u; i < (BITS##u>>3u); i++, ctx->offset++) { \ - if (ctx->offset >= ctx->bufferLen) return parser_unexpected_buffer_end; \ - *value += (uint ## BITS ##_t) *(ctx->buffer + ctx->offset) << (8u*i); \ - } \ - return parser_ok; \ -} -#define GEN_DEC_READFIX_SIGNED(BITS) parser_error_t _readInt ## BITS(parser_context_t *ctx, int ## BITS ##_t *value) -#define GEN_DEF_READFIX_SIGNED(BITS) parser_error_t _readInt ## BITS(parser_context_t *ctx, int ## BITS ##_t *value) \ -{ \ - if (value == NULL) return parser_no_data; \ - *value = 0; \ - for(int8_t i=0; i < (BITS>>3); i++, ctx->offset++) { \ - if (ctx->offset >= ctx->bufferLen) return parser_unexpected_buffer_end; \ - *value += (int ## BITS ##_t) *(ctx->buffer + ctx->offset) << (8*i); \ - } \ - return parser_ok; \ -} +#define CHECK_INPUT() \ + if (v == NULL) { \ + return parser_no_data; \ + } \ + CTX_CHECK_AVAIL(c, \ + 1) // Checks that there is something available in the buffer + +#define CLEAN_AND_CHECK() \ + MEMZERO(outValue, outValueLen); \ + if (v == NULL) { \ + *pageCount = 0; \ + return parser_no_data; \ + } + +#define GEN_DEF_READARRAY(SIZE) \ + v->_ptr = c->buffer + c->offset; \ + CTX_CHECK_AND_ADVANCE(c, SIZE) \ + return parser_ok; + +#define GEN_DEF_TOSTRING_ARRAY(SIZE) \ + CLEAN_AND_CHECK(); \ + if (v->_ptr == NULL || outValueLen == 0) \ + return parser_unexpected_buffer_end; \ + const uint16_t outLenNormalized = (outValueLen - 1) / 2; \ + *pageCount = SIZE / outLenNormalized; \ + if (SIZE % outLenNormalized != 0) \ + *pageCount += 1; \ + const uint16_t pageOffset = pageIdx * outLenNormalized; \ + uint16_t loopmax = outLenNormalized; \ + if (loopmax > SIZE - pageOffset) \ + loopmax = SIZE - pageOffset; \ + for (uint16_t i = 0; i < loopmax; i++) { \ + const uint16_t offset = i << 1u; \ + const uint8_t *c = v->_ptr + pageOffset; \ + snprintf(outValue + offset, outValueLen - offset, "%02x", c[i]); \ + } \ + return parser_ok; + +#define GEN_DEC_READFIX_UNSIGNED(BITS) \ + parser_error_t _readUInt##BITS(parser_context_t *ctx, uint##BITS##_t *value) +#define GEN_DEF_READFIX_UNSIGNED(BITS) \ + parser_error_t _readUInt##BITS(parser_context_t *ctx, \ + uint##BITS##_t *value) { \ + if (value == NULL) \ + return parser_no_data; \ + *value = 0u; \ + for (uint8_t i = 0u; i < (BITS##u >> 3u); i++, ctx->offset++) { \ + if (ctx->offset >= ctx->bufferLen) \ + return parser_unexpected_buffer_end; \ + *value += (uint##BITS##_t) * (ctx->buffer + ctx->offset) << (8u * i); \ + } \ + return parser_ok; \ + } +#define GEN_DEC_READFIX_SIGNED(BITS) \ + parser_error_t _readInt##BITS(parser_context_t *ctx, int##BITS##_t *value) +#define GEN_DEF_READFIX_SIGNED(BITS) \ + parser_error_t _readInt##BITS(parser_context_t *ctx, int##BITS##_t *value) { \ + if (value == NULL) \ + return parser_no_data; \ + *value = 0; \ + for (int8_t i = 0; i < (BITS >> 3); i++, ctx->offset++) { \ + if (ctx->offset >= ctx->bufferLen) \ + return parser_unexpected_buffer_end; \ + *value += (int##BITS##_t) * (ctx->buffer + ctx->offset) << (8 * i); \ + } \ + return parser_ok; \ + } GEN_DEC_READFIX_UNSIGNED(8); @@ -100,8 +117,8 @@ GEN_DEC_READFIX_UNSIGNED(64); GEN_DEC_READFIX_SIGNED(64); -parser_error_t parser_init(parser_context_t *ctx, const uint8_t *buffer, uint16_t bufferSize); - +parser_error_t parser_init(parser_context_t *ctx, const uint8_t *buffer, + uint16_t bufferSize); #ifdef __cplusplus } diff --git a/app/src/parser_txdef.h b/app/src/parser_txdef.h index b19518b0..f5cce9cc 100644 --- a/app/src/parser_txdef.h +++ b/app/src/parser_txdef.h @@ -1,18 +1,18 @@ /******************************************************************************* -* (c) 2019 Zondax AG -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -********************************************************************************/ + * (c) 2019 Zondax AG + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ********************************************************************************/ #pragma once #include @@ -22,12 +22,12 @@ extern "C" { #endif -#include #include +#include typedef struct { - uint8_t *state; - uint16_t len; + uint8_t *state; + uint16_t len; } parser_tx_t; #ifdef __cplusplus diff --git a/app/src/sighash.c b/app/src/sighash.c index be2f6b9c..7dfb9336 100644 --- a/app/src/sighash.c +++ b/app/src/sighash.c @@ -1,191 +1,211 @@ /******************************************************************************* -* (c) 2018 -2022 Zondax AG -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -********************************************************************************/ + * (c) 2018 -2022 Zondax AG + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ********************************************************************************/ -#include -#include -#include -#include "os.h" -#include "cx.h" -#include "nvdata.h" #include "sighash.h" +#include "cx.h" #include "index_sapling.h" +#include "nvdata.h" +#include "os.h" #include "txid.h" +#include +#include +#include -#define ZCASH_PREVOUTS_HASH_PERSONALIZATION "ZcashPrevoutHash" -#define ZCASH_SEQUENCE_HASH_PERSONALIZATION "ZcashSequencHash" -#define ZCASH_OUTPUTS_HASH_PERSONALIZATION "ZcashOutputsHash" -//#define ZCASH_JOINSPLITS_HASH_PERSONALIZATION "ZcashJSplitsHash" not supported +#define ZCASH_PREVOUTS_HASH_PERSONALIZATION "ZcashPrevoutHash" +#define ZCASH_SEQUENCE_HASH_PERSONALIZATION "ZcashSequencHash" +#define ZCASH_OUTPUTS_HASH_PERSONALIZATION "ZcashOutputsHash" +// #define ZCASH_JOINSPLITS_HASH_PERSONALIZATION "ZcashJSplitsHash" not +// supported #define CTX_ZCASH_SHIELDED_SPENDS_HASH_PERSONALIZATION "ZcashSSpendsHash" #define CTX_ZCASH_SHIELDED_OUTPUTS_HASH_PERSONALIZATION "ZcashSOutputHash" -//const uint8_t CONSENSUS_BRANCH_ID_SAPLING[4] = {0x76, 0xb8, 0x09, 0xBB}; // sapling -//const uint8_t CONSENSUS_BRANCH_ID_ORCHARD[4] = {0xC2, 0xD6, 0xD0, 0xB4}; // orchard +// const uint8_t CONSENSUS_BRANCH_ID_SAPLING[4] = {0x76, 0xb8, 0x09, 0xBB}; // +// sapling const uint8_t CONSENSUS_BRANCH_ID_ORCHARD[4] = {0xC2, 0xD6, 0xD0, +// 0xB4}; // orchard // -const uint8_t CONSENSUS_BRANCH_ID_SAPLING[4] = {0xBB, 0x09, 0xB8, 0x76}; // sapling -const uint8_t CONSENSUS_BRANCH_ID_ORCHARD[4] = {0xB4, 0xD0, 0xD6, 0xC2}; // orchard +const uint8_t CONSENSUS_BRANCH_ID_SAPLING[4] = {0xBB, 0x09, 0xB8, + 0x76}; // sapling +const uint8_t CONSENSUS_BRANCH_ID_ORCHARD[4] = {0xB4, 0xD0, 0xD6, + 0xC2}; // orchard void sapling_transparent_prevouts_hash(const uint8_t *input, uint8_t *output) { - const uint8_t n = t_inlist_len(); - cx_blake2b_t ctx; - cx_blake2b_init2_no_throw(&ctx, 256, NULL, 0, (uint8_t *) ZCASH_PREVOUTS_HASH_PERSONALIZATION, 16); - - if (n == 0) { - cx_hash_no_throw(&ctx.header, CX_LAST, 0, 0, output, HASH_SIZE); - return; - } - - const uint8_t *data = input + INDEX_TIN_PREVOUT; - for (uint8_t i = 0; i < n - 1; i++, data += T_IN_TX_LEN) { - cx_hash_no_throw(&ctx.header, 0, data, 36, NULL, 0); - } - cx_hash_no_throw(&ctx.header, CX_LAST, data, 36, output, HASH_SIZE); + const uint8_t n = t_inlist_len(); + cx_blake2b_t ctx; + cx_blake2b_init2_no_throw(&ctx, 256, NULL, 0, + (uint8_t *)ZCASH_PREVOUTS_HASH_PERSONALIZATION, 16); + + if (n == 0) { + cx_hash_no_throw(&ctx.header, CX_LAST, 0, 0, output, HASH_SIZE); + return; + } + + const uint8_t *data = input + INDEX_TIN_PREVOUT; + for (uint8_t i = 0; i < n - 1; i++, data += T_IN_TX_LEN) { + cx_hash_no_throw(&ctx.header, 0, data, 36, NULL, 0); + } + cx_hash_no_throw(&ctx.header, CX_LAST, data, 36, output, HASH_SIZE); } void sapling_transparent_sequence_hash(const uint8_t *input, uint8_t *output) { - const uint8_t n = t_inlist_len(); + const uint8_t n = t_inlist_len(); + + cx_blake2b_t ctx; + cx_blake2b_init2_no_throw(&ctx, 256, NULL, 0, + (uint8_t *)ZCASH_SEQUENCE_HASH_PERSONALIZATION, 16); + + if (n == 0) { + cx_hash_no_throw(&ctx.header, CX_LAST, 0, 0, output, HASH_SIZE); + return; + } + + const uint8_t *data = input + INDEX_TIN_SEQ; + for (uint8_t i = 0; i < n - 1; i++, data += T_IN_TX_LEN) { + cx_hash_no_throw(&ctx.header, 0, data, 4, NULL, 0); + } + cx_hash_no_throw(&ctx.header, CX_LAST, data, 4, output, HASH_SIZE); +} - cx_blake2b_t ctx; - cx_blake2b_init2_no_throw(&ctx, 256, NULL, 0, (uint8_t *) ZCASH_SEQUENCE_HASH_PERSONALIZATION, 16); +void v4_transparent_outputs_hash(uint8_t *output) { + const uint8_t n = t_outlist_len(); - if (n == 0) { - cx_hash_no_throw(&ctx.header, CX_LAST, 0, 0, output, HASH_SIZE); - return; - } + cx_blake2b_t ctx; + cx_blake2b_init2_no_throw(&ctx, 256, NULL, 0, + (uint8_t *)ZCASH_OUTPUTS_HASH_PERSONALIZATION, 16); - const uint8_t *data = input + INDEX_TIN_SEQ; - for (uint8_t i = 0; i < n - 1; i++, data += T_IN_TX_LEN) { - cx_hash_no_throw(&ctx.header, 0, data, 4, NULL, 0); - } - cx_hash_no_throw(&ctx.header, CX_LAST, data, 4, output, HASH_SIZE); -} + if (n == 0) { + cx_hash_no_throw(&ctx.header, CX_LAST, 0, 0, output, HASH_SIZE); + return; + } -void v4_transparent_outputs_hash(uint8_t *output) { - const uint8_t n = t_outlist_len(); - - cx_blake2b_t ctx; - cx_blake2b_init2_no_throw(&ctx, 256, NULL, 0, (uint8_t *) ZCASH_OUTPUTS_HASH_PERSONALIZATION, 16); - - if (n == 0) { - cx_hash_no_throw(&ctx.header, CX_LAST, 0, 0, output, HASH_SIZE); - return; - } - - uint8_t data[34]; - uint8_t i = 0; - for (; i < n - 1; i++) { - t_output_item_t *item = t_outlist_retrieve_item(i); - MEMCPY(data, (uint8_t * ) & (item->value), 8); - MEMCPY(data + 8, item->address, SCRIPT_SIZE); - cx_hash_no_throw(&ctx.header, 0, data, sizeof(data), NULL, 0); - } + uint8_t data[34]; + uint8_t i = 0; + for (; i < n - 1; i++) { t_output_item_t *item = t_outlist_retrieve_item(i); - MEMCPY(data, (uint8_t * ) & (item->value), 8); + MEMCPY(data, (uint8_t *)&(item->value), 8); MEMCPY(data + 8, item->address, SCRIPT_SIZE); - cx_hash_no_throw(&ctx.header, CX_LAST, data, sizeof(data), output, HASH_SIZE); + cx_hash_no_throw(&ctx.header, 0, data, sizeof(data), NULL, 0); + } + t_output_item_t *item = t_outlist_retrieve_item(i); + MEMCPY(data, (uint8_t *)&(item->value), 8); + MEMCPY(data + 8, item->address, SCRIPT_SIZE); + cx_hash_no_throw(&ctx.header, CX_LAST, data, sizeof(data), output, HASH_SIZE); } - -void shielded_output_hash(const uint8_t *input, uint16_t inputlen, uint8_t *output) { - if (inputlen == 0) { - MEMZERO(output, HASH_SIZE); - return; - } - cx_blake2b_t ctx; - cx_blake2b_init2_no_throw(&ctx, 256, NULL, 0, (uint8_t *) CTX_ZCASH_SHIELDED_OUTPUTS_HASH_PERSONALIZATION, 16); - cx_hash_no_throw(&ctx.header, CX_LAST, input, inputlen, output, HASH_SIZE); +void shielded_output_hash(const uint8_t *input, uint16_t inputlen, + uint8_t *output) { + if (inputlen == 0) { + MEMZERO(output, HASH_SIZE); + return; + } + cx_blake2b_t ctx; + cx_blake2b_init2_no_throw( + &ctx, 256, NULL, 0, + (uint8_t *)CTX_ZCASH_SHIELDED_OUTPUTS_HASH_PERSONALIZATION, 16); + cx_hash_no_throw(&ctx.header, CX_LAST, input, inputlen, output, HASH_SIZE); } -void shielded_spend_hash(const uint8_t *input, uint16_t inputlen, uint8_t *output) { - if (inputlen == 0) { - MEMZERO(output, HASH_SIZE); - return; - } - cx_blake2b_t ctx; - cx_blake2b_init2_no_throw(&ctx, 256, NULL, 0, (uint8_t *) CTX_ZCASH_SHIELDED_SPENDS_HASH_PERSONALIZATION, 16); - cx_hash_no_throw(&ctx.header, CX_LAST, input, inputlen, output, HASH_SIZE); +void shielded_spend_hash(const uint8_t *input, uint16_t inputlen, + uint8_t *output) { + if (inputlen == 0) { + MEMZERO(output, HASH_SIZE); + return; + } + cx_blake2b_t ctx; + cx_blake2b_init2_no_throw( + &ctx, 256, NULL, 0, + (uint8_t *)CTX_ZCASH_SHIELDED_SPENDS_HASH_PERSONALIZATION, 16); + cx_hash_no_throw(&ctx.header, CX_LAST, input, inputlen, output, HASH_SIZE); } -static void signature_hash_v4(const uint8_t *input, uint16_t inputlen, uint8_t *output) { - zemu_log_stack("signature_hash_v4"); - cx_blake2b_t ctx; +static void signature_hash_v4(const uint8_t *input, uint16_t inputlen, + uint8_t *output) { + zemu_log_stack("signature_hash_v4"); + cx_blake2b_t ctx; - uint8_t personalization[16] = {0}; - MEMCPY(personalization, "ZcashSigHash", 12); - MEMCPY(personalization + 12, CONSENSUS_BRANCH_ID_ORCHARD, 4); + uint8_t personalization[16] = {0}; + MEMCPY(personalization, "ZcashSigHash", 12); + MEMCPY(personalization + 12, CONSENSUS_BRANCH_ID_ORCHARD, 4); - cx_blake2b_init2_no_throw(&ctx, 256, NULL, 0, (uint8_t *) personalization, 16); + cx_blake2b_init2_no_throw(&ctx, 256, NULL, 0, (uint8_t *)personalization, 16); - cx_hash_no_throw(&ctx.header, CX_LAST, input, inputlen, output, HASH_SIZE); + cx_hash_no_throw(&ctx.header, CX_LAST, input, inputlen, output, HASH_SIZE); } -static void signature_hash_v5(const uint8_t *input, uint8_t *start_signdata, uint8_t index, signable_input type, uint8_t *output) { - zemu_log_stack("signature_hash_v5"); - cx_blake2b_t ctx; - - uint8_t personalization[16] = {0}; - MEMCPY(personalization, "ZcashTxHash_", 12); - MEMCPY(personalization + 12, CONSENSUS_BRANCH_ID_ORCHARD, 4); - cx_blake2b_init2_no_throw(&ctx, 256, NULL, 0, (uint8_t *) personalization, 16); - - uint8_t header_digest[32] = {0}; - uint8_t transparent_digest[32] = {0}; - uint8_t sapling_digest[32] = {0}; - uint8_t orchard_digest[32] = {0}; - - hash_header_txid_data(start_signdata, header_digest); - transparent_sig_digest(input, start_signdata, index, type, transparent_digest); - hash_sapling_txid_data(start_signdata, sapling_digest); - hash_empty_orchard_txid_data(orchard_digest); - - cx_hash_no_throw(&ctx.header, 0, header_digest, HASH_SIZE, NULL, 0); - cx_hash_no_throw(&ctx.header, 0, transparent_digest, HASH_SIZE, NULL, 0); - cx_hash_no_throw(&ctx.header, 0, sapling_digest, HASH_SIZE, NULL, 0); - cx_hash_no_throw(&ctx.header, CX_LAST, orchard_digest, HASH_SIZE, output, HASH_SIZE); +static void signature_hash_v5(const uint8_t *input, uint8_t *start_signdata, + uint8_t index, signable_input type, + uint8_t *output) { + zemu_log_stack("signature_hash_v5"); + cx_blake2b_t ctx; + + uint8_t personalization[16] = {0}; + MEMCPY(personalization, "ZcashTxHash_", 12); + MEMCPY(personalization + 12, CONSENSUS_BRANCH_ID_ORCHARD, 4); + cx_blake2b_init2_no_throw(&ctx, 256, NULL, 0, (uint8_t *)personalization, 16); + + uint8_t header_digest[32] = {0}; + uint8_t transparent_digest[32] = {0}; + uint8_t sapling_digest[32] = {0}; + uint8_t orchard_digest[32] = {0}; + + hash_header_txid_data(start_signdata, header_digest); + transparent_sig_digest(input, start_signdata, index, type, + transparent_digest); + hash_sapling_txid_data(start_signdata, sapling_digest); + hash_empty_orchard_txid_data(orchard_digest); + + cx_hash_no_throw(&ctx.header, 0, header_digest, HASH_SIZE, NULL, 0); + cx_hash_no_throw(&ctx.header, 0, transparent_digest, HASH_SIZE, NULL, 0); + cx_hash_no_throw(&ctx.header, 0, sapling_digest, HASH_SIZE, NULL, 0); + cx_hash_no_throw(&ctx.header, CX_LAST, orchard_digest, HASH_SIZE, output, + HASH_SIZE); } -void signature_hash(const uint8_t *txdata, uint8_t *start_signdata, uint16_t inputlen, const uint8_t tx_version, uint8_t *output){ - if (tx_version == TX_VERSION_SAPLING) { - signature_hash_v4(start_signdata, inputlen, output); - } - else if (tx_version == TX_VERSION_NU5) - { - signature_hash_v5(txdata, start_signdata, 0, shielded, output); - } +void signature_hash(const uint8_t *txdata, uint8_t *start_signdata, + uint16_t inputlen, const uint8_t tx_version, + uint8_t *output) { + if (tx_version == TX_VERSION_SAPLING) { + signature_hash_v4(start_signdata, inputlen, output); + } else if (tx_version == TX_VERSION_NU5) { + signature_hash_v5(txdata, start_signdata, 0, shielded, output); + } } -static void signature_script_hash_v4(const uint8_t *input, uint16_t inputlen, uint8_t *script, uint16_t scriptlen, uint8_t *output) { - cx_blake2b_t ctx; +static void signature_script_hash_v4(const uint8_t *input, uint16_t inputlen, + uint8_t *script, uint16_t scriptlen, + uint8_t *output) { + cx_blake2b_t ctx; - uint8_t personalization[16] = {0}; - MEMCPY(personalization, "ZcashSigHash", 12); - MEMCPY(personalization + 12, CONSENSUS_BRANCH_ID_ORCHARD, 4); + uint8_t personalization[16] = {0}; + MEMCPY(personalization, "ZcashSigHash", 12); + MEMCPY(personalization + 12, CONSENSUS_BRANCH_ID_ORCHARD, 4); - cx_blake2b_init2_no_throw(&ctx, 256, NULL, 0, (uint8_t *) personalization, 16); - cx_hash_no_throw(&ctx.header, 0, input, inputlen, NULL, 0); + cx_blake2b_init2_no_throw(&ctx, 256, NULL, 0, (uint8_t *)personalization, 16); + cx_hash_no_throw(&ctx.header, 0, input, inputlen, NULL, 0); - cx_hash_no_throw(&ctx.header, CX_LAST, script, scriptlen, output, HASH_SIZE); + cx_hash_no_throw(&ctx.header, CX_LAST, script, scriptlen, output, HASH_SIZE); } -void signature_script_hash(const uint8_t *input, uint8_t *start_signdata, uint16_t inputlen, uint8_t *script, uint16_t scriptlen, uint8_t index, const uint8_t tx_version, uint8_t *output) { - if (tx_version==TX_VERSION_SAPLING) { - signature_script_hash_v4(start_signdata, inputlen, script, scriptlen, output); - } - else if (tx_version == TX_VERSION_NU5) - { - signature_hash_v5(input, start_signdata, index, transparent, output); - } +void signature_script_hash(const uint8_t *input, uint8_t *start_signdata, + uint16_t inputlen, uint8_t *script, + uint16_t scriptlen, uint8_t index, + const uint8_t tx_version, uint8_t *output) { + if (tx_version == TX_VERSION_SAPLING) { + signature_script_hash_v4(start_signdata, inputlen, script, scriptlen, + output); + } else if (tx_version == TX_VERSION_NU5) { + signature_hash_v5(input, start_signdata, index, transparent, output); + } } - diff --git a/app/src/sighash.h b/app/src/sighash.h index a8e06da4..4e4dfbd4 100644 --- a/app/src/sighash.h +++ b/app/src/sighash.h @@ -1,24 +1,24 @@ /******************************************************************************* -* (c) 2018 -2022 Zondax AG -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -********************************************************************************/ + * (c) 2018 -2022 Zondax AG + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ********************************************************************************/ #pragma once typedef enum { - transparent = 0, - shielded = 1, + transparent = 0, + shielded = 1, } signable_input; void sapling_transparent_prevouts_hash(const uint8_t *input, uint8_t *output); @@ -27,10 +27,17 @@ void sapling_transparent_sequence_hash(const uint8_t *input, uint8_t *output); void v4_transparent_outputs_hash(uint8_t *output); -void shielded_output_hash(const uint8_t *input, uint16_t inputlen, uint8_t *output); +void shielded_output_hash(const uint8_t *input, uint16_t inputlen, + uint8_t *output); -void shielded_spend_hash(const uint8_t *input, uint16_t inputlen, uint8_t *output); +void shielded_spend_hash(const uint8_t *input, uint16_t inputlen, + uint8_t *output); -void signature_hash(const uint8_t *txdata, uint8_t *start_signdata, uint16_t inputlen, const uint8_t tx_version, uint8_t *output); +void signature_hash(const uint8_t *txdata, uint8_t *start_signdata, + uint16_t inputlen, const uint8_t tx_version, + uint8_t *output); -void signature_script_hash(const uint8_t *input, uint8_t *start_signdata, uint16_t inputlen, uint8_t *script, uint16_t scriptlen, uint8_t index, const uint8_t tx_version, uint8_t *output); +void signature_script_hash(const uint8_t *input, uint8_t *start_signdata, + uint16_t inputlen, uint8_t *script, + uint16_t scriptlen, uint8_t index, + const uint8_t tx_version, uint8_t *output); diff --git a/app/src/txid.c b/app/src/txid.c index 66283a29..ff28732d 100644 --- a/app/src/txid.c +++ b/app/src/txid.c @@ -1,13 +1,13 @@ -#include -#include -#include -#include "os.h" #include "constants.h" #include "cx.h" +#include "index_NU5.h" +#include "index_sapling.h" #include "nvdata.h" +#include "os.h" #include "sighash.h" -#include "index_sapling.h" -#include "index_NU5.h" +#include +#include +#include // TxId level 1 node personalization #define ZCASH_HEADERS_HASH_PERSONALIZATION "ZTxIdHeadersHash" @@ -34,49 +34,49 @@ #define ZCASH_TRANSPARENT_AMOUNTS_HASH_PERSONALIZATION "ZTxTrAmountsHash" #define ZCASH_TRANSPARENT_SCRIPTS_HASH_PERSONALIZATION "ZTxTrScriptsHash" -#define SIGHASH_ALL 0x01 +#define SIGHASH_ALL 0x01 void nu5_transparent_prevouts_hash(const uint8_t *input, uint8_t *output) { - zemu_log_stack("nu5_transparent_prevouts_hash\n"); - const uint8_t n = t_inlist_len(); - cx_blake2b_t ctx; - uint8_t personalization[16] = {0}; - MEMCPY(personalization, PIC(ZCASH_PREVOUTS_HASH_PERSONALIZATION), 16); - cx_blake2b_init2_no_throw(&ctx, 256, NULL, 0, (uint8_t *) personalization, 16); - - - if (n == 0) { - cx_hash_no_throw(&ctx.header, CX_LAST, 0, 0, output, HASH_SIZE); - return; - } - - const uint8_t *data = input + INDEX_TIN_PREVOUT; - for (uint8_t i = 0; i < n - 1; i++, data += T_IN_TX_LEN) { - cx_hash_no_throw(&ctx.header, 0, data, PREVOUT_SIZE, NULL, 0); - } - cx_hash_no_throw(&ctx.header, CX_LAST, data, PREVOUT_SIZE, output, HASH_SIZE); + zemu_log_stack("nu5_transparent_prevouts_hash\n"); + const uint8_t n = t_inlist_len(); + cx_blake2b_t ctx; + uint8_t personalization[16] = {0}; + MEMCPY(personalization, PIC(ZCASH_PREVOUTS_HASH_PERSONALIZATION), 16); + cx_blake2b_init2_no_throw(&ctx, 256, NULL, 0, (uint8_t *)personalization, 16); + + if (n == 0) { + cx_hash_no_throw(&ctx.header, CX_LAST, 0, 0, output, HASH_SIZE); + return; + } + + const uint8_t *data = input + INDEX_TIN_PREVOUT; + for (uint8_t i = 0; i < n - 1; i++, data += T_IN_TX_LEN) { + cx_hash_no_throw(&ctx.header, 0, data, PREVOUT_SIZE, NULL, 0); + } + cx_hash_no_throw(&ctx.header, CX_LAST, data, PREVOUT_SIZE, output, HASH_SIZE); } void nu5_transparent_sequence_hash(const uint8_t *input, uint8_t *output) { - zemu_log_stack("nu5_transparent_sequence_hash"); + zemu_log_stack("nu5_transparent_sequence_hash"); - const uint8_t n = t_inlist_len(); + const uint8_t n = t_inlist_len(); - cx_blake2b_t ctx; - uint8_t personalization[16] = {0}; - MEMCPY(personalization, PIC(ZCASH_SEQUENCE_HASH_PERSONALIZATION), 16); - cx_blake2b_init2_no_throw(&ctx, 256, NULL, 0, (uint8_t *) personalization, 16); - - if (n == 0) { - cx_hash_no_throw(&ctx.header, CX_LAST, 0, 0, output, HASH_SIZE); - return; - } + cx_blake2b_t ctx; + uint8_t personalization[16] = {0}; + MEMCPY(personalization, PIC(ZCASH_SEQUENCE_HASH_PERSONALIZATION), 16); + cx_blake2b_init2_no_throw(&ctx, 256, NULL, 0, (uint8_t *)personalization, 16); - const uint8_t *data = input + INDEX_TIN_SEQ; - for (uint8_t i = 0; i < n - 1; i++, data += T_IN_TX_LEN) { - cx_hash_no_throw(&ctx.header, 0, data, SEQUENCE_SIZE, NULL, 0); - } - cx_hash_no_throw(&ctx.header, CX_LAST, data, SEQUENCE_SIZE, output, HASH_SIZE); + if (n == 0) { + cx_hash_no_throw(&ctx.header, CX_LAST, 0, 0, output, HASH_SIZE); + return; + } + + const uint8_t *data = input + INDEX_TIN_SEQ; + for (uint8_t i = 0; i < n - 1; i++, data += T_IN_TX_LEN) { + cx_hash_no_throw(&ctx.header, 0, data, SEQUENCE_SIZE, NULL, 0); + } + cx_hash_no_throw(&ctx.header, CX_LAST, data, SEQUENCE_SIZE, output, + HASH_SIZE); } /// Sequentially append the full serialized value of each transparent output @@ -84,334 +84,378 @@ void nu5_transparent_sequence_hash(const uint8_t *input, uint8_t *output) { /// In the case that no outputs are provided, this produces a default /// hash from just the personalization string. void nu5_transparent_outputs_hash(uint8_t *output) { - const uint8_t n = t_outlist_len(); + const uint8_t n = t_outlist_len(); - cx_blake2b_t ctx; - uint8_t personalization[16] = {0}; - MEMCPY(personalization, PIC(ZCASH_OUTPUTS_HASH_PERSONALIZATION), 16); - cx_blake2b_init2_no_throw(&ctx, 256, NULL, 0, (uint8_t *) personalization, 16); + cx_blake2b_t ctx; + uint8_t personalization[16] = {0}; + MEMCPY(personalization, PIC(ZCASH_OUTPUTS_HASH_PERSONALIZATION), 16); + cx_blake2b_init2_no_throw(&ctx, 256, NULL, 0, (uint8_t *)personalization, 16); - if (n == 0) { - cx_hash_no_throw(&ctx.header, CX_LAST, 0, 0, output, HASH_SIZE); - return; - } + if (n == 0) { + cx_hash_no_throw(&ctx.header, CX_LAST, 0, 0, output, HASH_SIZE); + return; + } - uint8_t data[T_OUTPUT_SIZE]; - uint8_t i = 0; - for (; i < n - 1; i++) { - t_output_item_t *item = t_outlist_retrieve_item(i); - MEMCPY(data, (uint8_t * ) & (item->value), 8); - MEMCPY(data + 8, item->address, SCRIPT_SIZE); - cx_hash_no_throw(&ctx.header, 0, data, sizeof(data), NULL, 0); - } + uint8_t data[T_OUTPUT_SIZE]; + uint8_t i = 0; + for (; i < n - 1; i++) { t_output_item_t *item = t_outlist_retrieve_item(i); - MEMCPY(data, (uint8_t * ) & (item->value), 8); + MEMCPY(data, (uint8_t *)&(item->value), 8); MEMCPY(data + 8, item->address, SCRIPT_SIZE); - cx_hash_no_throw(&ctx.header, CX_LAST, data, sizeof(data), output, HASH_SIZE); + cx_hash_no_throw(&ctx.header, 0, data, sizeof(data), NULL, 0); + } + t_output_item_t *item = t_outlist_retrieve_item(i); + MEMCPY(data, (uint8_t *)&(item->value), 8); + MEMCPY(data + 8, item->address, SCRIPT_SIZE); + cx_hash_no_throw(&ctx.header, CX_LAST, data, sizeof(data), output, HASH_SIZE); } - -/// Implements [ZIP 244 section T.3a](https://zips.z.cash/zip-0244#t-3a-sapling-spends-digest) +/// Implements [ZIP 244 section +/// T.3a](https://zips.z.cash/zip-0244#t-3a-sapling-spends-digest) /// /// Write disjoint parts of each Sapling shielded spend to a pair of hashes: -/// * \[nullifier*\] - personalized with ZCASH_SAPLING_SPENDS_COMPACT_HASH_PERSONALIZATION -/// * \[(cv, anchor, rk, zkproof)*\] - personalized with ZCASH_SAPLING_SPENDS_NONCOMPACT_HASH_PERSONALIZATION +/// * \[nullifier*\] - personalized with +/// ZCASH_SAPLING_SPENDS_COMPACT_HASH_PERSONALIZATION +/// * \[(cv, anchor, rk, zkproof)*\] - personalized with +/// ZCASH_SAPLING_SPENDS_NONCOMPACT_HASH_PERSONALIZATION /// -/// Then, hash these together personalized by ZCASH_SAPLING_SPENDS_HASH_PERSONALIZATION -void nu5_hash_sapling_spends(const uint8_t *input, uint8_t *output) -{ - zemu_log_stack("nu5_hash_sapling_spends"); - const uint8_t n = spendlist_len(); - - cx_blake2b_t ctx; - uint8_t personalization[16] = {0}; - MEMCPY(personalization, PIC(ZCASH_SAPLING_SPENDS_HASH_PERSONALIZATION), 16); - cx_blake2b_init2_no_throw(&ctx, 256, NULL, 0, (uint8_t *) personalization, 16); - - if (n == 0) { - cx_hash_no_throw(&ctx.header, CX_LAST, 0, 0, output, HASH_SIZE); - return; - } - cx_blake2b_t ch_ctx; - uint8_t ch_personalization[16] = {0}; - MEMCPY(ch_personalization, PIC(ZCASH_SAPLING_SPENDS_COMPACT_HASH_PERSONALIZATION), 16); - cx_blake2b_init2_no_throw(&ch_ctx, 256, NULL, 0, (uint8_t *) ch_personalization, 16); - - cx_blake2b_t nh_ctx; - uint8_t nh_personalization[16] = {0}; - MEMCPY(nh_personalization, PIC(ZCASH_SAPLING_SPENDS_NONCOMPACT_HASH_PERSONALIZATION), 16); - cx_blake2b_init2_no_throw(&nh_ctx, 256, NULL, 0, (uint8_t *) nh_personalization, 16); - - const uint8_t *nullifier_data = input + INDEX_SPEND_NF; - const uint8_t *cv_data = input + INDEX_SPEND_VALUECMT; - const uint8_t *anchor_data = input + INDEX_SPEND_ANCHOR; - const uint8_t *rk_data = input + INDEX_SPEND_RK; - for (uint8_t i = 0; i < n - 1; i++, - nullifier_data += SPEND_TX_LEN, - cv_data += SPEND_TX_LEN, - anchor_data += SPEND_TX_LEN, - rk_data += SPEND_TX_LEN ) - { - // build the hash of nullifiers separately for compact blocks. - cx_hash_no_throw(&ch_ctx.header, 0, nullifier_data, NULLIFIER_SIZE, NULL, 0); - - cx_hash_no_throw(&nh_ctx.header, 0, cv_data, VALUE_COMMITMENT_SIZE, NULL, 0); - cx_hash_no_throw(&nh_ctx.header, 0, anchor_data, ANCHOR_SIZE, NULL, 0); - cx_hash_no_throw(&nh_ctx.header, 0, rk_data, RK_SIZE, NULL, 0); - } - - uint8_t ch_out[HASH_SIZE] = {0}; - cx_hash_no_throw(&ch_ctx.header, CX_LAST, nullifier_data, NULLIFIER_SIZE, (uint8_t *) ch_out, HASH_SIZE); - - uint8_t nh_out[HASH_SIZE]={0}; - cx_hash_no_throw(&nh_ctx.header, 0, cv_data, VALUE_COMMITMENT_SIZE, NULL, 0); +/// Then, hash these together personalized by +/// ZCASH_SAPLING_SPENDS_HASH_PERSONALIZATION +void nu5_hash_sapling_spends(const uint8_t *input, uint8_t *output) { + zemu_log_stack("nu5_hash_sapling_spends"); + const uint8_t n = spendlist_len(); + + cx_blake2b_t ctx; + uint8_t personalization[16] = {0}; + MEMCPY(personalization, PIC(ZCASH_SAPLING_SPENDS_HASH_PERSONALIZATION), 16); + cx_blake2b_init2_no_throw(&ctx, 256, NULL, 0, (uint8_t *)personalization, 16); + + if (n == 0) { + cx_hash_no_throw(&ctx.header, CX_LAST, 0, 0, output, HASH_SIZE); + return; + } + cx_blake2b_t ch_ctx; + uint8_t ch_personalization[16] = {0}; + MEMCPY(ch_personalization, + PIC(ZCASH_SAPLING_SPENDS_COMPACT_HASH_PERSONALIZATION), 16); + cx_blake2b_init2_no_throw(&ch_ctx, 256, NULL, 0, + (uint8_t *)ch_personalization, 16); + + cx_blake2b_t nh_ctx; + uint8_t nh_personalization[16] = {0}; + MEMCPY(nh_personalization, + PIC(ZCASH_SAPLING_SPENDS_NONCOMPACT_HASH_PERSONALIZATION), 16); + cx_blake2b_init2_no_throw(&nh_ctx, 256, NULL, 0, + (uint8_t *)nh_personalization, 16); + + const uint8_t *nullifier_data = input + INDEX_SPEND_NF; + const uint8_t *cv_data = input + INDEX_SPEND_VALUECMT; + const uint8_t *anchor_data = input + INDEX_SPEND_ANCHOR; + const uint8_t *rk_data = input + INDEX_SPEND_RK; + for (uint8_t i = 0; i < n - 1; i++, nullifier_data += SPEND_TX_LEN, + cv_data += SPEND_TX_LEN, anchor_data += SPEND_TX_LEN, + rk_data += SPEND_TX_LEN) { + // build the hash of nullifiers separately for compact blocks. + cx_hash_no_throw(&ch_ctx.header, 0, nullifier_data, NULLIFIER_SIZE, NULL, + 0); + + cx_hash_no_throw(&nh_ctx.header, 0, cv_data, VALUE_COMMITMENT_SIZE, NULL, + 0); cx_hash_no_throw(&nh_ctx.header, 0, anchor_data, ANCHOR_SIZE, NULL, 0); - cx_hash_no_throw(&nh_ctx.header, CX_LAST, rk_data, RK_SIZE, (uint8_t *) nh_out, HASH_SIZE); - - cx_hash_no_throw(&ctx.header, 0, (uint8_t *) ch_out, HASH_SIZE, NULL, 0); - cx_hash_no_throw(&ctx.header, CX_LAST, (uint8_t *) nh_out, HASH_SIZE, output, HASH_SIZE); + cx_hash_no_throw(&nh_ctx.header, 0, rk_data, RK_SIZE, NULL, 0); + } + + uint8_t ch_out[HASH_SIZE] = {0}; + cx_hash_no_throw(&ch_ctx.header, CX_LAST, nullifier_data, NULLIFIER_SIZE, + (uint8_t *)ch_out, HASH_SIZE); + + uint8_t nh_out[HASH_SIZE] = {0}; + cx_hash_no_throw(&nh_ctx.header, 0, cv_data, VALUE_COMMITMENT_SIZE, NULL, 0); + cx_hash_no_throw(&nh_ctx.header, 0, anchor_data, ANCHOR_SIZE, NULL, 0); + cx_hash_no_throw(&nh_ctx.header, CX_LAST, rk_data, RK_SIZE, (uint8_t *)nh_out, + HASH_SIZE); + + cx_hash_no_throw(&ctx.header, 0, (uint8_t *)ch_out, HASH_SIZE, NULL, 0); + cx_hash_no_throw(&ctx.header, CX_LAST, (uint8_t *)nh_out, HASH_SIZE, output, + HASH_SIZE); } -/// Implements [ZIP 244 section T.3b](https://zips.z.cash/zip-0244#t-3b-sapling-outputs-digest) +/// Implements [ZIP 244 section +/// T.3b](https://zips.z.cash/zip-0244#t-3b-sapling-outputs-digest) /// /// Write disjoint parts of each Sapling shielded output as 3 separate hashes: -/// * \[(cmu, epk, enc_ciphertext\[..52\])*\] personalized with ZCASH_SAPLING_OUTPUTS_COMPACT_HASH_PERSONALIZATION -/// * \[enc_ciphertext\[52..564\]*\] (memo ciphertexts) personalized with ZCASH_SAPLING_OUTPUTS_MEMOS_HASH_PERSONALIZATION -/// * \[(cv, enc_ciphertext\[564..\], out_ciphertext, zkproof)*\] personalized with ZCASH_SAPLING_OUTPUTS_NONCOMPACT_HASH_PERSONALIZATION +/// * \[(cmu, epk, enc_ciphertext\[..52\])*\] personalized with +/// ZCASH_SAPLING_OUTPUTS_COMPACT_HASH_PERSONALIZATION +/// * \[enc_ciphertext\[52..564\]*\] (memo ciphertexts) personalized with +/// ZCASH_SAPLING_OUTPUTS_MEMOS_HASH_PERSONALIZATION +/// * \[(cv, enc_ciphertext\[564..\], out_ciphertext, zkproof)*\] personalized +/// with ZCASH_SAPLING_OUTPUTS_NONCOMPACT_HASH_PERSONALIZATION /// -/// Then, hash these together personalized with ZCASH_SAPLING_OUTPUTS_HASH_PERSONALIZATION -void nu5_hash_sapling_outputs(const uint8_t *input, uint8_t *output){ - zemu_log_stack("nu5_hash_sapling_outputs"); - const uint8_t n = outputlist_len(); - - cx_blake2b_t ctx; - uint8_t personalization[16] = {0}; - MEMCPY(personalization, PIC(ZCASH_SAPLING_OUTPUTS_HASH_PERSONALIZATION), 16); - cx_blake2b_init2_no_throw(&ctx, 256, NULL, 0, (uint8_t *) personalization, 16); - - if (n == 0) { - cx_hash_no_throw(&ctx.header, CX_LAST, 0, 0, output, HASH_SIZE); - return; - } - - cx_blake2b_t ch_ctx; - uint8_t ch_personalization[16] = {0}; - MEMCPY(ch_personalization, PIC(ZCASH_SAPLING_OUTPUTS_COMPACT_HASH_PERSONALIZATION), 16); - cx_blake2b_init2_no_throw(&ch_ctx, 256, NULL, 0, (uint8_t *) ch_personalization, 16); - - cx_blake2b_t mh_ctx; - uint8_t mh_personalization[16] = {0}; - MEMCPY(mh_personalization, PIC(ZCASH_SAPLING_OUTPUTS_MEMOS_HASH_PERSONALIZATION), 16); - cx_blake2b_init2_no_throw(&mh_ctx, 256, NULL, 0, (uint8_t *) mh_personalization, 16); - - cx_blake2b_t nh_ctx; - uint8_t nh_personalization[16] = {0}; - MEMCPY(nh_personalization, PIC(ZCASH_SAPLING_OUTPUTS_NONCOMPACT_HASH_PERSONALIZATION), 16); - cx_blake2b_init2_no_throw(&nh_ctx, 256, NULL, 0, (uint8_t *) nh_personalization, 16); - - const uint8_t *cmu = input + INDEX_OUTPUT_NOTECMT; - const uint8_t *ephemeral_key = input + INDEX_OUTPUT_EPK; - const uint8_t *enc_ciphertext = input + INDEX_OUTPUT_ENC; - - - const uint8_t *enc_ciphertext_memo = input + INDEX_OUTPUT_ENC_MEMO; - - const uint8_t *cv = input + INDEX_OUTPUT_VALUECMT; - const uint8_t *enc_ciphertext_aead_tag = input + INDEX_OUTPUT_ENC_AEAD_TAG; - const uint8_t *out_ciphertext = input + INDEX_OUTPUT_OUT; - - for (uint8_t i = 0; i < n - 1; i++, - cmu += OUTPUT_TX_LEN, - ephemeral_key += OUTPUT_TX_LEN, - enc_ciphertext += OUTPUT_TX_LEN, - enc_ciphertext_memo += OUTPUT_TX_LEN, - cv += OUTPUT_TX_LEN, - enc_ciphertext_aead_tag += OUTPUT_TX_LEN, - out_ciphertext += OUTPUT_TX_LEN) - { - cx_hash_no_throw(&ch_ctx.header, 0, cmu, NOTE_COMMITMENT_SIZE, NULL, 0); - cx_hash_no_throw(&ch_ctx.header, 0, ephemeral_key, EPK_SIZE, NULL, 0); - cx_hash_no_throw(&ch_ctx.header, 0, enc_ciphertext, 52, NULL, 0); - - cx_hash_no_throw(&mh_ctx.header, 0, enc_ciphertext_memo, OUTPUT_ENC_MEMO_SIZE, NULL, 0); - - cx_hash_no_throw(&nh_ctx.header, 0, cv, VALUE_COMMITMENT_SIZE, NULL, 0); - cx_hash_no_throw(&nh_ctx.header, 0, enc_ciphertext_aead_tag, OUTPUT_ENC_AEAD_TAG_SIZE, NULL, 0); - cx_hash_no_throw(&nh_ctx.header, 0, out_ciphertext, OUTPUT_OUT_SIZE, NULL, 0); - } - - uint8_t ch_out[HASH_SIZE] = {0}; - cx_hash_no_throw(&ch_ctx.header, 0, cmu, NOTE_COMMITMENT_SIZE, NULL, 0); - cx_hash_no_throw(&ch_ctx.header, 0, ephemeral_key, EPK_SIZE, NULL, 0); - cx_hash_no_throw(&ch_ctx.header, CX_LAST, enc_ciphertext, 52, ch_out, HASH_SIZE); - - uint8_t mh_out[HASH_SIZE] = {0}; - cx_hash_no_throw(&mh_ctx.header, CX_LAST, enc_ciphertext_memo, OUTPUT_ENC_MEMO_SIZE, (uint8_t *) mh_out, HASH_SIZE); - +/// Then, hash these together personalized with +/// ZCASH_SAPLING_OUTPUTS_HASH_PERSONALIZATION +void nu5_hash_sapling_outputs(const uint8_t *input, uint8_t *output) { + zemu_log_stack("nu5_hash_sapling_outputs"); + const uint8_t n = outputlist_len(); + + cx_blake2b_t ctx; + uint8_t personalization[16] = {0}; + MEMCPY(personalization, PIC(ZCASH_SAPLING_OUTPUTS_HASH_PERSONALIZATION), 16); + cx_blake2b_init2_no_throw(&ctx, 256, NULL, 0, (uint8_t *)personalization, 16); + + if (n == 0) { + cx_hash_no_throw(&ctx.header, CX_LAST, 0, 0, output, HASH_SIZE); + return; + } + + cx_blake2b_t ch_ctx; + uint8_t ch_personalization[16] = {0}; + MEMCPY(ch_personalization, + PIC(ZCASH_SAPLING_OUTPUTS_COMPACT_HASH_PERSONALIZATION), 16); + cx_blake2b_init2_no_throw(&ch_ctx, 256, NULL, 0, + (uint8_t *)ch_personalization, 16); + + cx_blake2b_t mh_ctx; + uint8_t mh_personalization[16] = {0}; + MEMCPY(mh_personalization, + PIC(ZCASH_SAPLING_OUTPUTS_MEMOS_HASH_PERSONALIZATION), 16); + cx_blake2b_init2_no_throw(&mh_ctx, 256, NULL, 0, + (uint8_t *)mh_personalization, 16); + + cx_blake2b_t nh_ctx; + uint8_t nh_personalization[16] = {0}; + MEMCPY(nh_personalization, + PIC(ZCASH_SAPLING_OUTPUTS_NONCOMPACT_HASH_PERSONALIZATION), 16); + cx_blake2b_init2_no_throw(&nh_ctx, 256, NULL, 0, + (uint8_t *)nh_personalization, 16); + + const uint8_t *cmu = input + INDEX_OUTPUT_NOTECMT; + const uint8_t *ephemeral_key = input + INDEX_OUTPUT_EPK; + const uint8_t *enc_ciphertext = input + INDEX_OUTPUT_ENC; + + const uint8_t *enc_ciphertext_memo = input + INDEX_OUTPUT_ENC_MEMO; + + const uint8_t *cv = input + INDEX_OUTPUT_VALUECMT; + const uint8_t *enc_ciphertext_aead_tag = input + INDEX_OUTPUT_ENC_AEAD_TAG; + const uint8_t *out_ciphertext = input + INDEX_OUTPUT_OUT; + + for (uint8_t i = 0; i < n - 1; i++, cmu += OUTPUT_TX_LEN, + ephemeral_key += OUTPUT_TX_LEN, enc_ciphertext += OUTPUT_TX_LEN, + enc_ciphertext_memo += OUTPUT_TX_LEN, cv += OUTPUT_TX_LEN, + enc_ciphertext_aead_tag += OUTPUT_TX_LEN, + out_ciphertext += OUTPUT_TX_LEN) { + cx_hash_no_throw(&ch_ctx.header, 0, cmu, NOTE_COMMITMENT_SIZE, NULL, 0); + cx_hash_no_throw(&ch_ctx.header, 0, ephemeral_key, EPK_SIZE, NULL, 0); + cx_hash_no_throw(&ch_ctx.header, 0, enc_ciphertext, 52, NULL, 0); + + cx_hash_no_throw(&mh_ctx.header, 0, enc_ciphertext_memo, + OUTPUT_ENC_MEMO_SIZE, NULL, 0); - uint8_t nh_out[HASH_SIZE] = {0}; cx_hash_no_throw(&nh_ctx.header, 0, cv, VALUE_COMMITMENT_SIZE, NULL, 0); - cx_hash_no_throw(&nh_ctx.header, 0, enc_ciphertext_aead_tag, OUTPUT_ENC_AEAD_TAG_SIZE, NULL, 0); - cx_hash_no_throw(&nh_ctx.header, CX_LAST, out_ciphertext, OUTPUT_OUT_SIZE, nh_out, HASH_SIZE); - - cx_hash_no_throw(&ctx.header, 0, ch_out, HASH_SIZE, NULL, 0); - cx_hash_no_throw(&ctx.header, 0, mh_out, HASH_SIZE, NULL, 0); - cx_hash_no_throw(&ctx.header, CX_LAST, nh_out, HASH_SIZE, output, HASH_SIZE); + cx_hash_no_throw(&nh_ctx.header, 0, enc_ciphertext_aead_tag, + OUTPUT_ENC_AEAD_TAG_SIZE, NULL, 0); + cx_hash_no_throw(&nh_ctx.header, 0, out_ciphertext, OUTPUT_OUT_SIZE, NULL, + 0); + } + + uint8_t ch_out[HASH_SIZE] = {0}; + cx_hash_no_throw(&ch_ctx.header, 0, cmu, NOTE_COMMITMENT_SIZE, NULL, 0); + cx_hash_no_throw(&ch_ctx.header, 0, ephemeral_key, EPK_SIZE, NULL, 0); + cx_hash_no_throw(&ch_ctx.header, CX_LAST, enc_ciphertext, 52, ch_out, + HASH_SIZE); + + uint8_t mh_out[HASH_SIZE] = {0}; + cx_hash_no_throw(&mh_ctx.header, CX_LAST, enc_ciphertext_memo, + OUTPUT_ENC_MEMO_SIZE, (uint8_t *)mh_out, HASH_SIZE); + + uint8_t nh_out[HASH_SIZE] = {0}; + cx_hash_no_throw(&nh_ctx.header, 0, cv, VALUE_COMMITMENT_SIZE, NULL, 0); + cx_hash_no_throw(&nh_ctx.header, 0, enc_ciphertext_aead_tag, + OUTPUT_ENC_AEAD_TAG_SIZE, NULL, 0); + cx_hash_no_throw(&nh_ctx.header, CX_LAST, out_ciphertext, OUTPUT_OUT_SIZE, + nh_out, HASH_SIZE); + + cx_hash_no_throw(&ctx.header, 0, ch_out, HASH_SIZE, NULL, 0); + cx_hash_no_throw(&ctx.header, 0, mh_out, HASH_SIZE, NULL, 0); + cx_hash_no_throw(&ctx.header, CX_LAST, nh_out, HASH_SIZE, output, HASH_SIZE); } /// The txid commits to the hash of all transparent outputs. The /// prevout and sequence_hash components of txid -void hash_header_txid_data(const uint8_t *input, uint8_t *output){ - zemu_log_stack("hash_header_txid_data"); - cx_blake2b_t ctx; - uint8_t personalization[16] = {0}; - MEMCPY(personalization, PIC(ZCASH_HEADERS_HASH_PERSONALIZATION), 16); - cx_blake2b_init2_no_throw(&ctx, 256, NULL, 0, (uint8_t *) personalization, 16); - - const uint8_t *version = input + NU5_INDEX_HASH_VERSION; - const uint8_t *version_group_id = input + NU5_INDEX_HASH_VERSION_GROUP_ID; - const uint8_t *consensus_branch_id = input + NU5_INDEX_HASH_CONSENSUS_BRANCH_ID; - const uint8_t *lock_time = input + NU5_INDEX_HASH_LOCK_TIME; - const uint8_t *expiry_height = input + NU5_INDEX_EXPIRY_HEIGHT; - - - cx_hash_no_throw(&ctx.header, 0, version, 4, NULL, 0); - cx_hash_no_throw(&ctx.header, 0, version_group_id, 4, NULL, 0); - cx_hash_no_throw(&ctx.header, 0, consensus_branch_id, 4, NULL, 0); - cx_hash_no_throw(&ctx.header, 0, lock_time, 4, NULL, 0); - cx_hash_no_throw(&ctx.header, CX_LAST, expiry_height, 4, output, HASH_SIZE); +void hash_header_txid_data(const uint8_t *input, uint8_t *output) { + zemu_log_stack("hash_header_txid_data"); + cx_blake2b_t ctx; + uint8_t personalization[16] = {0}; + MEMCPY(personalization, PIC(ZCASH_HEADERS_HASH_PERSONALIZATION), 16); + cx_blake2b_init2_no_throw(&ctx, 256, NULL, 0, (uint8_t *)personalization, 16); + + const uint8_t *version = input + NU5_INDEX_HASH_VERSION; + const uint8_t *version_group_id = input + NU5_INDEX_HASH_VERSION_GROUP_ID; + const uint8_t *consensus_branch_id = + input + NU5_INDEX_HASH_CONSENSUS_BRANCH_ID; + const uint8_t *lock_time = input + NU5_INDEX_HASH_LOCK_TIME; + const uint8_t *expiry_height = input + NU5_INDEX_EXPIRY_HEIGHT; + + cx_hash_no_throw(&ctx.header, 0, version, 4, NULL, 0); + cx_hash_no_throw(&ctx.header, 0, version_group_id, 4, NULL, 0); + cx_hash_no_throw(&ctx.header, 0, consensus_branch_id, 4, NULL, 0); + cx_hash_no_throw(&ctx.header, 0, lock_time, 4, NULL, 0); + cx_hash_no_throw(&ctx.header, CX_LAST, expiry_height, 4, output, HASH_SIZE); } void hash_transparent_txid_data(const uint8_t *input, uint8_t *output) { - zemu_log_stack("hash_transparent_txid_data"); - cx_blake2b_t ctx; - uint8_t personalization[16] = {0}; - MEMCPY(personalization, PIC(ZCASH_TRANSPARENT_HASH_PERSONALIZATION), 16); - cx_blake2b_init2_no_throw(&ctx, 256, NULL, 0, (uint8_t *) personalization, 16); + zemu_log_stack("hash_transparent_txid_data"); + cx_blake2b_t ctx; + uint8_t personalization[16] = {0}; + MEMCPY(personalization, PIC(ZCASH_TRANSPARENT_HASH_PERSONALIZATION), 16); + cx_blake2b_init2_no_throw(&ctx, 256, NULL, 0, (uint8_t *)personalization, 16); + + if (t_inlist_len() + t_outlist_len() > 0) { + const uint8_t *prevout_digest = input + NU5_INDEX_HASH_PREVOUTSHASH; + const uint8_t *sequence_digest = input + NU5_INDEX_HASH_SEQUENCEHASH; + const uint8_t *outputs_digest = input + NU5_INDEX_HASH_OUTPUTSHASH; + + cx_hash_no_throw(&ctx.header, 0, prevout_digest, HASH_SIZE, NULL, 0); + cx_hash_no_throw(&ctx.header, 0, sequence_digest, HASH_SIZE, NULL, 0); + cx_hash_no_throw(&ctx.header, CX_LAST, outputs_digest, HASH_SIZE, output, + HASH_SIZE); + } else { + cx_hash_no_throw(&ctx.header, CX_LAST, NULL, 0, output, HASH_SIZE); + } +} - if (t_inlist_len() + t_outlist_len() > 0) { - const uint8_t *prevout_digest = input + NU5_INDEX_HASH_PREVOUTSHASH; - const uint8_t *sequence_digest = input + NU5_INDEX_HASH_SEQUENCEHASH; - const uint8_t *outputs_digest = input + NU5_INDEX_HASH_OUTPUTSHASH; +void transparent_sig_digest(const uint8_t *input, uint8_t *start_signdata, + uint8_t index, signable_input type, + uint8_t *output) { + zemu_log_stack("transparent_sig_digest"); - cx_hash_no_throw(&ctx.header, 0, prevout_digest, HASH_SIZE, NULL, 0); - cx_hash_no_throw(&ctx.header, 0, sequence_digest, HASH_SIZE, NULL, 0); - cx_hash_no_throw(&ctx.header, CX_LAST, outputs_digest, HASH_SIZE, output, HASH_SIZE); - } - else{ - cx_hash_no_throw(&ctx.header, CX_LAST, NULL, 0, output, HASH_SIZE); - } -} + if (t_inlist_len() == 0) { + hash_transparent_txid_data(start_signdata, output); + } else { + // the following implies that flag_anyonecanpay = flag_single = flag_none = + // false + uint8_t hash_type = SIGHASH_ALL; -void transparent_sig_digest(const uint8_t *input, uint8_t *start_signdata, uint8_t index,signable_input type, uint8_t *output) { - zemu_log_stack("transparent_sig_digest"); + const uint8_t *prevout_digest = + start_signdata + NU5_INDEX_HASH_PREVOUTSHASH; - if (t_inlist_len()==0){ - hash_transparent_txid_data(start_signdata,output); + // compute amounts digest + cx_blake2b_t ctx_amounts; + uint8_t personalization[16] = {0}; + MEMCPY(personalization, PIC(ZCASH_TRANSPARENT_AMOUNTS_HASH_PERSONALIZATION), + 16); + cx_blake2b_init2_no_throw(&ctx_amounts, 256, NULL, 0, + (uint8_t *)personalization, 16); + uint64_t amount = 0; + uint8_t amounts_digest[HASH_SIZE] = {0}; + for (uint8_t i = 0; i < t_inlist_len() - 1; ++i) { + amount = t_inlist_retrieve_item_amount(i); + cx_hash_no_throw(&ctx_amounts.header, 0, (uint8_t *)&amount, + sizeof(uint64_t), NULL, 0); } - else{ - // the following implies that flag_anyonecanpay = flag_single = flag_none = false - uint8_t hash_type = SIGHASH_ALL; - - const uint8_t *prevout_digest = start_signdata + NU5_INDEX_HASH_PREVOUTSHASH; - - // compute amounts digest - cx_blake2b_t ctx_amounts; - uint8_t personalization[16] = {0}; - MEMCPY(personalization, PIC(ZCASH_TRANSPARENT_AMOUNTS_HASH_PERSONALIZATION), 16); - cx_blake2b_init2_no_throw(&ctx_amounts, 256, NULL, 0, (uint8_t *) personalization, 16); - uint64_t amount = 0; - uint8_t amounts_digest[HASH_SIZE] = {0}; - for (uint8_t i = 0; i < t_inlist_len()-1; ++i) { - amount = t_inlist_retrieve_item_amount(i); - cx_hash_no_throw(&ctx_amounts.header, 0, (uint8_t *) &amount, sizeof(uint64_t), NULL, 0); - } - amount = t_inlist_retrieve_item_amount(t_inlist_len()-1); - cx_hash_no_throw(&ctx_amounts.header, CX_LAST, (uint8_t *) &amount, sizeof(uint64_t), amounts_digest, HASH_SIZE); - MEMZERO(personalization, 16); - - cx_blake2b_t ctx_scripts; - MEMCPY(personalization, PIC(ZCASH_TRANSPARENT_SCRIPTS_HASH_PERSONALIZATION), 16); - cx_blake2b_init2_no_throw(&ctx_scripts, 256, NULL, 0, (uint8_t *) personalization, 16); - uint8_t scripts[SCRIPT_SIZE]; - uint8_t scripts_digest[HASH_SIZE] = {0}; - for (uint8_t i = 0; i < t_inlist_len()-1; ++i) { - t_inlist_retrieve_item_script(i, scripts); - cx_hash_no_throw(&ctx_scripts.header, 0, scripts, sizeof(scripts), NULL, 0); - MEMZERO(scripts, SCRIPT_SIZE); - } - t_inlist_retrieve_item_script(t_inlist_len()-1, scripts); - cx_hash_no_throw(&ctx_scripts.header, CX_LAST, scripts, SCRIPT_SIZE, scripts_digest, HASH_SIZE); - MEMZERO(personalization, 16); - - const uint8_t *sequence_digest = start_signdata + NU5_INDEX_HASH_SEQUENCEHASH; - const uint8_t *outputs_digest = start_signdata + NU5_INDEX_HASH_OUTPUTSHASH; - - cx_blake2b_t ctx_txin_sig_digest; - uint8_t txin_sig_digest[HASH_SIZE] = {0}; - MEMCPY(personalization, PIC(ZCASH_TRANSPARENT_INPUT_HASH_PERSONALIZATION), 16); - cx_blake2b_init2_no_throw(&ctx_txin_sig_digest, 256, NULL, 0, (uint8_t *) personalization, 16); - if (type == transparent){ - const t_input_item_t *item = t_inlist_retrieve_item(index); - - const uint8_t *prevout_data = input + index * T_IN_TX_LEN + INDEX_TIN_PREVOUT; - cx_hash_no_throw(&ctx_txin_sig_digest.header, 0, prevout_data, PREVOUT_SIZE, NULL, 0); - - uint64_t value = item->value; - cx_hash_no_throw(&ctx_txin_sig_digest.header, 0, (uint8_t *) &value, sizeof(uint64_t), NULL, 0); - - const uint8_t *script = item-> script; - cx_hash_no_throw(&ctx_txin_sig_digest.header, 0, script, SCRIPT_SIZE, NULL, 0); - - const uint8_t *sequence_data = input + index * T_IN_TX_LEN + INDEX_TIN_SEQ; - cx_hash_no_throw(&ctx_txin_sig_digest.header, 0, sequence_data, SEQUENCE_SIZE, NULL, 0); - } - cx_hash_no_throw(&ctx_txin_sig_digest.header, CX_LAST, NULL, 0, txin_sig_digest, HASH_SIZE); - MEMZERO(personalization,16); - - cx_blake2b_t ctx; - MEMCPY(personalization, PIC(ZCASH_TRANSPARENT_HASH_PERSONALIZATION), 16); - cx_blake2b_init2_no_throw(&ctx, 256, NULL, 0, (uint8_t *) personalization, 16); - - cx_hash_no_throw(&ctx.header, 0, &hash_type, sizeof(uint8_t), NULL, 0); - cx_hash_no_throw(&ctx.header, 0, prevout_digest, HASH_SIZE, NULL, 0); - cx_hash_no_throw(&ctx.header, 0, amounts_digest, HASH_SIZE, NULL, 0); - cx_hash_no_throw(&ctx.header, 0, scripts_digest, HASH_SIZE, NULL, 0); - cx_hash_no_throw(&ctx.header, 0, sequence_digest, HASH_SIZE, NULL, 0); - cx_hash_no_throw(&ctx.header, 0, outputs_digest, HASH_SIZE, NULL, 0); - - cx_hash_no_throw(&ctx.header, CX_LAST, txin_sig_digest, HASH_SIZE, output, HASH_SIZE); - + amount = t_inlist_retrieve_item_amount(t_inlist_len() - 1); + cx_hash_no_throw(&ctx_amounts.header, CX_LAST, (uint8_t *)&amount, + sizeof(uint64_t), amounts_digest, HASH_SIZE); + MEMZERO(personalization, 16); + + cx_blake2b_t ctx_scripts; + MEMCPY(personalization, PIC(ZCASH_TRANSPARENT_SCRIPTS_HASH_PERSONALIZATION), + 16); + cx_blake2b_init2_no_throw(&ctx_scripts, 256, NULL, 0, + (uint8_t *)personalization, 16); + uint8_t scripts[SCRIPT_SIZE]; + uint8_t scripts_digest[HASH_SIZE] = {0}; + for (uint8_t i = 0; i < t_inlist_len() - 1; ++i) { + t_inlist_retrieve_item_script(i, scripts); + cx_hash_no_throw(&ctx_scripts.header, 0, scripts, sizeof(scripts), NULL, + 0); + MEMZERO(scripts, SCRIPT_SIZE); } -} + t_inlist_retrieve_item_script(t_inlist_len() - 1, scripts); + cx_hash_no_throw(&ctx_scripts.header, CX_LAST, scripts, SCRIPT_SIZE, + scripts_digest, HASH_SIZE); + MEMZERO(personalization, 16); + + const uint8_t *sequence_digest = + start_signdata + NU5_INDEX_HASH_SEQUENCEHASH; + const uint8_t *outputs_digest = start_signdata + NU5_INDEX_HASH_OUTPUTSHASH; + + cx_blake2b_t ctx_txin_sig_digest; + uint8_t txin_sig_digest[HASH_SIZE] = {0}; + MEMCPY(personalization, PIC(ZCASH_TRANSPARENT_INPUT_HASH_PERSONALIZATION), + 16); + cx_blake2b_init2_no_throw(&ctx_txin_sig_digest, 256, NULL, 0, + (uint8_t *)personalization, 16); + if (type == transparent) { + const t_input_item_t *item = t_inlist_retrieve_item(index); + + const uint8_t *prevout_data = + input + index * T_IN_TX_LEN + INDEX_TIN_PREVOUT; + cx_hash_no_throw(&ctx_txin_sig_digest.header, 0, prevout_data, + PREVOUT_SIZE, NULL, 0); + + uint64_t value = item->value; + cx_hash_no_throw(&ctx_txin_sig_digest.header, 0, (uint8_t *)&value, + sizeof(uint64_t), NULL, 0); + + const uint8_t *script = item->script; + cx_hash_no_throw(&ctx_txin_sig_digest.header, 0, script, SCRIPT_SIZE, + NULL, 0); + + const uint8_t *sequence_data = + input + index * T_IN_TX_LEN + INDEX_TIN_SEQ; + cx_hash_no_throw(&ctx_txin_sig_digest.header, 0, sequence_data, + SEQUENCE_SIZE, NULL, 0); + } + cx_hash_no_throw(&ctx_txin_sig_digest.header, CX_LAST, NULL, 0, + txin_sig_digest, HASH_SIZE); + MEMZERO(personalization, 16); -void hash_sapling_txid_data(const uint8_t *input, uint8_t *output) { - zemu_log_stack("hash_sapling_txid_data"); cx_blake2b_t ctx; - uint8_t personalization[16] = {0}; - MEMCPY(personalization, PIC(ZCASH_SAPLING_HASH_PERSONALIZATION), 16); - cx_blake2b_init2_no_throw(&ctx, 256, NULL, 0, (uint8_t *) personalization, 16); - - if (spendlist_len() + outputlist_len() > 0) { - const uint8_t *hash_sapling_spends = input + NU5_INDEX_HASH_SHIELDEDSPENDHASH; - const uint8_t *hash_sapling_outputs = input + NU5_INDEX_HASH_SHIELDEDOUTPUTHASH; - const uint8_t *value_balance = input + NU5_INDEX_HASH_VALUEBALANCE; + MEMCPY(personalization, PIC(ZCASH_TRANSPARENT_HASH_PERSONALIZATION), 16); + cx_blake2b_init2_no_throw(&ctx, 256, NULL, 0, (uint8_t *)personalization, + 16); + + cx_hash_no_throw(&ctx.header, 0, &hash_type, sizeof(uint8_t), NULL, 0); + cx_hash_no_throw(&ctx.header, 0, prevout_digest, HASH_SIZE, NULL, 0); + cx_hash_no_throw(&ctx.header, 0, amounts_digest, HASH_SIZE, NULL, 0); + cx_hash_no_throw(&ctx.header, 0, scripts_digest, HASH_SIZE, NULL, 0); + cx_hash_no_throw(&ctx.header, 0, sequence_digest, HASH_SIZE, NULL, 0); + cx_hash_no_throw(&ctx.header, 0, outputs_digest, HASH_SIZE, NULL, 0); + + cx_hash_no_throw(&ctx.header, CX_LAST, txin_sig_digest, HASH_SIZE, output, + HASH_SIZE); + } +} - cx_hash_no_throw(&ctx.header, 0, hash_sapling_spends, HASH_SIZE, NULL, 0); - cx_hash_no_throw(&ctx.header, 0, hash_sapling_outputs, HASH_SIZE, NULL, 0); - cx_hash_no_throw(&ctx.header, CX_LAST, value_balance, NU5_VALUEBALANCE_SIZE, output, HASH_SIZE); - } - else{ - cx_hash_no_throw(&ctx.header, CX_LAST, 0, 0, output, HASH_SIZE); - } +void hash_sapling_txid_data(const uint8_t *input, uint8_t *output) { + zemu_log_stack("hash_sapling_txid_data"); + cx_blake2b_t ctx; + uint8_t personalization[16] = {0}; + MEMCPY(personalization, PIC(ZCASH_SAPLING_HASH_PERSONALIZATION), 16); + cx_blake2b_init2_no_throw(&ctx, 256, NULL, 0, (uint8_t *)personalization, 16); + + if (spendlist_len() + outputlist_len() > 0) { + const uint8_t *hash_sapling_spends = + input + NU5_INDEX_HASH_SHIELDEDSPENDHASH; + const uint8_t *hash_sapling_outputs = + input + NU5_INDEX_HASH_SHIELDEDOUTPUTHASH; + const uint8_t *value_balance = input + NU5_INDEX_HASH_VALUEBALANCE; + + cx_hash_no_throw(&ctx.header, 0, hash_sapling_spends, HASH_SIZE, NULL, 0); + cx_hash_no_throw(&ctx.header, 0, hash_sapling_outputs, HASH_SIZE, NULL, 0); + cx_hash_no_throw(&ctx.header, CX_LAST, value_balance, NU5_VALUEBALANCE_SIZE, + output, HASH_SIZE); + } else { + cx_hash_no_throw(&ctx.header, CX_LAST, 0, 0, output, HASH_SIZE); + } } void hash_empty_orchard_txid_data(uint8_t *output) { - cx_blake2b_t ctx; - uint8_t personalization[16] = {0}; - MEMCPY(personalization, PIC(ZCASH_ORCHARD_HASH_PERSONALIZATION), 16); - cx_blake2b_init2_no_throw(&ctx, 256, NULL, 0, (uint8_t *) personalization, 16); + cx_blake2b_t ctx; + uint8_t personalization[16] = {0}; + MEMCPY(personalization, PIC(ZCASH_ORCHARD_HASH_PERSONALIZATION), 16); + cx_blake2b_init2_no_throw(&ctx, 256, NULL, 0, (uint8_t *)personalization, 16); - cx_hash_no_throw(&ctx.header, CX_LAST, 0, 0, output, HASH_SIZE); + cx_hash_no_throw(&ctx.header, CX_LAST, 0, 0, output, HASH_SIZE); } diff --git a/app/src/txid.h b/app/src/txid.h index 97d3ab6a..156df9ec 100644 --- a/app/src/txid.h +++ b/app/src/txid.h @@ -1,18 +1,18 @@ /******************************************************************************* -* (c) 2018 -2022 Zondax AG -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -********************************************************************************/ + * (c) 2018 -2022 Zondax AG + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ********************************************************************************/ #pragma once @@ -30,7 +30,9 @@ void hash_header_txid_data(const uint8_t *input, uint8_t *output); void hash_transparent_txid_data(const uint8_t *input, uint8_t *output); -void transparent_sig_digest(const uint8_t *input, uint8_t *start_signdata, uint8_t index,signable_input type, uint8_t *output); +void transparent_sig_digest(const uint8_t *input, uint8_t *start_signdata, + uint8_t index, signable_input type, + uint8_t *output); void hash_sapling_txid_data(const uint8_t *input, uint8_t *output); diff --git a/app/src/zcash_apdu_errors.h b/app/src/zcash_apdu_errors.h index 3d9433f3..7f9be800 100644 --- a/app/src/zcash_apdu_errors.h +++ b/app/src/zcash_apdu_errors.h @@ -1,34 +1,34 @@ /******************************************************************************* -* (c) 2018 - 2022 Zondax AG -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -********************************************************************************/ + * (c) 2018 - 2022 Zondax AG + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ********************************************************************************/ #pragma once // Specific APDU error codes for ZCash -#define APDU_CODE_DATA_TOO_LONG 0x6988 -#define APDU_CODE_EXTRACT_TRANSACTION_FAIL 0x6989 -#define APDU_CODE_HASH_MSG_BUF_FAIL 0x6990 -#define APDU_CODE_UNPROCESSED_TX 0x6991 -#define APDU_CODE_PREVOUT_INVALID 0x6992 -#define APDU_CODE_SEQUENCE_INVALID 0x6993 -#define APDU_CODE_OUTPUTS_INVALID 0x6994 -#define APDU_CODE_JOINSPLIT_INVALID 0x6995 -#define APDU_CODE_SPEND_INVALID 0x6996 -#define APDU_CODE_OUTPUT_CONTENT_INVALID 0x6997 -#define APDU_CODE_ENCRYPTION_INVALID 0x6998 -#define APDU_CODE_CHECK_SIGN_TR_FAIL 0x6999 -#define APDU_SIGN_SPEND_FAIL 0x69A0 -#define APDU_CODE_BAD_VALUEBALANCE 0x69A1 -#define APDU_CODE_UNHANDLED_TX_VERSION 0x69A2 +#define APDU_CODE_DATA_TOO_LONG 0x6988 +#define APDU_CODE_EXTRACT_TRANSACTION_FAIL 0x6989 +#define APDU_CODE_HASH_MSG_BUF_FAIL 0x6990 +#define APDU_CODE_UNPROCESSED_TX 0x6991 +#define APDU_CODE_PREVOUT_INVALID 0x6992 +#define APDU_CODE_SEQUENCE_INVALID 0x6993 +#define APDU_CODE_OUTPUTS_INVALID 0x6994 +#define APDU_CODE_JOINSPLIT_INVALID 0x6995 +#define APDU_CODE_SPEND_INVALID 0x6996 +#define APDU_CODE_OUTPUT_CONTENT_INVALID 0x6997 +#define APDU_CODE_ENCRYPTION_INVALID 0x6998 +#define APDU_CODE_CHECK_SIGN_TR_FAIL 0x6999 +#define APDU_SIGN_SPEND_FAIL 0x69A0 +#define APDU_CODE_BAD_VALUEBALANCE 0x69A1 +#define APDU_CODE_UNHANDLED_TX_VERSION 0x69A2 From f111c91721969b07d8d75fe5802c7283c8e23d0a Mon Sep 17 00:00:00 2001 From: becominginsane Date: Fri, 27 Oct 2023 03:15:26 +0800 Subject: [PATCH 06/24] fix: add git blame ignore revs --- .git-blame-ignore-revs | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 .git-blame-ignore-revs diff --git a/.git-blame-ignore-revs b/.git-blame-ignore-revs new file mode 100644 index 00000000..4e0800fa --- /dev/null +++ b/.git-blame-ignore-revs @@ -0,0 +1,2 @@ +# clang-format whole repo +1782c0088b067ae7275c22658e326378f0481d9c From c371425275c4cd3b5ae352074b3400cc551dde4f Mon Sep 17 00:00:00 2001 From: becominginsane Date: Fri, 27 Oct 2023 03:47:02 +0800 Subject: [PATCH 07/24] fix: missing includes --- app/src/chacha.c | 2 -- app/src/chacha.h | 5 +++++ app/src/sighash.c | 1 - app/src/sighash.h | 2 ++ 4 files changed, 7 insertions(+), 3 deletions(-) diff --git a/app/src/chacha.c b/app/src/chacha.c index 598e3c8b..985b7600 100644 --- a/app/src/chacha.c +++ b/app/src/chacha.c @@ -20,8 +20,6 @@ #include "cx.h" #include "os.h" #include "zxmacros.h" -#include -#include #define U8TO32_LITTLE(p) \ (((uint32_t)((p)[0])) | ((uint32_t)((p)[1]) << 8) | \ diff --git a/app/src/chacha.h b/app/src/chacha.h index 9ac95ba5..a9414c0a 100644 --- a/app/src/chacha.h +++ b/app/src/chacha.h @@ -12,6 +12,11 @@ * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ +#pragma once + +#include +#include + #if defined(__cplusplus) extern "C" { #endif diff --git a/app/src/sighash.c b/app/src/sighash.c index 7dfb9336..02a6d9c2 100644 --- a/app/src/sighash.c +++ b/app/src/sighash.c @@ -20,7 +20,6 @@ #include "nvdata.h" #include "os.h" #include "txid.h" -#include #include #include diff --git a/app/src/sighash.h b/app/src/sighash.h index 4e4dfbd4..e0a11c38 100644 --- a/app/src/sighash.h +++ b/app/src/sighash.h @@ -16,6 +16,8 @@ #pragma once +#include + typedef enum { transparent = 0, shielded = 1, From 2f1711a3fd93345ae413631036f3e7ce8e5e088e Mon Sep 17 00:00:00 2001 From: becominginsane Date: Fri, 27 Oct 2023 03:47:18 +0800 Subject: [PATCH 08/24] feat: zip-0317 fee calculation feat(make): HAVE_ZIP0317 --- app/Makefile | 2 +- app/src/crypto.c | 11 +++++++++-- app/src/zip-0317.c | 39 +++++++++++++++++++++++++++++++++++++++ app/src/zip-0317.h | 30 ++++++++++++++++++++++++++++++ 4 files changed, 79 insertions(+), 3 deletions(-) create mode 100644 app/src/zip-0317.c create mode 100644 app/src/zip-0317.h diff --git a/app/Makefile b/app/Makefile index ebcb773e..0342b5fb 100755 --- a/app/Makefile +++ b/app/Makefile @@ -63,7 +63,7 @@ endif include $(CURDIR)/../deps/ledger-zxlib/makefiles/Makefile.platform -DEFINES += HAVE_HASH HAVE_BLAKE2 HAVE_SHA256 HAVE_SHA512 +DEFINES += HAVE_HASH HAVE_BLAKE2 HAVE_SHA256 HAVE_SHA512 HAVE_ZIP0317 APP_SOURCE_PATH += $(CURDIR)/rust/include APP_SOURCE_PATH += $(MY_DIR)/../deps/tiny-aes/src diff --git a/app/src/crypto.c b/app/src/crypto.c index 543d55d3..b1a40ca5 100644 --- a/app/src/crypto.c +++ b/app/src/crypto.c @@ -29,6 +29,7 @@ #include "rslib.h" #include "sighash.h" #include "txid.h" +#include "zip-0317.h" #include "zxformat.h" #include "zxmacros.h" @@ -357,10 +358,16 @@ zxerr_t crypto_extracttx_sapling(uint8_t *buffer, uint16_t bufferLen, start += OUTPUT_INPUT_LEN; } - uint64_t value_flash = get_totalvalue(); - if (value_flash != 1000) { + uint64_t tx_value__flash = get_totalvalue(); +#ifdef HAVE_ZIP0317 + if (tx_value__flash != zip_0317(t_in_len, t_out_len, spend_len, output_len)) { return (zxerr_t)EXTRACT_SAPLING_ED; } +#else + if (tx_value__flash != 1000) { + return (zxerr_t)EXTRACT_SAPLING_ED; + } +#endif if (spend_len > 0) { set_state(STATE_PROCESSED_INPUTS); // need both spend info and output info diff --git a/app/src/zip-0317.c b/app/src/zip-0317.c new file mode 100644 index 00000000..492d1b93 --- /dev/null +++ b/app/src/zip-0317.c @@ -0,0 +1,39 @@ +#include "zip-0317.h" + +#define DIV_CEIL(x, y) ((x + (y - 1)) / y) + +#define MARGINAL_FEE 5000 +#define GRACE_ACTIONS 2 +#define P2PKH_STANDARD_INPUT_SIZE 150 +#define P2PKH_STANDARD_OUTPUT_SIZE 34 + +uint64_t zip_0317_fee_raw(uint64_t tx_in_total_size, uint64_t tx_out_total_size, + uint64_t n_join_split, uint64_t n_spends_sapling, + uint64_t n_outputs_sapling, + uint64_t n_actions_orchard) { + + uint64_t tin_actions = DIV_CEIL(tx_in_total_size, P2PKH_STANDARD_INPUT_SIZE); + uint64_t tout_actions = + DIV_CEIL(tx_out_total_size, P2PKH_STANDARD_OUTPUT_SIZE); + + uint64_t transparent_actions = + (tin_actions > tout_actions) ? tin_actions : tout_actions; + uint64_t sapling_actions = (n_spends_sapling > n_outputs_sapling) + ? n_spends_sapling + : n_outputs_sapling; + uint64_t joinsplit_actions = 2 * n_join_split; + uint64_t orchard_actions = n_actions_orchard; + + uint64_t logical_actions = transparent_actions + sapling_actions + + joinsplit_actions + orchard_actions; + + return MARGINAL_FEE * + ((GRACE_ACTIONS > logical_actions) ? GRACE_ACTIONS : logical_actions); +} + +uint64_t zip_0317(uint64_t n_tin, uint64_t n_tout, uint64_t n_sapling_spends, + uint64_t n_sapling_outs) { + return zip_0317_fee_raw(n_tin * P2PKH_STANDARD_INPUT_SIZE, + n_tout * P2PKH_STANDARD_OUTPUT_SIZE, 0, + n_sapling_spends, n_sapling_outs, 0); +} diff --git a/app/src/zip-0317.h b/app/src/zip-0317.h new file mode 100644 index 00000000..3e4dd257 --- /dev/null +++ b/app/src/zip-0317.h @@ -0,0 +1,30 @@ +/******************************************************************************* + * (c) 2018 - 2023 Zondax AG + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ********************************************************************************/ + +#pragma once + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +uint64_t zip_0317(uint64_t n_tin, uint64_t n_tout, uint64_t n_sapling_spends, + uint64_t n_sapling_outs); + +#ifdef __cplusplus +} +#endif From 462debf4b22571568fad9ac4ffa894fbb9278f31 Mon Sep 17 00:00:00 2001 From: becominginsane Date: Sat, 11 Nov 2023 10:40:42 +0800 Subject: [PATCH 09/24] feat: specify version as 3.3.0 feat(ci): upload snapshots as artifact fix(tests): ovk as undefined --- .github/workflows/main.yml | 12 ++++++++++++ app/Makefile.version | 2 +- tests_zemu/tests/zcashtool.test.ts | 2 -- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 97a3f064..e18068db 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -108,6 +108,18 @@ jobs: run: | make test_all + - name: Tar Zemu snapshots + if: always() + run: tar -cvf snapshots_tmp.tar ./tests_zemu/snapshots-tmp + - name: Upload tmp snapshots + if: always() + uses: actions/upload-artifact@v3 + with: + name: snapshots-tmp + path: snapshots_tmp.tar + #we don't need these snapshots for very long + retention-days: 3 + build_package_nanos: needs: [ diff --git a/app/Makefile.version b/app/Makefile.version index 85f2b6ab..fd7f9b50 100644 --- a/app/Makefile.version +++ b/app/Makefile.version @@ -1,6 +1,6 @@ # This is the major version of this release APPVERSION_M=3 # This is the minor version of this release -APPVERSION_N=2 +APPVERSION_N=3 # This is the patch version of this release APPVERSION_P=0 diff --git a/tests_zemu/tests/zcashtool.test.ts b/tests_zemu/tests/zcashtool.test.ts index 25c2ef7b..830ed2a0 100644 --- a/tests_zemu/tests/zcashtool.test.ts +++ b/tests_zemu/tests/zcashtool.test.ts @@ -1954,7 +1954,6 @@ describe('Failing transactions', function () { const outj1 = { rcv: req4.rcv_raw, rseed: req4.rseed_raw, - ovk: null, address: s_out1.address, value: s_out1.value, memo: '0000', @@ -2200,7 +2199,6 @@ describe('Failing transactions', function () { const outj1 = { rcv: req4.rcv_raw, rseed: req4.rseed_raw, - ovk: null, address: s_out1.address, value: s_out1.value, memo: '0000', From 1a553970ea4103213265eb7990b80c7ee67365fc Mon Sep 17 00:00:00 2001 From: becominginsane Date: Sat, 11 Nov 2023 13:18:10 +0800 Subject: [PATCH 10/24] fix(zcashtools): compile ts in `prepare` --- zcashtools/neon/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zcashtools/neon/package.json b/zcashtools/neon/package.json index 9f4729ed..b07c98ae 100644 --- a/zcashtools/neon/package.json +++ b/zcashtools/neon/package.json @@ -12,7 +12,7 @@ }, "scripts": { "install": "./node_modules/.bin/neon build", - "build": "tsc", + "prepare": "tsc", "test": "node -e 'require(\"./\")'" }, "devDependencies": { From a000d3d1028c67c6bd0e81f55a7e3d7a41b9acc0 Mon Sep 17 00:00:00 2001 From: becominginsane Date: Sat, 11 Nov 2023 22:57:36 +0800 Subject: [PATCH 11/24] fix(zemu): properly import `get_inittx_data` --- tests_zemu/tests/zcashtool.test.ts | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/tests_zemu/tests/zcashtool.test.ts b/tests_zemu/tests/zcashtool.test.ts index 830ed2a0..eb8848fa 100644 --- a/tests_zemu/tests/zcashtool.test.ts +++ b/tests_zemu/tests/zcashtool.test.ts @@ -17,7 +17,7 @@ import Zemu, { ButtonKind, DEFAULT_START_OPTIONS } from '@zondax/zemu' import ZCashApp from '@zondax/ledger-zcash' import { APP_SEED, models } from './common' -import addon, { ZcashBuilderBridge, SPEND_PATH, OUTPUT_PATH } from '@zondax/zcashtools' +import { get_inittx_data, ZcashBuilderBridge, SPEND_PATH, OUTPUT_PATH } from '@zondax/zcashtools' import { TX_INPUT_DATA } from './vectors' const crypto = require('crypto') @@ -268,7 +268,7 @@ describe('End to end transactions', function () { The output is a blob that can be sent to the ledger device. */ - const ledgerblob_initdata = addon.get_inittx_data(tx_input_data) + const ledgerblob_initdata = get_inittx_data(tx_input_data) console.log(Buffer.from(ledgerblob_initdata).byteLength) /* @@ -539,7 +539,7 @@ describe('End to end transactions', function () { The output is a blob that can be send to the ledger device. */ - const ledgerblob_initdata = addon.get_inittx_data(tx_input_data) + const ledgerblob_initdata = get_inittx_data(tx_input_data) console.log(ledgerblob_initdata) /* @@ -806,7 +806,7 @@ describe('End to end transactions', function () { The output is a blob that can be send to the ledger device. */ - const ledgerblob_initdata = addon.get_inittx_data(tx_input_data) + const ledgerblob_initdata = get_inittx_data(tx_input_data) console.log(ledgerblob_initdata) /* @@ -1059,7 +1059,7 @@ describe('End to end transactions', function () { The output is a blob that can be send to the ledger device. */ - const ledgerblob_initdata = addon.get_inittx_data(tx_input_data) + const ledgerblob_initdata = get_inittx_data(tx_input_data) console.log(ledgerblob_initdata) /* @@ -1323,7 +1323,7 @@ describe('End to end transactions', function () { s_output: [], } = tx_input_data - const ledgerblob_initdata = addon.get_inittx_data(tx_input_data) + const ledgerblob_initdata = get_inittx_data(tx_input_data) console.log(ledgerblob_initdata) const reqinit = app.inittx(ledgerblob_initdata) @@ -1442,7 +1442,7 @@ describe('End to end transactions', function () { s_output: [s_out1, s_out2], } = tx_input_data - const ledgerblob_initdata = addon.get_inittx_data(tx_input_data) + const ledgerblob_initdata = get_inittx_data(tx_input_data) console.log(ledgerblob_initdata) const reqinit = app.inittx(ledgerblob_initdata) @@ -1527,7 +1527,7 @@ describe('Failing transactions', function () { s_output: [s_out1, s_out2], } = tx_input_data - const ledgerblob_initdata = addon.get_inittx_data(tx_input_data) + const ledgerblob_initdata = get_inittx_data(tx_input_data) console.log(ledgerblob_initdata) const reqinit = app.inittx(ledgerblob_initdata) @@ -1584,7 +1584,7 @@ describe('Failing transactions', function () { The output is a blob that can be send to the ledger device. */ - const ledgerblob_initdata = addon.get_inittx_data(tx_input_data) + const ledgerblob_initdata = get_inittx_data(tx_input_data) console.log(ledgerblob_initdata) /* @@ -1831,7 +1831,7 @@ describe('Failing transactions', function () { The output is a blob that can be send to the ledger device. */ - const ledgerblob_initdata = addon.get_inittx_data(tx_input_data) + const ledgerblob_initdata = get_inittx_data(tx_input_data) console.log(Buffer.from(ledgerblob_initdata).toString('hex')) /* @@ -2083,7 +2083,7 @@ describe('Failing transactions', function () { The output is a blob that can be send to the ledger device. */ - const ledgerblob_initdata = addon.get_inittx_data(tx_input_data) + const ledgerblob_initdata = get_inittx_data(tx_input_data) console.log(ledgerblob_initdata) /* @@ -2294,7 +2294,7 @@ describe('Failing transactions', function () { The output is a blob that can be send to the ledger device. */ - const ledgerblob_initdata = addon.get_inittx_data(tx_input_data) + const ledgerblob_initdata = get_inittx_data(tx_input_data) console.log(ledgerblob_initdata) /* @@ -2345,7 +2345,7 @@ describe('Failing transactions', function () { The output is a blob that can be send to the ledger device. */ - const ledgerblob_initdata = addon.get_inittx_data(tx_input_data) + const ledgerblob_initdata = get_inittx_data(tx_input_data) console.log(ledgerblob_initdata) /* @@ -2402,7 +2402,7 @@ describe('Failing transactions', function () { s_output: [s_out1, s_out2], } = tx_input_data - const ledgerblob_initdata = addon.get_inittx_data(tx_input_data) + const ledgerblob_initdata = get_inittx_data(tx_input_data) console.log(Buffer.from(ledgerblob_initdata).byteLength) const reqinit = app.inittx(ledgerblob_initdata) From 55bf051f0fb372e6c53b7aa1a23d362899fc0a70 Mon Sep 17 00:00:00 2001 From: becominginsane Date: Sat, 11 Nov 2023 22:59:12 +0800 Subject: [PATCH 12/24] chore: update snapshots --- tests_zemu/snapshots/s-mainmenu/00004.png | Bin 402 -> 393 bytes tests_zemu/snapshots/s-mainmenu/00010.png | Bin 402 -> 393 bytes tests_zemu/snapshots/sp-mainmenu/00004.png | Bin 362 -> 346 bytes tests_zemu/snapshots/sp-mainmenu/00010.png | Bin 362 -> 346 bytes tests_zemu/snapshots/st-mainmenu/00001.png | Bin 13645 -> 13508 bytes tests_zemu/snapshots/x-mainmenu/00004.png | Bin 362 -> 346 bytes tests_zemu/snapshots/x-mainmenu/00010.png | Bin 362 -> 346 bytes 7 files changed, 0 insertions(+), 0 deletions(-) diff --git a/tests_zemu/snapshots/s-mainmenu/00004.png b/tests_zemu/snapshots/s-mainmenu/00004.png index fef3a5e4ef64b3f08ed7df462b280c10cbc553c7..d535fddfb700a3ea9a0367f051c6f94c073cbe28 100644 GIT binary patch delta 366 zcmV-!0g?Wa1BnBWB!5szL_t(|ob8yw4ul{KM0KcrBq?N3(mVK0?8EG zsmlTY0N|;t5t|&lw)57yV9N@B!#iRVuGB=@bs;1GguDv;&AR1}>Nj%k$l;6)Kq6C? z%g2X~T_56a)Z{i4fdRL92}_Xe9H0dG;Tiv7+}Z)MlEhCVzoPUFfSO}bi>fdn#SGnp zRH=*g8c3L)=OA}BAh%i0I60ZXhALT45u=F#^5m%~tDmQUByng%XxCcrBq?N3(mVK0?8EG zsmlTY0N|;t5t|&lw)57yV9N@B!#iRVuGB=@bs;1GguDv;&AR1}>Nj%k$l;6)Kq6C? z%g2X~T_56a)Z{i4fdRL92}_Xe9H0dG;Tiv7+}Z)MlEhCVzoPUFfSO}bi>fdn#SGnp zRH=*g8c3L)=OA}BAh%i0I60ZXhALT45u=F#^5m%~tDmQUByng%XxCroUO%%qg~?5oGnF-TmLgp!qk|6SjJGrk8W=WD5BklHnfYm3H~BZ~dAm z%Tn%u87a4a+={hKFAukVWVZdK3wOe!vd!E~vGps;_omNpcs$*Et6NS`+3h}~qf8=& z-ktn0k8bJba2uWdQulR}>GsQ)j@+)!+&F9zl!bNI-X9qUV zeBorw>$Hq*`m4uNqj~QN>pVO1+J<|t==#JROb`1`oXa_Co+vymr_BFZ+|GBa^Y?hy zvvqJaEoOb_W3lKy^Q-TZkK6C<5Ly4%!D)#(U{s$IDq0vXwQn$a=2-a~h z&DZ?Q?R@6%scj0EecoSRw)UshTHihY_1^LyKRr2x`&Osb%7 diff --git a/tests_zemu/snapshots/sp-mainmenu/00010.png b/tests_zemu/snapshots/sp-mainmenu/00010.png index 0678a63aeb012020b002f809b1d2d772e7693d87..b43e129ce457a124b5232000f714f0ada417fc19 100644 GIT binary patch delta 319 zcmaFGbc<<%O1+||i(^Q|oVPcl`I;33S`%-VsK2TAe6y5arG@A5g(KYTzw7gpa?eOg zif-p+K!BJ>roUO%%qg~?5oGnF-TmLgp!qk|6SjJGrk8W=WD5BklHnfYm3H~BZ~dAm z%Tn%u87a4a+={hKFAukVWVZdK3wOe!vd!E~vGps;_omNpcs$*Et6NS`+3h}~qf8=& z-ktn0k8bJba2uWdQulR}>GsQ)j@+)!+&F9zl!bNI-X9qUV zeBorw>$Hq*`m4uNqj~QN>pVO1+J<|t==#JROb`1`oXa_Co+vymr_BFZ+|GBa^Y?hy zvvqJaEoOb_W3lKy^Q-TZkK6C<5Ly4%!D)#(U{s$IDq0vXwQn$a=2-a~h z&DZ?Q?R@6%scj0EecoSRw)UshTHihY_1^LyKRr2x`&Osb%7 diff --git a/tests_zemu/snapshots/st-mainmenu/00001.png b/tests_zemu/snapshots/st-mainmenu/00001.png index 53586fccb9ef946ce284e5490cf793d4e1bcb4f8..8cf539d117273a6692423c5bb38c931628f29973 100644 GIT binary patch literal 13508 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%0D)x#c2U~G zJe{m?cV;Ok9-@?FMoc>CKnix0aXFf?8-0?Yo>M2r9J9R-uc$L_+kmt*JH2UZaw!Sr z(Q$EWN&a1xtL|T#wU$fq_Ns0tMrVZHcG~NZiCmz~TJh+FhBf+@4Mbiczdmrvf->~x zW(SbkpPKL}LAlvu3aAcU8zQizP!`&nEst_X^LZxBF95MJ{N?U+ppJn~*H{?jze^A> zdY=~NY{a88`l)S;AP`ZJ$^IrdZ|9rkr8}zK1e*$r&EOrH#>F+Og7-#`cE^O?wQ(YX zNrAVq)Y}~p*Uu$WlAVb8VIHxHDgz8FsI3QZ1AN`U>stv{pc5qAq@)G&p5OCx<4k-v zoHXvX*o1VZnO^#ZX|mQhn+ zf=QtBfDNuVc=S7>eQ+MqLYhk9 zuiKoKos5TA9~~SBCHH2ioCOfK>Y36Fqh?DbWaUc_=YGwM_K`iihhohlIwqkh@aE`7 z2FeP5?Am+WWh_;c`P6>mCJ(lyQauBZ2IuDl*t^Q13 zW%BTAAj4W~K;3|_&;|6^=-nAI>|!HZTXM6l72svWB@{lCsVFTS(PQtf8iBpyjuCx` zJho;Ue8&n`s0NFZ@t?CFuO*!`AkT$YdYo77po23!-Pu!vcD9^Yn7u z2g&tqH_r0tVJCBQZr%<`udh&VHHSc>g>qGql*ikN-cKqkjy%uo!fPP|mx@eq%pi4k zo;YWr-kc%y_%?_Hc&Nc}LK?$r1-BIPURWUrLYZyTu1I z?S?%k!b7;9ngW2Qp+o3_h6%Ke%8Rbsgo^XVWM;ujfmLVIk|!sBki3TIn}!9fx^q88 zm)x447M6Pdhc^S{F1yl+!qQUMk2|hj$~kD#=%rNAv=mCt1Dz}1BAyOIb6+2Hm7PJQ z4qg8Vkl)2=(i@WKxm|U4)jP&R!*pEQTy>Zfo~rKIPQ>K5;5@R8a$Wo=q)z`5?rwFwI|-qtqo2VJLcIj?HjPH$yU0;Bx5qQa z&_4Fr5!}Xb9q!jKtqIja_!yuz&oRN}NLww)RFoi~;o{U|Z*mubFvAVWZ>mj;)0aIH z0d@R0&j3i6D6^}-NA@-(+OV+(Wc(i2*Sw@$v>);qz)K^h^!AZqCF)$e+};trS!M(~ z2|rx$3Pb|OFM74j3ol34wzrG%gVltSd*|iYyB&=q2wtzHbl3bHLNlxdxSRfITAvbjfSsbHYF%d@i&)T{R0S{mP1O*JI{ zav+Zr!d>TfnyLKx9s?+W-433zk?rPXhpug2LUbUx zIisrf6$m465z;$vlG?{n{ymh1$;P-L7Th+cMjUrU;(;~a#5;K>>>Dl&sO=JAy6FZF z*25!9r5!hmPrLQ>)eW`_WZv5M+ZNPq20iC&e2qF0<+#Dc`X4jf|NpeoM61-k2Idm? z${x`dEMv`1E(Yh7e3U~|+lJh5jf%`Mvh0HTIK}j+pLS{mApO=6sRZGVowiy3$5cyu z&Eg~g80l)yKp3wqa9DxHi|cHH9~)0cu`WI#2_+7^S5p zQ(RHDhT{_KF{q`ax)8gDcyk2A9uL>qPXB15m;8KwVkdm>Q^%9*LdQmby_(QzWSPMF za*0qkYs`&^JE=Y4Gw`C};%&0>rbFM(VWCu|ktrMMrUAcIL-<#|YN%q9fc^|>1=Ik- z++N^#Wm551qybniV=FB%75qei%kqr*$;Y)H(N&fBN9N`YRy%>}Q4$+c@8*Lo&-LCc)w87$|j7QG2v;xXbLOPNVu@m$+2dOHam-&2b3vk%hOg5xJ+&BZJX9^Th4C8!StmfTB)X#PFQ6FT)r)fAamX}am^9i z)@ikIQSJ_DZ=ej+luNM+3dMK7^}qK!K+Rh@2ear0BnnEf)?D(Agx&=$z=(XY+>i)p z6QU$=6~E?*v4u{+A5>=dskjnF16%}8tir>((gou2yPGMw_YUqdnRTY&ajPoM(_nIN z%1e1Ofy}Nvo;ZI!$)#09tr0p$c&G?RUWw{86tcocrnnvjZiruBZAz~zT8;D;89L8h zGsNF)L#&Y#{~gFsR=uaX$2X70xhPspI&0CJln5+5cQ-D)tbFduzv7C)of> z4|N1&R=8r&%~-PJ)GT6gnCQn;G-b(0mfpS!V5yr)I%Mzg5D->ejM`kcOcZ4slva~U zPc#t{qZfx8Yc`yFOGg#!#m0ivhcBx9s#mxfR|!zdB3Ek!#QKt64S`%J1>j)v;EDO! zKfke*aF!3b)e^{qkyvMS3yIo4Ni9aWuWone7ZJBPo@dh&nZ#!J z*W=hjq-l1iOt+NPsc4x2Lj^CBCbP2OM>ae?~vS)7)QEXs@~%6n|#&6%Fk@ zRXy(Ip?-}&8axn0MeZ-l={s&emXoM^;++CjI|ta9KVF%8jXgp(K0LLIM>ibAP2_3;L&kT1Tw{t zcIDf!AJ-eo0#BP@SQ%b=?K$%~An|Cv3fm58;LWpdfGJPF%Hyi}$6<$5!Zra*td(=? zoJ+PANB;8QxewR~=bkxdLaak0PicQ~Xg<8`8r~RrMZ^N;!NmwqPwsWO$Wtg)S~_5_ zt1O^nGT*)#LWFue#M@PxC~D3lI~AfbC8~~XY9OrZ@%1tmQwdrn|U(-QSntRj(~?zq48RN!fq;(9S&l=`#xLzFcd@ z^q7~E9$@r-_MNsaC5V6o4sz*x zenpQBCjrI|vQ=il@d!4+4ysvHF?w4lwb1iWGKClnEz`cc4aRodH&5qjn)I4d+5lti zgBLE~0sAA8S5-{#>N&!V+OunHxMB91jjs;1)iqbQ{hFJk^|KYHpyVf>x>h1Nwd5<4 zCw%sE>4EJ8OS=_;nZb(yzs28~{gG$sR}#oO8d2;o*|($?>*bW9FAvlj*h5&uy#-fj zK(zXf`^BkK1Fye6EV4B>C-Aa)RQhz z$kT;k*R0=ej0ij$II43w064SkW8d2FnH#rTPsjghjcA=2-Z}g}(&AVK#0|9|f32@) zBHY)7fk*1c1Z>%BrS9IreXYEN1hz?je*O$Jh=e?fjh67JpQ8w#6>fSe`Dj+o1?I#` zLe+PHu>d87wI1&6?HwJhOvKM|e~gRL?!I+cLA z7V=k>#^dqOM!~)98c?k0PjJR5-WOXTxy0r~MHOBSW5ZW?rV`!h(%RJbxMdp6){U5F zB&oL-eGsU-sB84vz7Nj&M1dk?h0Z*Ta5OhJ;Q@Hwa9#KJbt;ug5~PBG1mCCQ;oJq^ z>q4pG%Oo|um|wZr&HblWlVID$$J`oIGwr1e+|Q}5g?%qau~CuNEATc<{0pkyM)BKt>r0PUY_JT;3jkE{Q#nB zmJK-t)fwY}>q2Nnx<%6f3znvw4wSt8`{-#9nbx5}D8BmTVc%}Y9ABmI>@9Z%PbU+5 z{AieZJ~q7hVz*kZd(Ex>^FgMZuO~Z@R+^!$N8#Tu98Y<->@;P^uXXdHxeXFuHkP1y zaZL_quybl}%Nv`p`exv3{tIJv8(L}k(-$zR53B>b9P9x!QofY3ttB`s3O5^l8 z#NJnP3Zf%z8DyPiks16R-&!V6g&XcuNc_xn?H%qS>V^54hf)1Lcq zbc>rgNW4kEb>IC82k68)>Px`83+PBvNSI(GtyWiF&wzE>^lH zKFDQmwC^gd<6u3NmF~;K0p9T^9h7rA8>xm2Ur0*Pki?IqDZcq&2jYGHDZ*^x%~+O-D(;X1gMTxt(}?9RnGl;YdsKF}{P%@ZV3s4f+p} z{EXW3wG$ORzIK3tcL7*tEtA&}YZD&j8~|@=1M}Y> z%K|xOShL;qdMciLX?0wpZ`$p(-C>&#iSAPED_%r+@rDB}gfA|fa`t~G-e?}3k!v_U z7sonnpmAvC0l>fKC)SELY?)-6GdNmQCQg~Xqcu!=EikEeIV9O;&%buCQwb5gjd~UWfr8n5QK4*S+8%rpwaVJ zupK^^!S4BV#sIhu`p1b!2Ol-PZEwd_u3oqKuS^>Lf~~G7ifDTmusVIx3TOIOj>Bs= ztrF;qE0K9q>A@b+kAZ=Z&onuj{P_x4LFicxki$E+WT?xX5v2l{N5@l zc?Ab=0Pp*7)oir6@w5}_eu>fq3*(v@gUjG@z!bERKpt-hT76~VV(2pHSq}hV>&#jb zE6}^O6#_JET{T@7te5{?vV^S*q*irOxkqE-oP)yYg{-2+5VL(r6| zgn%j6H212sa?UCk6y(>YKKWo_oZbLhiCU?f^l}|y0^m!}*jt-x!g^Wdq=mUTgNyOn zo86S-X)g|7fy-%gxmu40%X|l9P5ESp$``&fy}k&@&P@DjutO*bohg-&Q202$Y-vI* zO0Hv=NL|k$xA#=cjms|OoJF?+)@{j*T9l@K^W6#AqZ89YdU72GeymSQP6o2jJMsO` zcJ3{OGd}}EG!qITng@4F-9?tbjV+bN@6*CX@A2pafmbyRamNiXzrwZHyJgwkKU}Ud zJEM80{*$JGY|?y|^2YN*sliB*WpEj=Ln3;N_~KN~j-GB3Wp*o-t-7HAV@VTF5jh>- z9cF7HhNS{jp$4?*T&8342J1ezgHr^0+AgwLS6Bq+F=;<;wo51kT0gY87J@r$D%>i- zRif1Ts-iFto~Gmw$LH=1RYmj1%lsS=SS#Z*b8F`)hL)jsVLtC%zu6Csb=ADH^cBiE zx@}>PU&99HVYsle*0msvoKlMX49C`GjGsZ)JX_r;kO%fvR)Mi;?oiCA^Qc|=gkQgO zgB)91bC!)2wEM2|R|nmx>+(rBzP&ZUZ9v7qQ-GyfTIz|kHc#(~1{53t;cIIJS5j|u zFgJgf>deQhBj@I`x7UxZ)5&h=+=JCLEdWbgjZO@Ok0Tt5U7wDSAI|1YL2)1oAgx%wFB3sM$rUAowA ze|f>LnH>phwiC}*&lp%ctmpd1G01H-x>HSTv%BV%+&K~V=X{+^!p+g|0D@UU-(;oU zTFc)4jOM>qU$gAS<|RJA@x)8TUEEqZ$1rrLRrga3NN^A4@qDXZZP8yY@tLu#zLTCq zQ!dYosM~Wxw{HX4mWHH1Ktq=ji{b<&7_>!A^NSw9NaW$yJ;mYntgCNgWNTi0b<6Q` z+5Y`loTHb2-Kaz)AVY2$$QnOgT5jmO6J{H_QqtBg$GR5mFlV42#B6uFK(PD%k7G1k zvKXYcZU2&*OgMieB6ZK9&1KNmP4$+^S8Gs|5e^%W!4^YyUOl#0J?t(kpzEkNpE^HL z%NLI z^eUAaBqW-Uga=tmNt|*JCp`mp9w~)yL!GKw%JS&JfJO>OjA)XJy0ra~w`-cZoV|r` zCeW+nu3jaeFf*gN0p}6i{kplWypuNN~iMr81s-ri8X#8&>DHUkQJ&?3n1 zvL@kW@HW+NA8LDS(#8#kzL?tKzAKP4rw}f%L)YiNnkcq+mwyL7of4b838Y_+N+<3k z76A){Li4)|^h&(b?>^V&x;BOqA3a6m$TuA_OD$u}RWN#gVUg49Mnop^1WJC0cD7%I zKTCV<&H-PVBPH^t0lT}j>a*m}e@gw`8a+=M7raIH&HRY3pRf6X zTA^w1nU3kswkn1pAU|r`27a6h$L?c4f~eGM7pn4_A0dMIdQwTsjS`XD5_oT@K5bRzbh#xtsrY+- z{|r464s~GD|LhZM<}=;cTruff4=jViObVNK^nb4q;i_a+eT3~VW_<>|^%*pQj?zlPPFzwYDo5$a_; z@x{Dd1Q9o1V}M=e8|Jg}StrQ$%RPzx=VorYZRD=eea)1vnq9);VqG$>6uspZ*|B!?Zo}>GJ5YRd@g*J; zK#%?F8aq2W*3`j4oxZ3(i^{@?UO(ZvU(a{cujN+a%MPt|+=fP^?E=^^!s)i0*cqP# zDN2fkh>pFRA#@}xM+;8DBUyvjkP`}$RG1vtO6}s zF^lST8+VOXB0XQq?54h{+Yc1-{eH2Pl5H`Sj5%-SI=(Q!#%g2rV0ZmXgTTB!ZpGze zU%AIe77#A-$(=H}J7tZ(JhF-}R~g{{Ip2gXWIW%}@|zo;RPUdC)?@6wT#PLFmgWzN zCRG9hD1O0wHb5^GhJ$B!nKhoP`)GalfiE~T;K+S}#kySr$nWo;84 zxwv{o+)+!!@Wk^DUW>Wv;CZ+8`RP}MX}fNkk`;+9C{GbV`A6dNq^sd(HvIO{V?kbh z*=KL^PQ{!N{%Jpk1 zBdHc?b6p<`o+%wod>Iy4zN$d-f2dcc3eu>8YACyo-*H9U&wpd#_8pkozfbvfZ@o^Q zjT01l2N)34xq*9So$$)SZ3>m`Vn+>WpAGU_i|kgJvt7L2onanIvNf zyfikfSm%A8S9X*N4by#wKdfZq>hAyO#tj$tG7X&J#R_j5~@8&19e=p_itv_Do4htI60CO)M}H%$BsOOisidrW8>yj$;A z_d+AH{@M9mR*|0!c8U*;+B_*T-hW@vfxsLN%lNXjxwM0kuKM5!>b(i;yIEQ-q(32s zWCu~_v>wRt-woY_(LfcN$Ql5x>h{|P{I1#;eUxf7?xWN57e+hB|D= za}>8fCA*lsuW7TQdiH9*rM|}dnn7%90g4-*GTcj24vxmYt(%&^d>D1NOk=i7>)VeL z`oHW8`2P!D-(M1ii=w(1%Uynm%WFoLr|!g68myVxA;`nxlbsuTSzu k8KZ+*82+8Te!C(Th!|NFUtY{5dZ)H literal 13645 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 diff --git a/tests_zemu/snapshots/x-mainmenu/00004.png b/tests_zemu/snapshots/x-mainmenu/00004.png index 0678a63aeb012020b002f809b1d2d772e7693d87..b43e129ce457a124b5232000f714f0ada417fc19 100644 GIT binary patch delta 319 zcmaFGbc<<%O1+||i(^Q|oVPcl`I;33S`%-VsK2TAe6y5arG@A5g(KYTzw7gpa?eOg zif-p+K!BJ>roUO%%qg~?5oGnF-TmLgp!qk|6SjJGrk8W=WD5BklHnfYm3H~BZ~dAm z%Tn%u87a4a+={hKFAukVWVZdK3wOe!vd!E~vGps;_omNpcs$*Et6NS`+3h}~qf8=& z-ktn0k8bJba2uWdQulR}>GsQ)j@+)!+&F9zl!bNI-X9qUV zeBorw>$Hq*`m4uNqj~QN>pVO1+J<|t==#JROb`1`oXa_Co+vymr_BFZ+|GBa^Y?hy zvvqJaEoOb_W3lKy^Q-TZkK6C<5Ly4%!D)#(U{s$IDq0vXwQn$a=2-a~h z&DZ?Q?R@6%scj0EecoSRw)UshTHihY_1^LyKRr2x`&Osb%7 diff --git a/tests_zemu/snapshots/x-mainmenu/00010.png b/tests_zemu/snapshots/x-mainmenu/00010.png index 0678a63aeb012020b002f809b1d2d772e7693d87..b43e129ce457a124b5232000f714f0ada417fc19 100644 GIT binary patch delta 319 zcmaFGbc<<%O1+||i(^Q|oVPcl`I;33S`%-VsK2TAe6y5arG@A5g(KYTzw7gpa?eOg zif-p+K!BJ>roUO%%qg~?5oGnF-TmLgp!qk|6SjJGrk8W=WD5BklHnfYm3H~BZ~dAm z%Tn%u87a4a+={hKFAukVWVZdK3wOe!vd!E~vGps;_omNpcs$*Et6NS`+3h}~qf8=& z-ktn0k8bJba2uWdQulR}>GsQ)j@+)!+&F9zl!bNI-X9qUV zeBorw>$Hq*`m4uNqj~QN>pVO1+J<|t==#JROb`1`oXa_Co+vymr_BFZ+|GBa^Y?hy zvvqJaEoOb_W3lKy^Q-TZkK6C<5Ly4%!D)#(U{s$IDq0vXwQn$a=2-a~h z&DZ?Q?R@6%scj0EecoSRw)UshTHihY_1^LyKRr2x`&Osb%7 From e5927a0a62660e0464d2b18405814d2a0399701b Mon Sep 17 00:00:00 2001 From: becominginsane Date: Sun, 12 Nov 2023 15:15:14 +0800 Subject: [PATCH 13/24] fix(zcashtool): ovk: (string | null) fix(zcashtools): path as array (not byte array) fix(tests): remove `addon` destructure deps(tests): upgrade jest version --- tests_zemu/jest.config.js | 1 + tests_zemu/package.json | 4 ++-- tests_zemu/tests/vectors.ts | 14 ++++++++++---- tests_zemu/tests/zcashtool.test.ts | 10 +++------- zcashtools/neon/build/native.d.ts | 12 +++++++----- zcashtools/neon/lib/native.ts | 15 ++++++++++----- 6 files changed, 33 insertions(+), 23 deletions(-) diff --git a/tests_zemu/jest.config.js b/tests_zemu/jest.config.js index c4a20eb0..536b042a 100644 --- a/tests_zemu/jest.config.js +++ b/tests_zemu/jest.config.js @@ -2,4 +2,5 @@ module.exports = { preset: 'ts-jest', testEnvironment: 'node', transformIgnorePatterns: ['^.+\\.js$'], + reporters: ['default', ['summary', { summaryThreshold: 1 }]], } diff --git a/tests_zemu/package.json b/tests_zemu/package.json index 406dd54b..32389713 100644 --- a/tests_zemu/package.json +++ b/tests_zemu/package.json @@ -32,10 +32,10 @@ "eslint-plugin-import": "^2.26.0", "eslint-plugin-jest": "^26.5.3", "eslint-plugin-prettier": "^4.0.0", - "jest": "28.1.1", + "jest": "^29.5.0", "jest-serial-runner": "^1.2.0", "prettier": "^2.6.2", - "ts-jest": "^28.0.4", + "ts-jest": "^29.0.5", "ts-node": "^10.9.1", "typescript": "^4.7.3" } diff --git a/tests_zemu/tests/vectors.ts b/tests_zemu/tests/vectors.ts index 7b3513cb..979cb8c6 100644 --- a/tests_zemu/tests/vectors.ts +++ b/tests_zemu/tests/vectors.ts @@ -20,6 +20,7 @@ const zero: TxInputData = { address: '15eae700e01e24e2137d554d67bb0da64eee0bf1c2c392c5f1173a979baeb899663808cd22ed8df27566cc', value: 55000, memo_type: 0xf6, + ovk: null, }, { address: 'c69e979c6763c1b09238dc6bd5dcbf35360df95dcadf8c0fa25dcbedaaf6057538b812d06656726ea27667', @@ -33,7 +34,7 @@ const zero: TxInputData = { const one: TxInputData = { t_in: [ { - path: Uint32Array.from([44 + 0x80000000, 133 + 0x80000000, 5 + 0x80000000, 0, 0]), + path: [44 + 0x80000000, 133 + 0x80000000, 5 + 0x80000000, 0, 0], address: '1976a9140f71709c4b828df00f93d20aa2c34ae987195b3388ac', value: 60000, }, @@ -51,6 +52,7 @@ const one: TxInputData = { address: '15eae700e01e24e2137d554d67bb0da64eee0bf1c2c392c5f1173a979baeb899663808cd22ed8df27566cc', value: 65000, memo_type: 0xf6, + ovk: null, }, { address: 'c69e979c6763c1b09238dc6bd5dcbf35360df95dcadf8c0fa25dcbedaaf6057538b812d06656726ea27667', @@ -81,6 +83,7 @@ const two: TxInputData = { address: '15eae700e01e24e2137d554d67bb0da64eee0bf1c2c392c5f1173a979baeb899663808cd22ed8df27566cc', value: 55000, memo_type: 0xf6, + ovk: null, }, { address: 'c69e979c6763c1b09238dc6bd5dcbf35360df95dcadf8c0fa25dcbedaaf6057538b812d06656726ea27667', @@ -94,7 +97,7 @@ const two: TxInputData = { const three: TxInputData = { t_in: [ { - path: Uint32Array.from([44 + 0x80000000, 133 + 0x80000000, 5 + 0x80000000, 0, 0]), + path: [44 + 0x80000000, 133 + 0x80000000, 5 + 0x80000000, 0, 0], address: '1976a9140f71709c4b828df00f93d20aa2c34ae987195b3388ac', value: 60000, }, @@ -117,6 +120,7 @@ const three: TxInputData = { address: '15eae700e01e24e2137d554d67bb0da64eee0bf1c2c392c5f1173a979baeb899663808cd22ed8df27566cc', value: 55000, memo_type: 0xf6, + ovk: null, }, { address: 'c69e979c6763c1b09238dc6bd5dcbf35360df95dcadf8c0fa25dcbedaaf6057538b812d06656726ea27667', @@ -130,12 +134,12 @@ const three: TxInputData = { const four: TxInputData = { t_in: [ { - path: Uint32Array.from([44 + 0x80000000, 133 + 0x80000000, 5 + 0x80000000, 0, 0]), + path: [44 + 0x80000000, 133 + 0x80000000, 5 + 0x80000000, 0, 0], address: '1976a9140f71709c4b828df00f93d20aa2c34ae987195b3388ac', value: 50000, }, { - path: Uint32Array.from([44 + 0x80000000, 133 + 0x80000000, 5 + 0x80000000, 0, 0]), + path: [44 + 0x80000000, 133 + 0x80000000, 5 + 0x80000000, 0, 0], address: '1976a9140f71709c4b828df00f93d20aa2c34ae987195b3388ac', value: 50000, }, @@ -174,11 +178,13 @@ const five: TxInputData = { address: '15eae700e01e24e2137d554d67bb0da64eee0bf1c2c392c5f1173a979baeb899663808cd22ed8df27566cc', value: 55000, memo_type: 0xf6, + ovk: null, }, { address: 'c69e979c6763c1b09238dc6bd5dcbf35360df95dcadf8c0fa25dcbedaaf6057538b812d06656726ea27667', value: 100000 - 1000 - 55000, memo_type: 0xf6, + ovk: null, }, ], } diff --git a/tests_zemu/tests/zcashtool.test.ts b/tests_zemu/tests/zcashtool.test.ts index eb8848fa..4bbc28b5 100644 --- a/tests_zemu/tests/zcashtool.test.ts +++ b/tests_zemu/tests/zcashtool.test.ts @@ -776,7 +776,6 @@ describe('End to end transactions', function () { await sim.start({ ...defaultOptions, model: m.name }) const app = new ZCashApp(sim.getTransport()) - const { ZcashBuilderBridge } = addon console.log(SPEND_PATH) const builder = new ZcashBuilderBridge(1000) @@ -1030,7 +1029,6 @@ describe('End to end transactions', function () { await sim.start({ ...defaultOptions, model: m.name }) const app = new ZCashApp(sim.getTransport()) - const { ZcashBuilderBridge } = addon console.log(SPEND_PATH) const builder = new ZcashBuilderBridge(1000) @@ -1306,7 +1304,6 @@ describe('End to end transactions', function () { await sim.start({ ...defaultOptions, model: m.name }) const app = new ZCashApp(sim.getTransport()) - const { ZcashBuilderBridge } = addon console.log(SPEND_PATH) const builder = new ZcashBuilderBridge(1000) @@ -1555,7 +1552,6 @@ describe('Failing transactions', function () { await sim.start({ ...defaultOptions, model: m.name }) const app = new ZCashApp(sim.getTransport()) - const { ZcashBuilderBridge } = addon console.log(SPEND_PATH) const builder = new ZcashBuilderBridge(1000) @@ -1802,7 +1798,6 @@ describe('Failing transactions', function () { await sim.start({ ...defaultOptions, model: m.name }) const app = new ZCashApp(sim.getTransport()) - const { ZcashBuilderBridge } = addon console.log(SPEND_PATH) const builder = new ZcashBuilderBridge(1000) @@ -1954,6 +1949,7 @@ describe('Failing transactions', function () { const outj1 = { rcv: req4.rcv_raw, rseed: req4.rseed_raw, + ovk: null, address: s_out1.address, value: s_out1.value, memo: '0000', @@ -2023,7 +2019,6 @@ describe('Failing transactions', function () { await sim.start({ ...defaultOptions, model: m.name }) const app = new ZCashApp(sim.getTransport()) - const { ZcashBuilderBridge } = addon console.log(SPEND_PATH) const builder = new ZcashBuilderBridge(1000) @@ -2199,6 +2194,7 @@ describe('Failing transactions', function () { const outj1 = { rcv: req4.rcv_raw, rseed: req4.rseed_raw, + ovk: null, address: s_out1.address, value: s_out1.value, memo: '0000', @@ -2280,7 +2276,7 @@ describe('Failing transactions', function () { */ //use stringify+parse for deep copy - const tx_input_data = JSON.parse(JSON.stringify(TX_INPUT_DATA[3])) + const tx_input_data = TX_INPUT_DATA[3] tx_input_data.s_output[1].value -= 9000 //extra fee over base 1000 const { t_in: [tin1], diff --git a/zcashtools/neon/build/native.d.ts b/zcashtools/neon/build/native.d.ts index fe97262d..677adb6b 100644 --- a/zcashtools/neon/build/native.d.ts +++ b/zcashtools/neon/build/native.d.ts @@ -1,6 +1,8 @@ /// +type GrowToSize = A['length'] extends N ? A : GrowToSize; +export type FixedArray = GrowToSize; export interface TinData { - path: Uint32Array; + path: FixedArray; address: string; value: number; } @@ -17,7 +19,7 @@ export interface ShieldedOutputData { address: string; value: number; memo_type: number; - ovk?: string; + ovk: string | null; } export interface InitData { t_in: TinData[]; @@ -50,11 +52,11 @@ export interface SpendInfo { export interface OutputInfo { rcv: string; rseed: string; - ovk?: string; + ovk: string | null; address: string; value: number; - memo?: string; - hash_seed?: Uint8Array; + memo: string | null; + hash_seed: Uint8Array | null; } export interface TransactionSignatures { transparent_sigs: string[]; diff --git a/zcashtools/neon/lib/native.ts b/zcashtools/neon/lib/native.ts index b89ec4b4..0d033fc8 100644 --- a/zcashtools/neon/lib/native.ts +++ b/zcashtools/neon/lib/native.ts @@ -1,5 +1,10 @@ +type GrowToSize = + A['length'] extends N ? A : GrowToSize; + +export type FixedArray = GrowToSize; + export interface TinData { - path: Uint32Array; + path: FixedArray; address: string, value: number, } @@ -19,7 +24,7 @@ export interface ShieldedOutputData { address: string, value: number, memo_type: number, - ovk?: string, + ovk: string | null, } export interface InitData { @@ -58,11 +63,11 @@ export interface SpendInfo { export interface OutputInfo { rcv: string, rseed: string, - ovk?: string, + ovk: string | null, address: string, value: number, - memo?: string, - hash_seed?: Uint8Array, + memo: string | null, + hash_seed: Uint8Array | null, } export interface TransactionSignatures { From 0575f14298b9b20764c2b05009e9efc2a868fb39 Mon Sep 17 00:00:00 2001 From: becominginsane Date: Sun, 12 Nov 2023 20:04:32 +0800 Subject: [PATCH 14/24] fix(tests): deepcopy for txfee 10000 --- tests_zemu/tests/zcashtool.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests_zemu/tests/zcashtool.test.ts b/tests_zemu/tests/zcashtool.test.ts index 4bbc28b5..cc5f6a7e 100644 --- a/tests_zemu/tests/zcashtool.test.ts +++ b/tests_zemu/tests/zcashtool.test.ts @@ -2276,7 +2276,7 @@ describe('Failing transactions', function () { */ //use stringify+parse for deep copy - const tx_input_data = TX_INPUT_DATA[3] + const tx_input_data = JSON.parse(JSON.stringify(TX_INPUT_DATA[3])) tx_input_data.s_output[1].value -= 9000 //extra fee over base 1000 const { t_in: [tin1], From 9e7afdf8d9e910f3ec450a32b518c49fb2bebd31 Mon Sep 17 00:00:00 2001 From: becominginsane Date: Tue, 14 Nov 2023 11:33:13 +0800 Subject: [PATCH 15/24] deps(zcashtools): update style(zcashtools): formatting --- zcashtools/Cargo.lock | 53 ++++---- zcashtools/neon/native/Cargo.toml | 17 ++- zcashtools/neon/native/src/lib.rs | 203 +++++++++++++++--------------- 3 files changed, 137 insertions(+), 136 deletions(-) diff --git a/zcashtools/Cargo.lock b/zcashtools/Cargo.lock index d8d9aa70..881caa4f 100644 --- a/zcashtools/Cargo.lock +++ b/zcashtools/Cargo.lock @@ -64,7 +64,7 @@ checksum = "79fa67157abdfd688a259b6648808757db9347af834624f27ec646da976aee5d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.23", + "syn 2.0.32", ] [[package]] @@ -457,7 +457,7 @@ dependencies = [ "num-traits", "proc-macro2", "quote", - "syn 2.0.23", + "syn 2.0.32", ] [[package]] @@ -673,7 +673,7 @@ dependencies = [ [[package]] name = "ledger-zcash" version = "0.6.0" -source = "git+https://github.com/Zondax/ledger-zcash-rs?branch=ledger-v5#ca26e7471bdbaca65ace50f4fb50776fc61f07b1" +source = "git+https://github.com/Zondax/ledger-zcash-rs?rev=5585ccc6cdc9d1b6ef2fb5ad27c6bf7d1c170bb2#5585ccc6cdc9d1b6ef2fb5ad27c6bf7d1c170bb2" dependencies = [ "arrayvec 0.7.4", "byteorder", @@ -735,9 +735,9 @@ checksum = "f7012b1bbb0719e1097c47611d3898568c546d597c2e74d66f6087edd5233ff4" [[package]] name = "log" -version = "0.4.19" +version = "0.4.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b06a4cde4c0f271a446782e3eff8de789548ce57dbc8eca9292c27f4a42004b4" +checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" [[package]] name = "memchr" @@ -1220,22 +1220,22 @@ checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" [[package]] name = "serde" -version = "1.0.166" +version = "1.0.192" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d01b7404f9d441d3ad40e6a636a7782c377d2abdbe4fa2440e2edcc2f4f10db8" +checksum = "bca2a08484b285dcb282d0f67b26cadc0df8b19f8c12502c13d966bf9482f001" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.166" +version = "1.0.192" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dd83d6dde2b6b2d466e14d9d1acce8816dedee94f735eac6395808b3483c6d6" +checksum = "d6c7207fbec9faa48073f3e3074cbe553af6ea512d7c21ba46e434e70ea9fbc1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.23", + "syn 2.0.32", ] [[package]] @@ -1259,9 +1259,9 @@ checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0" [[package]] name = "snafu" -version = "0.7.4" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb0656e7e3ffb70f6c39b3c2a86332bb74aa3c679da781642590f3c1118c5045" +checksum = "e4de37ad025c587a29e8f3f5605c00f70b98715ef90b9061a815b9e59e9042d6" dependencies = [ "backtrace", "doc-comment", @@ -1270,9 +1270,9 @@ dependencies = [ [[package]] name = "snafu-derive" -version = "0.7.4" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "475b3bbe5245c26f2d8a6f62d67c1f30eb9fffeccee721c45d162c3ebbdf81b2" +checksum = "990079665f075b699031e9c08fd3ab99be5029b96f3b78dc0709e8f77e4efebf" dependencies = [ "heck", "proc-macro2", @@ -1311,9 +1311,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.23" +version = "2.0.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59fb7d6d8281a51045d62b8eb3a7d1ce347b76f312af50cd3dc0af39c87c1737" +checksum = "239814284fd6f1a4ffe4ca893952cdd93c224b6a1571c9a9eadd670295c0c9e2" dependencies = [ "proc-macro2", "quote", @@ -1354,7 +1354,7 @@ checksum = "d14928354b01c4d6a4f0e549069adef399a284e7995c7ccca94e8a07a5346c59" dependencies = [ "proc-macro2", "quote", - "syn 2.0.23", + "syn 2.0.32", ] [[package]] @@ -1465,7 +1465,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.23", + "syn 2.0.32", "wasm-bindgen-shared", ] @@ -1487,7 +1487,7 @@ checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.23", + "syn 2.0.32", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -1542,7 +1542,7 @@ dependencies = [ [[package]] name = "zcash-hsmbuilder" version = "0.4.0" -source = "git+https://github.com/Zondax/ledger-zcash-rs?branch=ledger-v5#ca26e7471bdbaca65ace50f4fb50776fc61f07b1" +source = "git+https://github.com/Zondax/ledger-zcash-rs?rev=5585ccc6cdc9d1b6ef2fb5ad27c6bf7d1c170bb2#5585ccc6cdc9d1b6ef2fb5ad27c6bf7d1c170bb2" dependencies = [ "bellman", "blake2b_simd 1.0.1", @@ -1662,7 +1662,6 @@ dependencies = [ "serde_derive", "snafu", "zcash-hsmbuilder", - "zcash_primitives", ] [[package]] @@ -1682,7 +1681,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.23", + "syn 2.0.32", ] [[package]] @@ -1694,3 +1693,13 @@ dependencies = [ "byteorder", "thiserror", ] + +[[patch.unused]] +name = "ledger-zcash" +version = "0.6.0" +source = "git+https://github.com/Zondax/ledger-zcash-rs?branch=ledger-v5#ca26e7471bdbaca65ace50f4fb50776fc61f07b1" + +[[patch.unused]] +name = "zcash-hsmbuilder" +version = "0.4.0" +source = "git+https://github.com/Zondax/ledger-zcash-rs?branch=ledger-v5#ca26e7471bdbaca65ace50f4fb50776fc61f07b1" diff --git a/zcashtools/neon/native/Cargo.toml b/zcashtools/neon/native/Cargo.toml index d3cd2bbf..129bb03f 100644 --- a/zcashtools/neon/native/Cargo.toml +++ b/zcashtools/neon/native/Cargo.toml @@ -11,15 +11,14 @@ name = "zcashtool" crate-type = ["cdylib"] [dependencies] -neon = {version = "0.10.1", default-features = false, features =["napi-6"]} -rand_core = "0.6" -zcash-hsmbuilder = { git = "https://github.com/Zondax/ledger-zcash-rs" , branch = "ledger-v5"} -ledger-zcash = { git = "https://github.com/Zondax/ledger-zcash-rs" , branch = "ledger-v5"} +neon = { version = "0.10.1", default-features = false, features = ["napi-6"] } +rand_core = "0.6.4" +zcash-hsmbuilder = { git = "https://github.com/Zondax/ledger-zcash-rs" , rev = "5585ccc6cdc9d1b6ef2fb5ad27c6bf7d1c170bb2"} +ledger-zcash = { git = "https://github.com/Zondax/ledger-zcash-rs" , rev = "5585ccc6cdc9d1b6ef2fb5ad27c6bf7d1c170bb2"} neon-serde = { git = "https://github.com/Zondax/neon-serde" , branch = "refactor/napi", default-features = false, features =["napi-6"]} -serde_derive = "1.0.136" -serde = "1" -zcash_primitives = "0.6.0" -log = "0.4.17" +serde_derive = "1.0.192" +serde = "1.0.192" +log = "0.4.20" #activate snafu backtraces -snafu = { version = "0.7", features = ["backtraces"] } +snafu = { version = "0.7.5", features = ["backtraces"] } diff --git a/zcashtools/neon/native/src/lib.rs b/zcashtools/neon/native/src/lib.rs index 8b110601..4940560f 100644 --- a/zcashtools/neon/native/src/lib.rs +++ b/zcashtools/neon/native/src/lib.rs @@ -5,7 +5,9 @@ use std::path::Path; use ledger_zcash::zcash::primitives::consensus::TestNetwork; use ledger_zcash::zcash::primitives::{ consensus, - transaction::components::{sapling as sapling_ledger, transparent as transparent_ledger}, + transaction::components::{ + sapling as sapling_ledger, transparent as transparent_ledger, TxOut, + }, transaction::TxVersion, }; use rand_core::OsRng; @@ -16,8 +18,6 @@ use zcash_hsmbuilder::data::{ }; use zcash_hsmbuilder::errors::Error; use zcash_hsmbuilder::{hsmauth, txprover}; -use zcash_primitives; -use zcash_primitives::transaction::components::TxOut; // reference // https://neon-bindings.com/docs/primitives @@ -28,7 +28,8 @@ fn get_inittx_data(mut cx: FunctionContext) -> JsResult { // First get call arguments let arg0 = cx.argument::(0)?; //let arg0_value: InitData = neon_serde::from_value(&mut cx, arg0).throw(&mut cx)?; - let arg0_value: InitData = neon_serde::from_value(&mut cx, arg0).expect("Error getting arg0_value"); + let arg0_value: InitData = + neon_serde::from_value(&mut cx, arg0).expect("Error getting arg0_value"); let output = arg0_value.to_hsm_bytes(); let js_value; //js_value = neon_serde::to_value(&mut cx, &output).throw(&mut cx)?; @@ -45,14 +46,20 @@ pub enum AuthorisationStatus { ZcashBuilder::txbuilder::Builder< TestNetwork, OsRng, - hsmauth::MixedAuthorization, + hsmauth::MixedAuthorization< + transparent_ledger::Authorized, + hsmauth::sapling::Unauthorized, + >, >, ), SaplingAuthorized( ZcashBuilder::txbuilder::Builder< TestNetwork, OsRng, - hsmauth::MixedAuthorization, + hsmauth::MixedAuthorization< + hsmauth::transparent::Unauthorized, + sapling_ledger::Authorized, + >, >, ), Authorized( @@ -69,7 +76,7 @@ pub struct ZcashBuilderBridge { zcashbuilder: AuthorisationStatus, } -impl Finalize for ZcashBuilderBridge{} +impl Finalize for ZcashBuilderBridge {} // Internal implementation impl ZcashBuilderBridge { @@ -86,20 +93,14 @@ impl ZcashBuilderBridge { ); match res { Ok(()) => self.zcashbuilder = AuthorisationStatus::Unauthorized(builder), - Err(_) => () + Err(_) => (), } res } AuthorisationStatus::Authorized { .. } => return Err(Error::AlreadyAuthorized), - AuthorisationStatus::TransparentAuthorized { .. } => { - Err(Error::AlreadyAuthorized) - } - AuthorisationStatus::SaplingAuthorized { .. } => { - Err(Error::AlreadyAuthorized) - }, - AuthorisationStatus::Taken => { - Err(Error::UnknownAuthorization) - }, + AuthorisationStatus::TransparentAuthorized { .. } => Err(Error::AlreadyAuthorized), + AuthorisationStatus::SaplingAuthorized { .. } => Err(Error::AlreadyAuthorized), + AuthorisationStatus::Taken => Err(Error::UnknownAuthorization), } } @@ -109,28 +110,23 @@ impl ZcashBuilderBridge { ) -> Result<(), Error> { match std::mem::replace(&mut self.zcashbuilder, self::AuthorisationStatus::Taken) { AuthorisationStatus::Unauthorized(mut builder) => { - let res = builder - .add_transparent_output(input.address, input.value); + let res = builder.add_transparent_output(input.address, input.value); match res { Ok(()) => self.zcashbuilder = AuthorisationStatus::Unauthorized(builder), - Err(_) => () + Err(_) => (), } res } AuthorisationStatus::Authorized { .. } => Err(Error::AlreadyAuthorized), - AuthorisationStatus::TransparentAuthorized { .. } => { - Err(Error::AlreadyAuthorized) - } + AuthorisationStatus::TransparentAuthorized { .. } => Err(Error::AlreadyAuthorized), AuthorisationStatus::SaplingAuthorized { .. } => Err(Error::AlreadyAuthorized), - AuthorisationStatus::Taken => { - Err(Error::UnknownAuthorization) - }, + AuthorisationStatus::Taken => Err(Error::UnknownAuthorization), } } pub fn add_sapling_spend(&mut self, input: SpendBuilderInfo) -> Result<(), Error> { match std::mem::replace(&mut self.zcashbuilder, self::AuthorisationStatus::Taken) { - AuthorisationStatus::Unauthorized(mut builder)=> { + AuthorisationStatus::Unauthorized(mut builder) => { let div = *input.address.diversifier(); let pk_d = *input.address.pk_d(); let note = ledger_zcash::zcash::primitives::sapling::Note { @@ -149,24 +145,20 @@ impl ZcashBuilderBridge { ); match res { Ok(()) => self.zcashbuilder = AuthorisationStatus::Unauthorized(builder), - Err(_) => () + Err(_) => (), } res } AuthorisationStatus::Authorized { .. } => Err(Error::AlreadyAuthorized), - AuthorisationStatus::TransparentAuthorized { .. } => { - Err(Error::AlreadyAuthorized) - } + AuthorisationStatus::TransparentAuthorized { .. } => Err(Error::AlreadyAuthorized), AuthorisationStatus::SaplingAuthorized { .. } => Err(Error::AlreadyAuthorized), - AuthorisationStatus::Taken => { - Err(Error::UnknownAuthorization) - }, + AuthorisationStatus::Taken => Err(Error::UnknownAuthorization), } } pub fn add_sapling_output(&mut self, input: OutputBuilderInfo) -> Result<(), Error> { match std::mem::replace(&mut self.zcashbuilder, self::AuthorisationStatus::Taken) { - AuthorisationStatus::Unauthorized (mut builder) => { + AuthorisationStatus::Unauthorized(mut builder) => { let res = builder.add_sapling_output( input.ovk, input.address, @@ -178,22 +170,23 @@ impl ZcashBuilderBridge { ); match res { Ok(()) => self.zcashbuilder = AuthorisationStatus::Unauthorized(builder), - Err(_) => () + Err(_) => (), } res } AuthorisationStatus::Authorized { .. } => Err(Error::AlreadyAuthorized), - AuthorisationStatus::TransparentAuthorized { .. } => { - Err(Error::AlreadyAuthorized) - } + AuthorisationStatus::TransparentAuthorized { .. } => Err(Error::AlreadyAuthorized), AuthorisationStatus::SaplingAuthorized { .. } => Err(Error::AlreadyAuthorized), - AuthorisationStatus::Taken => { - Err(Error::UnknownAuthorization) - }, + AuthorisationStatus::Taken => Err(Error::UnknownAuthorization), } } - pub fn build(&mut self, spendpath: &String, outputpath: &String, tx_version: u8) -> Result { + pub fn build( + &mut self, + spendpath: &String, + outputpath: &String, + tx_version: u8, + ) -> Result { let tx_ver = match tx_version { 4 => Some(TxVersion::Sapling), 5 => Some(TxVersion::Zip225), @@ -201,32 +194,27 @@ impl ZcashBuilderBridge { }; log::info!("tx_ver is {:#?}", tx_ver); match std::mem::replace(&mut self.zcashbuilder, self::AuthorisationStatus::Taken) { - AuthorisationStatus::Unauthorized( mut builder) => { + AuthorisationStatus::Unauthorized(mut builder) => { let mut prover = txprover::LocalTxProver::new(Path::new(spendpath), Path::new(outputpath)); - let res = builder.build(consensus::BranchId::Nu5, tx_ver,&mut prover); + let res = builder.build(consensus::BranchId::Nu5, tx_ver, &mut prover); match res { Ok(_) => self.zcashbuilder = AuthorisationStatus::Unauthorized(builder), - Err(_) => () + Err(_) => (), } res } AuthorisationStatus::Authorized { .. } => Err(Error::AlreadyAuthorized), - AuthorisationStatus::TransparentAuthorized { .. } => { - Err(Error::AlreadyAuthorized) - } + AuthorisationStatus::TransparentAuthorized { .. } => Err(Error::AlreadyAuthorized), AuthorisationStatus::SaplingAuthorized { .. } => Err(Error::AlreadyAuthorized), - AuthorisationStatus::Taken => { - Err(Error::UnknownAuthorization) - }, + AuthorisationStatus::Taken => Err(Error::UnknownAuthorization), } } pub fn add_signatures(&mut self, input: TransactionSignatures) -> Result<(), Error> { match std::mem::replace(&mut self.zcashbuilder, self::AuthorisationStatus::Taken) { - AuthorisationStatus::Unauthorized (builder) => { - let builder_authorize_z = - builder.add_signatures_spend(input.spend_sigs); + AuthorisationStatus::Unauthorized(builder) => { + let builder_authorize_z = builder.add_signatures_spend(input.spend_sigs); if builder_authorize_z.is_err() { return Err(builder_authorize_z.err().unwrap()); } @@ -240,27 +228,19 @@ impl ZcashBuilderBridge { Ok(()) } AuthorisationStatus::Authorized { .. } => Err(Error::AlreadyAuthorized), - AuthorisationStatus::TransparentAuthorized { .. } => { - Err(Error::AlreadyAuthorized) - } + AuthorisationStatus::TransparentAuthorized { .. } => Err(Error::AlreadyAuthorized), AuthorisationStatus::SaplingAuthorized { .. } => Err(Error::AlreadyAuthorized), - AuthorisationStatus::Taken => { - Err(Error::UnknownAuthorization) - }, + AuthorisationStatus::Taken => Err(Error::UnknownAuthorization), } } pub fn finalize_builder(&mut self) -> Result, Error> { match std::mem::replace(&mut self.zcashbuilder, self::AuthorisationStatus::Taken) { - AuthorisationStatus::Authorized (mut builder) => { - builder.finalize_js() - } + AuthorisationStatus::Authorized(mut builder) => builder.finalize_js(), AuthorisationStatus::Unauthorized { .. } => Err(Error::Unauthorized), AuthorisationStatus::TransparentAuthorized { .. } => Err(Error::Unauthorized), AuthorisationStatus::SaplingAuthorized { .. } => Err(Error::Unauthorized), - AuthorisationStatus::Taken => { - Err(Error::UnknownAuthorization) - }, + AuthorisationStatus::Taken => Err(Error::UnknownAuthorization), } } } @@ -271,9 +251,7 @@ impl ZcashBuilderBridge { let f = cx.argument::(0)?.value(&mut cx); let zcashbuilder = ZcashBuilder::txbuilder::Builder::new_with_fee(TestNetwork, 0, f as u64); let zcashbuilder = AuthorisationStatus::Unauthorized(zcashbuilder); - let boxed_builder = RefCell::new(ZcashBuilderBridge { - zcashbuilder, - }); + let boxed_builder = RefCell::new(ZcashBuilderBridge { zcashbuilder }); Ok(cx.boxed(boxed_builder)) } @@ -285,7 +263,7 @@ impl ZcashBuilderBridge { { let this = cx.this().downcast_or_throw::(&mut cx)?; let this = &*(*this); - let mut this_handler = this.borrow_mut();//(&guard); + let mut this_handler = this.borrow_mut(); //(&guard); //grab input value = this_handler.add_transparent_input(arg0_value); @@ -297,9 +275,9 @@ impl ZcashBuilderBridge { } } - fn js_add_transparent_output(mut cx: FunctionContext)->JsResult{ + fn js_add_transparent_output(mut cx: FunctionContext) -> JsResult { let arg0 = cx.argument::(0)?; - let arg0_value :TransparentOutputBuilderInfo = neon_serde::from_value(&mut cx, arg0) + let arg0_value: TransparentOutputBuilderInfo = neon_serde::from_value(&mut cx, arg0) .expect("Failled to get arg0_value for transparent output builder"); let value; @@ -310,41 +288,41 @@ impl ZcashBuilderBridge { //let this = cx.argument::(0)?; //let guard = cx.lock(); let this = &*(*this); - let mut this_handler = this.borrow_mut();//(&guard); + let mut this_handler = this.borrow_mut(); //(&guard); //grab input value = this_handler.add_transparent_output(arg0_value); } - if value.is_ok(){ + if value.is_ok() { Ok(cx.boolean(true)) - }else{ + } else { cx.throw_error(value.err().unwrap().to_string()) } } - fn js_add_sapling_spend(mut cx: FunctionContext)->JsResult{ + fn js_add_sapling_spend(mut cx: FunctionContext) -> JsResult { let arg0 = cx.argument::(0)?; - let arg0_value :SpendBuilderInfo = neon_serde::from_value(&mut cx, arg0) + let arg0_value: SpendBuilderInfo = neon_serde::from_value(&mut cx, arg0) .expect("Failled to get arg0_value for sapling spend"); let value; { let this = cx.this().downcast_or_throw::(&mut cx)?; //let guard = cx.lock(); let this = &*(*this); - let mut this_handler = this.borrow_mut();//(&guard); + let mut this_handler = this.borrow_mut(); //(&guard); //grab input value = this_handler.add_sapling_spend(arg0_value); } - if value.is_ok(){ + if value.is_ok() { Ok(cx.boolean(true)) - }else{ + } else { cx.throw_error(value.err().unwrap().to_string()) } } - fn js_add_sapling_output(mut cx: FunctionContext)->JsResult{ + fn js_add_sapling_output(mut cx: FunctionContext) -> JsResult { let arg0 = cx.argument::(0)?; - let arg0_value :OutputBuilderInfo = neon_serde::from_value(&mut cx, arg0) + let arg0_value: OutputBuilderInfo = neon_serde::from_value(&mut cx, arg0) .expect("Failled to get arg0_value for sapling output"); let value; @@ -352,18 +330,18 @@ impl ZcashBuilderBridge { let this = cx.this().downcast_or_throw::(&mut cx)?; //let guard = cx.lock(); let this = &*(*this); - let mut this_handler = this.borrow_mut();//(&guard); + let mut this_handler = this.borrow_mut(); //(&guard); //grab input value = this_handler.add_sapling_output(arg0_value); } - if value.is_ok(){ + if value.is_ok() { Ok(cx.boolean(true)) - }else{ + } else { cx.throw_error(value.err().unwrap().to_string()) } } - fn js_build(mut cx: FunctionContext)->JsResult{ + fn js_build(mut cx: FunctionContext) -> JsResult { let spendpath: String = cx.argument::(0)?.value(&mut cx); let outputpath: String = cx.argument::(1)?.value(&mut cx); let tx_version = cx.argument::(2)?.value(&mut cx); @@ -372,24 +350,24 @@ impl ZcashBuilderBridge { let this = cx.this().downcast_or_throw::(&mut cx)?; //let guard = cx.lock(); let this = &*(*this); - let mut this_handler = this.borrow_mut();//(&guard); + let mut this_handler = this.borrow_mut(); //(&guard); //grab input value = this_handler.build(&spendpath, &outputpath, tx_version as u8); } - if value.is_ok(){ + if value.is_ok() { let js_value = neon_serde::to_value(&mut cx, &value.unwrap().to_hsm_bytes().unwrap()) .expect("Failed to get js_value for js_build"); Ok(js_value) - }else{ + } else { cx.throw_error(value.err().unwrap().to_string()) } } - fn js_add_signatures(mut cx: FunctionContext)->JsResult{ + fn js_add_signatures(mut cx: FunctionContext) -> JsResult { let arg0 = cx.argument::(0)?; - let arg0_value :TransactionSignatures = neon_serde::from_value(&mut cx, arg0) + let arg0_value: TransactionSignatures = neon_serde::from_value(&mut cx, arg0) .expect("Failed to get js_value for js_add_signatures"); let value; @@ -397,22 +375,22 @@ impl ZcashBuilderBridge { let this = cx.this().downcast_or_throw::(&mut cx)?; //let guard = cx.lock(); let this = &*(*this); - let mut this_handler = this.borrow_mut();//(&guard); + let mut this_handler = this.borrow_mut(); //(&guard); //grab input value = this_handler.add_signatures(arg0_value); } - if value.is_ok(){ + if value.is_ok() { Ok(cx.boolean(true)) - }else{ + } else { cx.throw_error(value.err().unwrap().to_string()) } } - fn js_finalize(mut cx: FunctionContext)->JsResult{ + fn js_finalize(mut cx: FunctionContext) -> JsResult { let this = cx.this().downcast_or_throw::(&mut cx)?; //let guard = cx.lock(); let this = &*(*this); - let mut this_handler = this.borrow_mut();//(&guard); + let mut this_handler = this.borrow_mut(); //(&guard); //grab input let value = this_handler.finalize_builder(); @@ -422,23 +400,38 @@ impl ZcashBuilderBridge { let js_value = neon_serde::to_value(&mut cx, &val) .expect("Failed to get js_value for js_afinalize"); Ok(js_value) - }, - Err(err)=> cx.throw_error(err.to_string()) + } + Err(err) => cx.throw_error(err.to_string()), } } - } +} #[neon::main] fn main(mut cx: ModuleContext) -> NeonResult<()> { //cx.export_class::("zcashtools")?; cx.export_function("get_inittx_data", get_inittx_data)?; cx.export_function("builderNew", ZcashBuilderBridge::js_create_builder)?; - cx.export_function("builderAddTransparentInput", ZcashBuilderBridge::js_add_transparent_input)?; - cx.export_function("builderAddTransparentOutput", ZcashBuilderBridge::js_add_transparent_output)?; - cx.export_function("builderAddSaplingSpend", ZcashBuilderBridge::js_add_sapling_spend)?; - cx.export_function("builderAddSaplingOutput", ZcashBuilderBridge::js_add_sapling_output)?; + cx.export_function( + "builderAddTransparentInput", + ZcashBuilderBridge::js_add_transparent_input, + )?; + cx.export_function( + "builderAddTransparentOutput", + ZcashBuilderBridge::js_add_transparent_output, + )?; + cx.export_function( + "builderAddSaplingSpend", + ZcashBuilderBridge::js_add_sapling_spend, + )?; + cx.export_function( + "builderAddSaplingOutput", + ZcashBuilderBridge::js_add_sapling_output, + )?; cx.export_function("builderBuild", ZcashBuilderBridge::js_build)?; - cx.export_function("builderAddSignatures", ZcashBuilderBridge::js_add_signatures)?; + cx.export_function( + "builderAddSignatures", + ZcashBuilderBridge::js_add_signatures, + )?; cx.export_function("builderFinalize", ZcashBuilderBridge::js_finalize)?; Ok(()) From f5b5f79d3a9c768ffbfa632613f6f0501cdc4462 Mon Sep 17 00:00:00 2001 From: becominginsane Date: Tue, 14 Nov 2023 11:33:28 +0800 Subject: [PATCH 16/24] feat(zcashtools): `calculate_zip0317_fee` --- zcashtools/neon/native/src/lib.rs | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/zcashtools/neon/native/src/lib.rs b/zcashtools/neon/native/src/lib.rs index 4940560f..5d0ad65f 100644 --- a/zcashtools/neon/native/src/lib.rs +++ b/zcashtools/neon/native/src/lib.rs @@ -37,6 +37,20 @@ fn get_inittx_data(mut cx: FunctionContext) -> JsResult { Ok(js_value) } +fn calculate_zip0317_fee(mut cx: FunctionContext) -> JsResult { + let [n_tin, n_tout, n_spend, n_sout] = [ + cx.argument::(0)?.value(&mut cx) as usize, + cx.argument::(1)?.value(&mut cx) as _, + cx.argument::(2)?.value(&mut cx) as _, + cx.argument::(3)?.value(&mut cx) as _, + ]; + + let fee: u64 = + ledger_zcash::builder::Builder::calculate_zip0317_fee(n_tin, n_tout, n_spend, n_sout) + .into(); + + Ok(cx.number(fee as f64)) +} type BoxedBuilder = JsBox>; @@ -410,6 +424,8 @@ impl ZcashBuilderBridge { fn main(mut cx: ModuleContext) -> NeonResult<()> { //cx.export_class::("zcashtools")?; cx.export_function("get_inittx_data", get_inittx_data)?; + cx.export_function("calculate_zip317_fee", calculate_zip0317_fee)?; + cx.export_function("builderNew", ZcashBuilderBridge::js_create_builder)?; cx.export_function( "builderAddTransparentInput", From 5bea88648708b856328a3d9c9ebbd4160b4efafb Mon Sep 17 00:00:00 2001 From: becominginsane Date: Tue, 14 Nov 2023 11:40:59 +0800 Subject: [PATCH 17/24] feat(zcashtools:ts): `calculate_fee` --- zcashtools/neon/lib/index.ts | 4 ++++ zcashtools/neon/lib/native.ts | 2 ++ 2 files changed, 6 insertions(+) diff --git a/zcashtools/neon/lib/index.ts b/zcashtools/neon/lib/index.ts index c2b08bb7..67252480 100644 --- a/zcashtools/neon/lib/index.ts +++ b/zcashtools/neon/lib/index.ts @@ -5,6 +5,10 @@ import addon, { OutputInfo, SpendInfo, TransactionSignatures, TransparentInputIn export type { InitData } from './native' export const get_inittx_data = addon.get_inittx_data; +export function calculate_fee(n_tin = 0, n_tout = 0, n_spend = 0, n_sout = 0): number { + return addon.calculate_zip317_fee(n_tin, n_tout, n_spend, n_sout); +} + export var SPEND_PATH = resolve("../params/sapling-spend.params"); export var OUTPUT_PATH = resolve("../params/sapling-output.params"); diff --git a/zcashtools/neon/lib/native.ts b/zcashtools/neon/lib/native.ts index 0d033fc8..87ef9d81 100644 --- a/zcashtools/neon/lib/native.ts +++ b/zcashtools/neon/lib/native.ts @@ -78,6 +78,8 @@ export interface TransactionSignatures { interface NativeModule { get_inittx_data(_: InitData): Buffer; + calculate_zip317_fee(n_tin: number, n_tout: number, n_spend: number, n_sout: number): number + builderNew(fee: number): ZcashBuilder; builderAddTransparentInput(this: ZcashBuilder, tin: TransparentInputInfo): boolean; From 0d0895121eb0011f412ba26f82311eb042ee5dae Mon Sep 17 00:00:00 2001 From: becominginsane Date: Tue, 14 Nov 2023 12:29:52 +0800 Subject: [PATCH 18/24] feat(zcashtools:ts): add `calculate_fee` tests(zcashtools): adjust vectors with fee --- tests_zemu/tests/vectors.ts | 23 ++++++-- tests_zemu/tests/zcashtool.test.ts | 95 +++++++----------------------- zcashtools/neon/build/index.d.ts | 1 + zcashtools/neon/build/index.js | 6 +- zcashtools/neon/build/native.d.ts | 1 + 5 files changed, 46 insertions(+), 80 deletions(-) diff --git a/tests_zemu/tests/vectors.ts b/tests_zemu/tests/vectors.ts index 979cb8c6..8ed2b5af 100644 --- a/tests_zemu/tests/vectors.ts +++ b/tests_zemu/tests/vectors.ts @@ -1,4 +1,9 @@ import type { InitData as TxInputData } from '@zondax/zcashtools' +import { calculate_fee } from '@zondax/zcashtools' + +export const fee_for = (input: TxInputData) => { + return calculate_fee(input.t_in.length, input.t_out.length, input.s_spend.length, input.s_output.length) +} const zero: TxInputData = { t_in: [], @@ -24,12 +29,13 @@ const zero: TxInputData = { }, { address: 'c69e979c6763c1b09238dc6bd5dcbf35360df95dcadf8c0fa25dcbedaaf6057538b812d06656726ea27667', - value: 100000 - 1000 - 55000, + value: 100000 - 55000, memo_type: 0xf6, ovk: '6fc01eaa665e03a53c1e033ed0d77b670cf075ede4ada769997a2ed2ec225fca', }, ], } +zero.s_output[1].value -= fee_for(zero) const one: TxInputData = { t_in: [ @@ -56,12 +62,13 @@ const one: TxInputData = { }, { address: 'c69e979c6763c1b09238dc6bd5dcbf35360df95dcadf8c0fa25dcbedaaf6057538b812d06656726ea27667', - value: 100000 - 1000 - 55000 - 10000, + value: 60000 + 40000 - 65000, memo_type: 0xf6, ovk: '6fc01eaa665e03a53c1e033ed0d77b670cf075ede4ada769997a2ed2ec225fca', }, ], } +one.s_output[1].value -= fee_for(one) const two: TxInputData = { t_in: [], @@ -87,12 +94,13 @@ const two: TxInputData = { }, { address: 'c69e979c6763c1b09238dc6bd5dcbf35360df95dcadf8c0fa25dcbedaaf6057538b812d06656726ea27667', - value: 100000 - 1000 - 55000 - 10000, + value: 100000 - 55000 - 10000, memo_type: 0xf6, ovk: '6fc01eaa665e03a53c1e033ed0d77b670cf075ede4ada769997a2ed2ec225fca', }, ], } +two.s_output[1].value -= fee_for(two) const three: TxInputData = { t_in: [ @@ -124,12 +132,13 @@ const three: TxInputData = { }, { address: 'c69e979c6763c1b09238dc6bd5dcbf35360df95dcadf8c0fa25dcbedaaf6057538b812d06656726ea27667', - value: 100000 - 1000 - 55000 - 10000, + value: 60000 + 40000 - 55000, memo_type: 0xf6, ovk: '6fc01eaa665e03a53c1e033ed0d77b670cf075ede4ada769997a2ed2ec225fca', }, ], } +three.s_output[1].value -= fee_for(three) const four: TxInputData = { t_in: [ @@ -151,12 +160,13 @@ const four: TxInputData = { }, { address: '1976a9140f71709c4b828df00f93d20aa2c34ae987195b3388ac', - value: 100000 - 1000 - 10000, + value: 50000 + 50000 - 10000, }, ], s_spend: [], s_output: [], } +four.t_out[1].value -= fee_for(four) const five: TxInputData = { t_in: [], @@ -182,11 +192,12 @@ const five: TxInputData = { }, { address: 'c69e979c6763c1b09238dc6bd5dcbf35360df95dcadf8c0fa25dcbedaaf6057538b812d06656726ea27667', - value: 100000 - 1000 - 55000, + value: 50000 + 50000 - 55000, memo_type: 0xf6, ovk: null, }, ], } +five.s_output[1].value -= fee_for(five) export const TX_INPUT_DATA: TxInputData[] = [zero, one, two, three, four, five] diff --git a/tests_zemu/tests/zcashtool.test.ts b/tests_zemu/tests/zcashtool.test.ts index cc5f6a7e..15d3f9e3 100644 --- a/tests_zemu/tests/zcashtool.test.ts +++ b/tests_zemu/tests/zcashtool.test.ts @@ -18,7 +18,7 @@ import Zemu, { ButtonKind, DEFAULT_START_OPTIONS } from '@zondax/zemu' import ZCashApp from '@zondax/ledger-zcash' import { APP_SEED, models } from './common' import { get_inittx_data, ZcashBuilderBridge, SPEND_PATH, OUTPUT_PATH } from '@zondax/zcashtools' -import { TX_INPUT_DATA } from './vectors' +import { fee_for, TX_INPUT_DATA } from './vectors' const crypto = require('crypto') const tx_version = 0x05 @@ -246,14 +246,11 @@ describe('End to end transactions', function () { console.log(SPEND_PATH) - // here 1000 represents the fee - const builder = new ZcashBuilderBridge(1000) - /* In this test, Alice wants to send 55000 ZEC to Bob. For this she needs two notes of 50000 ZEC sent to her address belonging to path: 1000. The inputs to the initialization is therefore two spend notes and two output notes. - She takes a transaction fee of 1000. + She takes a transaction fee according to ZIP-0317. All this info is gathered from the UI and put in the correct jsons. */ @@ -263,6 +260,8 @@ describe('End to end transactions', function () { s_output: [s_out1, s_out2], } = tx_input_data + const builder = new ZcashBuilderBridge(fee_for(tx_input_data)) + /* The inputs to the get_inittx_data function are the inputs to the transaction. The output is a blob that can be sent to the ledger device. @@ -514,8 +513,6 @@ describe('End to end transactions', function () { console.log(SPEND_PATH) - const builder = new ZcashBuilderBridge(1000) - /* In this test, Alice wants to send 55000 ZEC to Bob shielded and 10000 ZEC to Charlie transparent. For this she needs one notes of 40000 ZEC sent to her address belonging to path: 1000. @@ -523,7 +520,7 @@ describe('End to end transactions', function () { The inputs to the initialization is therefore: - one transparent input and one transparent output - one shielded spend notes and two shielded output notes. - She takes a transaction fee of 10000 and all leftovers is sent shielded to her own address. + She takes a transaction fee accorind to ZIP-0317 and all leftovers is sent shielded to her own address. All this info is gathered from the UI and put in the correct jsons. */ @@ -533,6 +530,7 @@ describe('End to end transactions', function () { s_spend: [s_spend1], s_output: [s_out1, s_out2], } = tx_input_data + const builder = new ZcashBuilderBridge(fee_for(tx_input_data)) /* The inputs to the get_inittx_data function are the inputs to the transaction. @@ -778,8 +776,6 @@ describe('End to end transactions', function () { console.log(SPEND_PATH) - const builder = new ZcashBuilderBridge(1000) - /* In this test, Alice wants to send 55000 ZEC to Bob shielded and 10000 ZEC to Charlie transparent. For this she needs one notes of 40000 ZEC sent to her address belonging to path: 1000. @@ -787,7 +783,7 @@ describe('End to end transactions', function () { The inputs to the initialization is therefore: - one transparent input and one transparent output - one shielded spend notes and two shielded output notes. - She takes a transaction fee of 10000 and all leftovers is sent shielded to her own address. + She takes a transaction fee accorind to ZIP-0317 and all leftovers is sent shielded to her own address. All this info is gathered from the UI and put in the correct jsons. */ @@ -799,6 +795,7 @@ describe('End to end transactions', function () { s_spend: [s_spend1], s_output: [s_out1, s_out2], } = tx_input_data + const builder = new ZcashBuilderBridge(fee_for(tx_input_data)) /* The inputs to the get_inittx_data function are the inputs to the transaction. @@ -1031,8 +1028,6 @@ describe('End to end transactions', function () { console.log(SPEND_PATH) - const builder = new ZcashBuilderBridge(1000) - /* In this test, Alice wants to send 55000 ZEC to Bob shielded and 10000 ZEC to Charlie transparent. For this she needs one notes of 40000 ZEC sent to her address belonging to path: 1000. @@ -1040,7 +1035,7 @@ describe('End to end transactions', function () { The inputs to the initialization is therefore: - one transparent input and one transparent output - one shielded spend notes and two shielded output notes. - She takes a transaction fee of 10000 and all leftovers is sent shielded to her own address. + She takes a transaction fee according to ZIP-0317 and all leftovers is sent shielded to her own address. All this info is gathered from the UI and put in the correct jsons. */ @@ -1051,6 +1046,7 @@ describe('End to end transactions', function () { s_spend: [s_spend1], s_output: [s_out1, s_out2], } = tx_input_data + const builder = new ZcashBuilderBridge(fee_for(tx_input_data)) /* The inputs to the get_inittx_data function are the inputs to the transaction. @@ -1306,8 +1302,6 @@ describe('End to end transactions', function () { console.log(SPEND_PATH) - const builder = new ZcashBuilderBridge(1000) - /* In this test, Alice wants to send 10000 ZEC to Bob transparent and send the change back to herself. */ @@ -1319,6 +1313,7 @@ describe('End to end transactions', function () { s_spend: [], s_output: [], } = tx_input_data + const builder = new ZcashBuilderBridge(fee_for(tx_input_data)) const ledgerblob_initdata = get_inittx_data(tx_input_data) console.log(ledgerblob_initdata) @@ -1554,8 +1549,6 @@ describe('Failing transactions', function () { console.log(SPEND_PATH) - const builder = new ZcashBuilderBridge(1000) - /* In this test, Alice wants to send 55000 ZEC to Bob shielded and 10000 ZEC to Charlie transparent. For this she needs one notes of 40000 ZEC sent to her address belonging to path: 1000. @@ -1563,7 +1556,7 @@ describe('Failing transactions', function () { The inputs to the initialization is therefore: - one transparent input and one transparent output - one shielded spend notes and two shielded output notes. - She takes a transaction fee of 10000 and all leftovers is sent shielded to her own address. + She takes a transaction fee accorind to ZIP-0317 and all leftovers is sent shielded to her own address. All this info is gathered from the UI and put in the correct jsons. */ @@ -1574,6 +1567,7 @@ describe('Failing transactions', function () { s_spend: [s_spend1], s_output: [s_out1, s_out2], } = tx_input_data + const builder = new ZcashBuilderBridge(fee_for(tx_input_data)) /* The inputs to the get_inittx_data function are the inputs to the transaction. @@ -1800,8 +1794,6 @@ describe('Failing transactions', function () { console.log(SPEND_PATH) - const builder = new ZcashBuilderBridge(1000) - /* In this test, Alice wants to send 55000 ZEC to Bob shielded and 10000 ZEC to Charlie transparent. For this she needs one notes of 40000 ZEC sent to her address belonging to path: 1000. @@ -1809,7 +1801,7 @@ describe('Failing transactions', function () { The inputs to the initialization is therefore: - one transparent input and one transparent output - one shielded spend notes and two shielded output notes. - She takes a transaction fee of 10000 and all leftovers is sent shielded to her own address. + She takes a transaction fee according to ZIP-0317 and all leftovers is sent shielded to her own address. All this info is gathered from the UI and put in the correct jsons. */ @@ -1820,6 +1812,7 @@ describe('Failing transactions', function () { s_spend: [s_spend1], s_output: [s_out1, s_out2], } = tx_input_data + const builder = new ZcashBuilderBridge(fee_for(tx_input_data)) /* The inputs to the get_inittx_data function are the inputs to the transaction. @@ -2021,8 +2014,6 @@ describe('Failing transactions', function () { console.log(SPEND_PATH) - const builder = new ZcashBuilderBridge(1000) - /* In this test, Alice wants to send 55000 ZEC to Bob shielded and 10000 ZEC to Charlie transparent. For this she needs one notes of 40000 ZEC sent to her address belonging to path: 1000. @@ -2030,41 +2021,10 @@ describe('Failing transactions', function () { The inputs to the initialization is therefore: - one transparent input and one transparent output - one shielded spend notes and two shielded output notes. - She takes a transaction fee of 10000 and all leftovers is sent shielded to her own address. + She takes a transaction fee according to ZIP-0317 and all leftovers is sent shielded to her own address. All this info is gathered from the UI and put in the correct jsons. */ - // const tin1 = { - // path: [44 + 0x80000000, 133 + 0x80000000, 5 + 0x80000000, 0, 0], - // address: '1976a9140f71709c4b828df00f93d20aa2c34ae987195b3388ac', - // value: 60000, - // } - - // const tout1 = { - // address: '1976a914000000000000000000000000000000000000000088ac', - // value: 10000, - // } - - // const s_spend1 = { - // path: 1000, - // address: 'c69e979c6763c1b09238dc6bd5dcbf35360df95dcadf8c0fa25dcbedaaf6057538b812d06656726ea27667', - // value: 40000, - // } - - // const s_out1 = { - // address: '15eae700e01e24e2137d554d67bb0da64eee0bf1c2c392c5f1173a979baeb899663808cd22ed8df27566cc', - // value: 55000, - // memo_type: 0xf6, - // ovk: null, - // } - - // const s_out2 = { - // address: 'c69e979c6763c1b09238dc6bd5dcbf35360df95dcadf8c0fa25dcbedaaf6057538b812d06656726ea27667', - // value: 100000 - 1000 - 55000 - 10000, - // memo_type: 0xf6, - // ovk: null, - // } - const tx_input_data = TX_INPUT_DATA[3] const { t_in: [tin1], @@ -2073,6 +2033,8 @@ describe('Failing transactions', function () { s_output: [s_out1, s_out2], } = tx_input_data + const builder = new ZcashBuilderBridge(fee_for(tx_input_data)) + /* The inputs to the get_inittx_data function are the inputs to the transaction. The output is a blob that can be send to the ledger device. @@ -2258,26 +2220,16 @@ describe('Failing transactions', function () { } }) - test.each(models)('try txfee of 10000', async function (m) { + test.each(models)('try non ZIP-0317 fee', async function (m) { const sim = new Zemu(m.path) try { await sim.start({ ...defaultOptions, model: m.name }) const app = new ZCashApp(sim.getTransport()) - /* - In this test, Alice wants to send 55000 ZEC to Bob shielded and 10000 ZEC to Charlie transparent. - For this she needs one notes of 40000 ZEC sent to her address belonging to path: 1000. - She also uses a transparent input with 60000 ZEC belonging to transparent path: 0. - The inputs to the initialization is therefore: - - one transparent input and one transparent output - - one shielded spend notes and two shielded output notes. - She takes a transaction fee of 10000 and all leftovers is sent shielded to her own address. - All this info is gathered from the UI and put in the correct jsons. - */ - //use stringify+parse for deep copy const tx_input_data = JSON.parse(JSON.stringify(TX_INPUT_DATA[3])) - tx_input_data.s_output[1].value -= 9000 //extra fee over base 1000 + tx_input_data.s_output[1].value -= 500 //change fee to something invalid + const { t_in: [tin1], t_out: [tout1], @@ -2324,7 +2276,6 @@ describe('Failing transactions', function () { In this test, Alice wants to send 55000 ZEC to Bob. For this she needs two notes of 50000 ZEC sent to her address belonging to path: 1000. The inputs to the initialization is therefore two spend notes and two output notes. - She takes a transaction fee of 1000. All this info is gathered from the UI and put in the correct jsons. */ @@ -2387,9 +2338,6 @@ describe('Failing transactions', function () { console.log(SPEND_PATH) - // here 1000 represents the fee - const builder = new ZcashBuilderBridge(1000) - const tx_input_data = TX_INPUT_DATA[5] const { t_in: [], @@ -2397,6 +2345,7 @@ describe('Failing transactions', function () { s_spend: [s_spend1, s_spend2], s_output: [s_out1, s_out2], } = tx_input_data + const builder = new ZcashBuilderBridge(fee_for(tx_input_data)) const ledgerblob_initdata = get_inittx_data(tx_input_data) console.log(Buffer.from(ledgerblob_initdata).byteLength) diff --git a/zcashtools/neon/build/index.d.ts b/zcashtools/neon/build/index.d.ts index 2bd1fbc7..1b6c501b 100644 --- a/zcashtools/neon/build/index.d.ts +++ b/zcashtools/neon/build/index.d.ts @@ -2,6 +2,7 @@ import { OutputInfo, SpendInfo, TransactionSignatures, TransparentInputInfo, TransparentOutputInfo } from './native'; export type { InitData } from './native'; export declare const get_inittx_data: (_: import("./native").InitData) => Buffer; +export declare function calculate_fee(n_tin?: number, n_tout?: number, n_spend?: number, n_sout?: number): number; export declare var SPEND_PATH: string; export declare var OUTPUT_PATH: string; export declare class ZcashBuilderBridge { diff --git a/zcashtools/neon/build/index.js b/zcashtools/neon/build/index.js index 8c41154e..7f6a6eb1 100644 --- a/zcashtools/neon/build/index.js +++ b/zcashtools/neon/build/index.js @@ -3,10 +3,14 @@ var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); -exports.ZcashBuilderBridge = exports.OUTPUT_PATH = exports.SPEND_PATH = exports.get_inittx_data = void 0; +exports.ZcashBuilderBridge = exports.OUTPUT_PATH = exports.SPEND_PATH = exports.calculate_fee = exports.get_inittx_data = void 0; const path_1 = require("path"); const native_1 = __importDefault(require("./native")); exports.get_inittx_data = native_1.default.get_inittx_data; +function calculate_fee(n_tin = 0, n_tout = 0, n_spend = 0, n_sout = 0) { + return native_1.default.calculate_zip317_fee(n_tin, n_tout, n_spend, n_sout); +} +exports.calculate_fee = calculate_fee; exports.SPEND_PATH = (0, path_1.resolve)("../params/sapling-spend.params"); exports.OUTPUT_PATH = (0, path_1.resolve)("../params/sapling-output.params"); class ZcashBuilderBridge { diff --git a/zcashtools/neon/build/native.d.ts b/zcashtools/neon/build/native.d.ts index 677adb6b..740d244a 100644 --- a/zcashtools/neon/build/native.d.ts +++ b/zcashtools/neon/build/native.d.ts @@ -64,6 +64,7 @@ export interface TransactionSignatures { } interface NativeModule { get_inittx_data(_: InitData): Buffer; + calculate_zip317_fee(n_tin: number, n_tout: number, n_spend: number, n_sout: number): number; builderNew(fee: number): ZcashBuilder; builderAddTransparentInput(this: ZcashBuilder, tin: TransparentInputInfo): boolean; builderAddTransparentOutput(this: ZcashBuilder, tout: TransparentOutputInfo): boolean; From 1355a7a9359862d84ef22284e4233449219e8a7c Mon Sep 17 00:00:00 2001 From: becominginsane Date: Tue, 14 Nov 2023 13:43:35 +0800 Subject: [PATCH 19/24] fix(zcashtools): params path relative to script --- zcashtools/neon/build/index.js | 4 ++-- zcashtools/neon/lib/index.ts | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/zcashtools/neon/build/index.js b/zcashtools/neon/build/index.js index 7f6a6eb1..2b9070b2 100644 --- a/zcashtools/neon/build/index.js +++ b/zcashtools/neon/build/index.js @@ -11,8 +11,8 @@ function calculate_fee(n_tin = 0, n_tout = 0, n_spend = 0, n_sout = 0) { return native_1.default.calculate_zip317_fee(n_tin, n_tout, n_spend, n_sout); } exports.calculate_fee = calculate_fee; -exports.SPEND_PATH = (0, path_1.resolve)("../params/sapling-spend.params"); -exports.OUTPUT_PATH = (0, path_1.resolve)("../params/sapling-output.params"); +exports.SPEND_PATH = (0, path_1.resolve)(__dirname, "..", "params/sapling-spend.params"); +exports.OUTPUT_PATH = (0, path_1.resolve)(__dirname, "..", "params/sapling-output.params"); class ZcashBuilderBridge { constructor(fee) { this.boxed = native_1.default.builderNew(fee); diff --git a/zcashtools/neon/lib/index.ts b/zcashtools/neon/lib/index.ts index 67252480..b92476b1 100644 --- a/zcashtools/neon/lib/index.ts +++ b/zcashtools/neon/lib/index.ts @@ -9,8 +9,8 @@ export function calculate_fee(n_tin = 0, n_tout = 0, n_spend = 0, n_sout = 0): n return addon.calculate_zip317_fee(n_tin, n_tout, n_spend, n_sout); } -export var SPEND_PATH = resolve("../params/sapling-spend.params"); -export var OUTPUT_PATH = resolve("../params/sapling-output.params"); +export var SPEND_PATH = resolve(__dirname, "..", "params/sapling-spend.params"); +export var OUTPUT_PATH = resolve(__dirname, "..", "params/sapling-output.params"); export class ZcashBuilderBridge { private boxed: ZcashBuilder; From 655cd3576953f069a63959ceb5961005e3ac3b56 Mon Sep 17 00:00:00 2001 From: becominginsane Date: Tue, 14 Nov 2023 13:48:36 +0800 Subject: [PATCH 20/24] chore: update snapshots --- .../s-1-tr-in-1-spend-2-sh-out/00016.png | Bin 351 -> 336 bytes .../s-1-tr-in-1-spend-2-sh-out/00020.png | Bin 260 -> 283 bytes .../s-1-tr-in-1-spend-2-sh-out/00022.png | Bin 407 -> 320 bytes .../s-1-tr-out-1-spend-2-sh-out/00016.png | Bin 351 -> 336 bytes .../s-1-tr-out-1-spend-2-sh-out/00020.png | Bin 260 -> 283 bytes .../s-1-tr-out-1-spend-2-sh-out/00022.png | Bin 407 -> 320 bytes .../snapshots/s-2-spend-2-out/00017.png | Bin 349 -> 345 bytes .../snapshots/s-2-spend-2-out/00019.png | Bin 629 -> 343 bytes .../snapshots/s-2-spend-2-out/00020.png | Bin 646 -> 260 bytes .../snapshots/s-2-spend-2-out/00021.png | Bin 260 -> 249 bytes .../snapshots/s-2-spend-2-out/00022.png | Bin 249 -> 320 bytes .../snapshots/s-2-spend-2-out/00023.png | Bin 407 -> 320 bytes .../snapshots/s-2-tr-in-2-tr-out/00011.png | Bin 326 -> 317 bytes .../snapshots/s-2-tr-in-2-tr-out/00012.png | Bin 260 -> 260 bytes .../snapshots/s-2-tr-in-2-tr-out/00014.png | Bin 407 -> 329 bytes .../s-ext-data-after-tx-reject/00017.png | Bin 349 -> 345 bytes .../s-ext-data-after-tx-reject/00020.png | Bin 260 -> 260 bytes .../00017.png | Bin 349 -> 345 bytes .../00020.png | Bin 260 -> 260 bytes .../s-ext-sig-without-checkandsign/00017.png | Bin 349 -> 345 bytes .../s-ext-sig-without-checkandsign/00020.png | Bin 260 -> 260 bytes .../sp-1-tr-in-1-spend-2-sh-out/00013.png | Bin 407 -> 389 bytes .../sp-1-tr-in-1-spend-2-sh-out/00017.png | Bin 294 -> 319 bytes .../sp-1-tr-in-1-spend-2-sh-out/00019.png | Bin 476 -> 496 bytes .../sp-1-tr-out-1-spend-2-sh-out/00013.png | Bin 407 -> 389 bytes .../sp-1-tr-out-1-spend-2-sh-out/00017.png | Bin 294 -> 319 bytes .../sp-1-tr-out-1-spend-2-sh-out/00019.png | Bin 476 -> 496 bytes .../snapshots/sp-2-spend-2-out/00014.png | Bin 410 -> 395 bytes .../snapshots/sp-2-spend-2-out/00016.png | Bin 894 -> 375 bytes .../snapshots/sp-2-spend-2-out/00017.png | Bin 490 -> 294 bytes .../snapshots/sp-2-spend-2-out/00018.png | Bin 294 -> 355 bytes .../snapshots/sp-2-spend-2-out/00019.png | Bin 355 -> 496 bytes .../snapshots/sp-2-spend-2-out/00020.png | Bin 476 -> 496 bytes .../snapshots/sp-2-tr-in-2-tr-out/00008.png | Bin 370 -> 363 bytes .../snapshots/sp-2-tr-in-2-tr-out/00009.png | Bin 294 -> 294 bytes .../snapshots/sp-2-tr-in-2-tr-out/00011.png | Bin 476 -> 507 bytes .../sp-ext-data-after-tx-reject/00014.png | Bin 410 -> 395 bytes .../sp-ext-data-after-tx-reject/00017.png | Bin 294 -> 294 bytes .../00014.png | Bin 410 -> 395 bytes .../00017.png | Bin 294 -> 294 bytes .../sp-ext-sig-without-checkandsign/00014.png | Bin 410 -> 395 bytes .../sp-ext-sig-without-checkandsign/00017.png | Bin 294 -> 294 bytes .../st-1-tr-in-1-spend-2-sh-out/00005.png | Bin 20968 -> 20788 bytes .../st-1-tr-in-1-spend-2-sh-out/00006.png | Bin 18607 -> 18860 bytes .../st-1-tr-in-1-spend-2-sh-out/00008.png | Bin 10838 -> 5467 bytes .../st-1-tr-out-1-spend-2-sh-out/00005.png | Bin 20968 -> 20788 bytes .../st-1-tr-out-1-spend-2-sh-out/00006.png | Bin 18607 -> 18860 bytes .../st-1-tr-out-1-spend-2-sh-out/00008.png | Bin 10838 -> 5467 bytes .../snapshots/st-2-spend-2-out/00005.png | Bin 20774 -> 21012 bytes .../snapshots/st-2-spend-2-out/00006.png | Bin 18607 -> 11290 bytes .../snapshots/st-2-spend-2-out/00008.png | Bin 10838 -> 5467 bytes .../snapshots/st-2-tr-in-2-tr-out/00003.png | Bin 14717 -> 14507 bytes .../snapshots/st-2-tr-in-2-tr-out/00005.png | Bin 10838 -> 5467 bytes .../st-ext-data-after-tx-reject/00005.png | Bin 20774 -> 21012 bytes .../st-ext-data-after-tx-reject/00006.png | Bin 11259 -> 11290 bytes .../00005.png | Bin 20774 -> 21012 bytes .../00006.png | Bin 11259 -> 11290 bytes .../st-ext-sig-without-checkandsign/00005.png | Bin 20774 -> 21012 bytes .../st-ext-sig-without-checkandsign/00006.png | Bin 11259 -> 11290 bytes .../x-1-tr-in-1-spend-2-sh-out/00013.png | Bin 404 -> 386 bytes .../x-1-tr-in-1-spend-2-sh-out/00017.png | Bin 294 -> 319 bytes .../x-1-tr-in-1-spend-2-sh-out/00019.png | Bin 476 -> 492 bytes .../x-1-tr-out-1-spend-2-sh-out/00013.png | Bin 404 -> 386 bytes .../x-1-tr-out-1-spend-2-sh-out/00017.png | Bin 294 -> 319 bytes .../x-1-tr-out-1-spend-2-sh-out/00019.png | Bin 476 -> 492 bytes .../snapshots/x-2-spend-2-out/00014.png | Bin 407 -> 394 bytes .../snapshots/x-2-spend-2-out/00016.png | Bin 895 -> 379 bytes .../snapshots/x-2-spend-2-out/00017.png | Bin 491 -> 294 bytes .../snapshots/x-2-spend-2-out/00018.png | Bin 294 -> 355 bytes .../snapshots/x-2-spend-2-out/00019.png | Bin 355 -> 492 bytes .../snapshots/x-2-spend-2-out/00020.png | Bin 476 -> 492 bytes .../snapshots/x-2-tr-in-2-tr-out/00008.png | Bin 371 -> 364 bytes .../snapshots/x-2-tr-in-2-tr-out/00009.png | Bin 294 -> 294 bytes .../snapshots/x-2-tr-in-2-tr-out/00011.png | Bin 476 -> 504 bytes .../x-ext-data-after-tx-reject/00014.png | Bin 407 -> 394 bytes .../x-ext-data-after-tx-reject/00017.png | Bin 294 -> 294 bytes .../00014.png | Bin 407 -> 394 bytes .../00017.png | Bin 294 -> 294 bytes .../x-ext-sig-without-checkandsign/00014.png | Bin 407 -> 394 bytes .../x-ext-sig-without-checkandsign/00017.png | Bin 294 -> 294 bytes 80 files changed, 0 insertions(+), 0 deletions(-) diff --git a/tests_zemu/snapshots/s-1-tr-in-1-spend-2-sh-out/00016.png b/tests_zemu/snapshots/s-1-tr-in-1-spend-2-sh-out/00016.png index fd57bdaefa866f92bd9c80db744ea450b2c8af9a..efceca5bb06969583d6935c9fbfc5c258c7ed60e 100644 GIT binary patch delta 309 zcmV-50m}a00?-1GB!3r4L_t(|ob8vv4#OY_hOt@S|ABkh4olGvhHfor&Ho)1gH8|- zX`+(nMrkEio?9MYu8ZxLT2#I2GFJ~+`j6tYB}GS>TXRIy~KckVax_DgA{ z9P_X3uj-+?967DR?3mnVU4}ZUB@HTXE z&S!M^omlEi0GOEYH-O9@R8CbT-yVZYBoor|CH2$buyG(c3s z9K{?vxs6OY_R#*^miM1q5$%e@Oe3J_kG(PVz)lYrdWqPjjJM-%VhK{~yO_4QI8t@^;n|c;2!BWW72QHIK|A`+JV>b zOZ7O>rx{Mbc|DICHgS)?013&D((V^#{1lWhY%Z#W{;wZpC;$Ke0000000000z=$9E Wj|LWp+OH=70000^M1a*!H_(S;{{Jle!HEtsf?dboJ000000001>*$w_trm)n193ub#002ovPDHLk FV1l?;fS>>X delta 232 zcmV2ZsQ))D2wWVv z>VUzPQnWCerW99yWpnzx72eEHjd;9%?TP45ubD8#$Is~zw2dboH>*RI9;YGeneb+2 z7G~+Uf3aNFoYtv|vi53=NAFo{@hN2MkkhM~p9B0Thh0$2%H-F@3(|a1OQqIb#71g#rvl0S2Q07gT@2e>b$d$EwW? i+fV=i00000;NtEIzO+B00?<(a0000Dj<6$Mi8&o7;!1#50c$_mdZD`fBsk zo`8rf;#r%b`@=Ze_sqd-?pxgf5A6y3fFwNF#=Hc1ysE^OJ%5JTQ_x96 r2Oz}rVlOCzr5*qP000000B*nr>iCU@T!S?=00000NkvXXu0mjfT$_b8 delta 380 zcmV-?0fYX)0+$1jB!6B>L_t(|ob8#>4#OY_MeVZw{|EPBdoVKukg6CQmh)!2>T;DU zXi7m41i@1|EC%^p+{mZ4Lro8V!`osIsMJQLBegf%x;7)}6^o7GMbbW`tYn}FVhMrCU00ZLr6CVvzb{&|^>CR>X9;a<8I zOe_el-$K?jdwqEVoAmRvp#`$qnj!*9W)l8$OUa~38a+Azay=DLP#pYFY{FgAPjoH6B{BD()fUuMB86oURvgA5 zXmH#ff5N74v~}l!p$LHWDqFjDb(P3|4g(8S(X|r9r}{}10Ry_%4n*0dtsKhpNy}Ne}xBioiF69$<)-T*Rq7aeqCbzhl^o%kKSWO(p1sa?${~!p0 awR`~|W1vof;0gQy0000j6tYB}GS>TXRIy~KckVax_DgA{ z9P_X3uj-+?967DR?3mnVU4}ZUB@HTXE z&S!M^omlEi0GOEYH-O9@R8CbT-yVZYBoor|CH2$buyG(c3s z9K{?vxs6OY_R#*^miM1q5$%e@Oe3J_kG(PVz)lYrdWqPjjJM-%VhK{~yO_4QI8t@^;n|c;2!BWW72QHIK|A`+JV>b zOZ7O>rx{Mbc|DICHgS)?013&D((V^#{1lWhY%Z#W{;wZpC;$Ke0000000000z=$9E Wj|LWp+OH=70000^M1a*!H_(S;{{Jle!HEtsf?dboJ000000001>*$w_trm)n193ub#002ovPDHLk FV1l?;fS>>X delta 232 zcmV2ZsQ))D2wWVv z>VUzPQnWCerW99yWpnzx72eEHjd;9%?TP45ubD8#$Is~zw2dboH>*RI9;YGeneb+2 z7G~+Uf3aNFoYtv|vi53=NAFo{@hN2MkkhM~p9B0Thh0$2%H-F@3(|a1OQqIb#71g#rvl0S2Q07gT@2e>b$d$EwW? i+fV=i00000;NtEIzO+B00?<(a0000Dj<6$Mi8&o7;!1#50c$_mdZD`fBsk zo`8rf;#r%b`@=Ze_sqd-?pxgf5A6y3fFwNF#=Hc1ysE^OJ%5JTQ_x96 r2Oz}rVlOCzr5*qP000000B*nr>iCU@T!S?=00000NkvXXu0mjfT$_b8 delta 380 zcmV-?0fYX)0+$1jB!6B>L_t(|ob8#>4#OY_MeVZw{|EPBdoVKukg6CQmh)!2>T;DU zXi7m41i@1|EC%^p+{mZ4Lro8V!`osIsMJQLBegf%x;7)}6^o7GMbbW`tYn}FVhMrCU00ZLr6CVvzb{&|^>CR>X9;a<8I zOe_el-$K?jdwqEVoAmRvp#`$qnj!*9W)l8$OUa~38a+Azay=DLP#pYFY{FgAPjoH6B{BD()fUuMB86oURvgA5 zXmH#ff5N74v~}l!p$LHWDqFjDb(P3|4g(8S(X|r9r}{}10Ry_%4n*0dtsKhpNy}Ne}xBioiF69$<)-T*Rq7aeqCbzhl^o%kKSWO(p1sa?${~!p0 awR`~|W1vof;0gQy0000{IuyzGp`@ciepd$!~ z7%1npQdmfp*P8yD>x%YsEk(V>X{sKO*3Yd`wLotjE{u}mkT745y^1MGwR8U>AHU>Q z^8fgi{Z-wR%a+5!%(lt>s7p{+^m|o!MH1sGtRTzVvT2!#wttw|q(fejjjL@ZN1S%H zZ6&C1E;Pw~QLQ9j&`(9>>}{LUfN>0Ry47Zv7antO@P_XJ&5$T5wiO=nv}2 z5CJ%}@MjN*E;m65as~l#rh_&#fBm;@L+>`7k7z>y0000000000004L@Z^q`<|JKsx QHUIzs07*qoM6N<$f+ww*WB>pF delta 322 zcmV-I0log&0^I_TB!47HL_t(|ob8yw5`-WKhPA2pf8Y-7VJD>^v@KM2{_n8kpeqPU zXbhBX4RHykY-?`6t}EHkwTODfVWu9?=BL(}T3|O17bc0=rHr@ZsA9@e>%Cve*Dusc z-cG-|zlw|MvgEihv)k6^=kWbSRi1H?P9A_s+sew3jA00000000000000xJ~m(q U4o`62n*aa+07*qoM6N<$g1!-(w*UYD diff --git a/tests_zemu/snapshots/s-2-spend-2-out/00019.png b/tests_zemu/snapshots/s-2-spend-2-out/00019.png index 217592db295aeb7c75ee6321e661e5fa2d1cb63c..790ac765f038daf4076015134f4593d9e155f649 100644 GIT binary patch delta 317 zcmV-D0mAkl6a5<%HODy$G#$iR$5>s# P00000NkvXXu0mjfgin&u delta 605 zcmV-j0;2ub0`&xtBYy%sNkl~@t53q++W{kco_boLfV{L>ULG8AxXmK!XqW6Fz-TlVB?;TJp?L`Y%DEx zmuwuel;b5qZ_+ppfc5`~KG{|bs)gLFO7?_Z1tA$~2J z{q$OZ6uJgA=f^LBNxxRkeoE7LYt{gfdc7$xIEIghfpXFu+hs&ULZgO6{=Z^7hQ zkGm>vW07Blntyzeqc(m9hk1m&5b;)$y}qr-TT)uc(nw1X_$Kh>e(cBklHxhxq)Rq$5vfgWVA0p?SKsL98q%_GQ3jKbuLWuP3e?5 zxP`=|-RQo30T>6YFjXRfCBud6QT3R6&Z^A4@;JnIgnyyZV&*Q2(#4Nj5QCm$k&Tt` zhM^&UY{Elui^|M|1H-!;-(dW6wXw0W@%6C30X3M&m%m{h6aPV6htTqrZ<^fF_j0I+ZLlI`+yhb-xMMT4G0`^5CCR1OM$D{=t-xIFc z9^(IKcvfRLL}$W|L|<)LkaK#lECDWvUVx}W7khZsY|*E}J+Omaiuf>$VW|2xMkV?T r4<-j00000NkvXXu0mjfmDeek diff --git a/tests_zemu/snapshots/s-2-spend-2-out/00020.png b/tests_zemu/snapshots/s-2-spend-2-out/00020.png index db7a548f98d2956f30f002b4d5480f055c06c7c3..afa3fe3e088723f57ef0dfe3a54ede519aa0d443 100644 GIT binary patch delta 233 zcmVbNM^G70JZ@5l%soy+);;0H z%q*BT!RoA09ERW0_=@HECE_OE?aW_*$x(p8D8OJ8;1AVb@Xv-id#u{J junh$O0000008qFB=ZCaEkIV9900000NkvXXu0mjfeOz+H delta 622 zcmV-!0+IcM0)_>UBYy%-NklsK-#|Ij?VV~3xpO?ZxfyKLwG%&Q8iSA901qkophs)bR)&tMCh1h#f% z?zZ{?!V2_?9;6$u9Vj%S*j?*uQ);Cd{Ef?%djN@h;zeq7y&{Pl;Jj>K>FY^nY3tF@ zaSu|Nmj{93ysle)B6^*g8%MI|sU>_yz)9KoI`URcf4eo+LF8;qJu^)vhM>d(3|0snLufp>SWuwG zY*aOnf(NE2b_S%EnqHZbXfg&HvFaF=4B2M82e1t&rg0G&8!shh(P`g=h2v~oaw@hc zP}>_@+ZMoaa%2`HP8$p$m#~SuUKG`q7j@kLWZOaG5`V8kqM7qmGXxf0O4PydB+bZR zANrDe06z(y0`CUI!w|gRXT2g(EYuipsfKPD0uG&YZ6r*-QVgE^MLFXO~g03h_AfW(h(nh zKYt*jm1i1@GMh2j12TH?O=Pc*{IbR`&$tdF1JszCFmmsA*YuIAnX&plfCZ0wtYwyV zxaaTaIAZljVn7KOn40000003gW< XFTQ24g)B5$00000NkvXXu0mjf%9Co; delta 232 zcmV2ZsQ))D2wWVv z>VUzPQnWCerW99yWpnzx72eEHjd;9%?TP45ubD8#$Is~zw2dboH>*RI9;YGeneb+2 z7G~+Uf3aNFoYtv|vi53=NAFo{@hN2MkkhM~p9B0Thh0$2%H-F@3(|a1OQqIb#71g#rvl0S2Q07gT@2e>b$d$EwW? i+fV=i00000;NtEIzO+B00?<(a00000onff0l)%~BYy!0NklE6YWiyP z)SiHdEaF+4qWi-*+V{-CYwla!0T1m7{D34p*v7mBdAzE`mVZ5l+2i{F03f1Qh>fk1 zvaul<)@P{6cmFqR6tm3c(R{lyXYK!VA7-+k*lL~U3YYR_)dh&FR<8!(GPJXH?<{vM z$&TIv2x9FSC=1C-4zM%_oR$+AaK1fG?0GyHn6f sLkA$l^I|V3gCC^;00000003^l2I}~YhFpU+H2?qr07*qoM6N<$g3U&SmH+?% delta 222 zcmV<403rXt0{H=uBYyzENklbj?&pa6O!qUj-KP8b*aIa}NQpVDM27(Yu87xPW-HU%N9Xm=i`GrK z`c<=vSN1M)7xn*dyAZw~D~|m>-9vo?clT7^fSMlyQ3UBWz*lp*W^o_xVX~hV_xLK! zJWxl!^aO+v9CqZO_yak9g>(j#>GisJk$>I;(Fy2tpnp;v&~L`+D(V>k00000001D# Y3NOB8u!Sr%S^xk507*qoM6N<$f&jp45C8xG diff --git a/tests_zemu/snapshots/s-2-spend-2-out/00023.png b/tests_zemu/snapshots/s-2-spend-2-out/00023.png index b7541f870581d5c0e5fae5452fba5da570e61034..1cd31cb2583141eb9a68beca2d3844084ec96496 100644 GIT binary patch delta 293 zcmV+=0owkT1Hb~1B!34Dj<6$Mi8&o7;!1#50c$_mdZD`fBsk zo`8rf;#r%b`@=Ze_sqd-?pxgf5A6y3fFwNF#=Hc1ysE^OJ%5JTQ_x96 r2Oz}rVlOCzr5*qP000000B*nr>iCU@T!S?=00000NkvXXu0mjfT$_b8 delta 380 zcmV-?0fYX)0+$1jB!6B>L_t(|ob8#>4#OY_MeVZw{|EPBdoVKukg6CQmh)!2>T;DU zXi7m41i@1|EC%^p+{mZ4Lro8V!`osIsMJQLBegf%x;7)}6^o7GMbbW`tYn}FVhMrCU00ZLr6CVvzb{&|^>CR>X9;a<8I zOe_el-$K?jdwqEVoAmRvp#`$qnj!*9W)l8$OUa~38a+Azay=DLP#pYFY{FgAPjoH6B{BD()fUuMB86oURvgA5 zXmH#ff5N74v~}l!p$LHWDqFjDb(P3|4g(8S(X|r9r}{}10Ry_%4n*0dtsKhpNy}Ne}xBioiF69$<)-T*Rq7aeqCbzhl^o%kKSWO(p1sa?${~!p0 awR`~|W1vof;0gQy0000NK*8w!5A4D&jED{&6JY@R-lDMsnLl=@ zH9p&F>|(02t(ULG&AAYKLorEgTfHQtl;2WQl_Iu+N~F+9f=h}0mALAkPHFAlf6ks4 z-%%Q6B!3M_L_t(|ob8#(4ul{KhJncYKd=Wq7!WL51}Mw?-@!PAbOkM= z6fV~(q!wMdPVZ-Pb2bFmP)rh=)-MSu<)74arHQSe5-PNk;80?ICw%?tmG)lyKzzZ1F454i#cSnEF`P>xF6rqhhVcPNL%Tun!F9&pZXQeyC+nB z3IL!fiJpfJjg@Rj$uVk@8y4^m7|b!+fokmWWzF7k{Q|g+f9%{aG3ytAvQ!!H4){aT x|Ml0mkMwiG&m@`w00000000000002na04;^{sXObUZ?;7002ovPDHLkV1gBki_ri8 diff --git a/tests_zemu/snapshots/s-2-tr-in-2-tr-out/00012.png b/tests_zemu/snapshots/s-2-tr-in-2-tr-out/00012.png index 2dfdefcc5e845e04283766cd35b62f9e5568ee89..afa3fe3e088723f57ef0dfe3a54ede519aa0d443 100644 GIT binary patch delta 210 zcmV;@04@K70)zsPI)7|IkpkXmrs7clH!TQU9JuO$!S=RjVKq%#Jp7f->GM{&n4uc+ zc>UTF(Vt#3;TCT{r$(Qx#?H)fSK5v)1BM zNRA9PK_^9gM52KR2tohjHJ0=g+Jpce9&Oxaj8r$=OoJ+G(&%x@fQ5=Tf()fzy z`6c2e-|fs_fXPvS!6?9B6yOilU+~X{I(w|zy08re00000002<90_TUcKab1uWdHyG M07*qoM6N<$f|7M-5&!@I delta 210 zcmV;@04@K70)zsPI)7+EkqX_&nc}GbH!TQU9JuO$!Io0AFq@_nSAS)5`n(n1%utPZ zyngM8=ufYiFvZ8u=@GPzCmuJeLzW(=A?um&W@Z*<>9>EeT-Kb{sfx1pYKuqjS!?kr zWb2UAtC^nz{8V-Chfzts)_iQs9aDzt9sqz4=b%&%jqN!h=S!^AbFk`fY>vk}8h$I3Bx6RoePT0epcR zvgZ?q652UnAtypU@6G~!pcDWA00000003|S4m-G$hCD%*{r~^~07*qoM6N<$f)7lK AT>t<8 delta 380 zcmV-?0fYX@0+$1jB!6B>L_t(|ob8#>4#OY_MeVZw{|EPBdoVKukg6CQmh)!2>T;DU zXi7m41i@1|EC%^p+{mZ4Lro8V!`osIsMJQLBegf%x;7)}6^o7GMbbW`tYn}FVhMrCU00ZLr6CVvzb{&|^>CR>X9;a<8I zOe_el-$K?jdwqEVoAmRvp#`$qnj!*9W)l8$OUa~38a+Azay=DLP#pYFY{FgAPjoH6B{BD()fUuMB86oURvgA5 zXmH#ff5N74v~}l!p$LHWDqFjDb(P3|4g(8S(X|r9r}{}10Ry_%4n*0dtsKhpNy}Ne}xBioiF69$<)-T*Rq7aeqCbzhl^o%kKSWO(p1sa?${~!p0 awR`~|W1vof;0gQy0000{IuyzGp`@ciepd$!~ z7%1npQdmfp*P8yD>x%YsEk(V>X{sKO*3Yd`wLotjE{u}mkT745y^1MGwR8U>AHU>Q z^8fgi{Z-wR%a+5!%(lt>s7p{+^m|o!MH1sGtRTzVvT2!#wttw|q(fejjjL@ZN1S%H zZ6&C1E;Pw~QLQ9j&`(9>>}{LUfN>0Ry47Zv7antO@P_XJ&5$T5wiO=nv}2 z5CJ%}@MjN*E;m65as~l#rh_&#fBm;@L+>`7k7z>y0000000000004L@Z^q`<|JKsx QHUIzs07*qoM6N<$f+ww*WB>pF delta 322 zcmV-I0log&0^I_TB!47HL_t(|ob8yw5`-WKhPA2pf8Y-7VJD>^v@KM2{_n8kpeqPU zXbhBX4RHykY-?`6t}EHkwTODfVWu9?=BL(}T3|O17bc0=rHr@ZsA9@e>%Cve*Dusc z-cG-|zlw|MvgEihv)k6^=kWbSRi1H?P9A_s+sew3jA00000000000000xJ~m(q U4o`62n*aa+07*qoM6N<$g1!-(w*UYD diff --git a/tests_zemu/snapshots/s-ext-data-after-tx-reject/00020.png b/tests_zemu/snapshots/s-ext-data-after-tx-reject/00020.png index 2dfdefcc5e845e04283766cd35b62f9e5568ee89..afa3fe3e088723f57ef0dfe3a54ede519aa0d443 100644 GIT binary patch delta 210 zcmV;@04@K70)zsPI)7|IkpkXmrs7clH!TQU9JuO$!S=RjVKq%#Jp7f->GM{&n4uc+ zc>UTF(Vt#3;TCT{r$(Qx#?H)fSK5v)1BM zNRA9PK_^9gM52KR2tohjHJ0=g+Jpce9&Oxaj8r$=OoJ+G(&%x@fQ5=Tf()fzy z`6c2e-|fs_fXPvS!6?9B6yOilU+~X{I(w|zy08re00000002<90_TUcKab1uWdHyG M07*qoM6N<$f|7M-5&!@I delta 210 zcmV;@04@K70)zsPI)7+EkqX_&nc}GbH!TQU9JuO$!Io0AFq@_nSAS)5`n(n1%utPZ zyngM8=ufYiFvZ8u=@GPzCmuJeLzW(=A?um&W@Z*<>9>EeT-Kb{sfx1pYKuqjS!?kr zWb2UAtC^nz{8V-Chfzts)_iQs9aDzt9sqz4=b%&%jqN!h=S!^AbFk`fY>vk}8h{IuyzGp`@ciepd$!~ z7%1npQdmfp*P8yD>x%YsEk(V>X{sKO*3Yd`wLotjE{u}mkT745y^1MGwR8U>AHU>Q z^8fgi{Z-wR%a+5!%(lt>s7p{+^m|o!MH1sGtRTzVvT2!#wttw|q(fejjjL@ZN1S%H zZ6&C1E;Pw~QLQ9j&`(9>>}{LUfN>0Ry47Zv7antO@P_XJ&5$T5wiO=nv}2 z5CJ%}@MjN*E;m65as~l#rh_&#fBm;@L+>`7k7z>y0000000000004L@Z^q`<|JKsx QHUIzs07*qoM6N<$f+ww*WB>pF delta 322 zcmV-I0log&0^I_TB!47HL_t(|ob8yw5`-WKhPA2pf8Y-7VJD>^v@KM2{_n8kpeqPU zXbhBX4RHykY-?`6t}EHkwTODfVWu9?=BL(}T3|O17bc0=rHr@ZsA9@e>%Cve*Dusc z-cG-|zlw|MvgEihv)k6^=kWbSRi1H?P9A_s+sew3jA00000000000000xJ~m(q U4o`62n*aa+07*qoM6N<$g1!-(w*UYD diff --git a/tests_zemu/snapshots/s-ext-output-without-ext-spend-data/00020.png b/tests_zemu/snapshots/s-ext-output-without-ext-spend-data/00020.png index 2dfdefcc5e845e04283766cd35b62f9e5568ee89..afa3fe3e088723f57ef0dfe3a54ede519aa0d443 100644 GIT binary patch delta 210 zcmV;@04@K70)zsPI)7|IkpkXmrs7clH!TQU9JuO$!S=RjVKq%#Jp7f->GM{&n4uc+ zc>UTF(Vt#3;TCT{r$(Qx#?H)fSK5v)1BM zNRA9PK_^9gM52KR2tohjHJ0=g+Jpce9&Oxaj8r$=OoJ+G(&%x@fQ5=Tf()fzy z`6c2e-|fs_fXPvS!6?9B6yOilU+~X{I(w|zy08re00000002<90_TUcKab1uWdHyG M07*qoM6N<$f|7M-5&!@I delta 210 zcmV;@04@K70)zsPI)7+EkqX_&nc}GbH!TQU9JuO$!Io0AFq@_nSAS)5`n(n1%utPZ zyngM8=ufYiFvZ8u=@GPzCmuJeLzW(=A?um&W@Z*<>9>EeT-Kb{sfx1pYKuqjS!?kr zWb2UAtC^nz{8V-Chfzts)_iQs9aDzt9sqz4=b%&%jqN!h=S!^AbFk`fY>vk}8h{IuyzGp`@ciepd$!~ z7%1npQdmfp*P8yD>x%YsEk(V>X{sKO*3Yd`wLotjE{u}mkT745y^1MGwR8U>AHU>Q z^8fgi{Z-wR%a+5!%(lt>s7p{+^m|o!MH1sGtRTzVvT2!#wttw|q(fejjjL@ZN1S%H zZ6&C1E;Pw~QLQ9j&`(9>>}{LUfN>0Ry47Zv7antO@P_XJ&5$T5wiO=nv}2 z5CJ%}@MjN*E;m65as~l#rh_&#fBm;@L+>`7k7z>y0000000000004L@Z^q`<|JKsx QHUIzs07*qoM6N<$f+ww*WB>pF delta 322 zcmV-I0log&0^I_TB!47HL_t(|ob8yw5`-WKhPA2pf8Y-7VJD>^v@KM2{_n8kpeqPU zXbhBX4RHykY-?`6t}EHkwTODfVWu9?=BL(}T3|O17bc0=rHr@ZsA9@e>%Cve*Dusc z-cG-|zlw|MvgEihv)k6^=kWbSRi1H?P9A_s+sew3jA00000000000000xJ~m(q U4o`62n*aa+07*qoM6N<$g1!-(w*UYD diff --git a/tests_zemu/snapshots/s-ext-sig-without-checkandsign/00020.png b/tests_zemu/snapshots/s-ext-sig-without-checkandsign/00020.png index 2dfdefcc5e845e04283766cd35b62f9e5568ee89..afa3fe3e088723f57ef0dfe3a54ede519aa0d443 100644 GIT binary patch delta 210 zcmV;@04@K70)zsPI)7|IkpkXmrs7clH!TQU9JuO$!S=RjVKq%#Jp7f->GM{&n4uc+ zc>UTF(Vt#3;TCT{r$(Qx#?H)fSK5v)1BM zNRA9PK_^9gM52KR2tohjHJ0=g+Jpce9&Oxaj8r$=OoJ+G(&%x@fQ5=Tf()fzy z`6c2e-|fs_fXPvS!6?9B6yOilU+~X{I(w|zy08re00000002<90_TUcKab1uWdHyG M07*qoM6N<$f|7M-5&!@I delta 210 zcmV;@04@K70)zsPI)7+EkqX_&nc}GbH!TQU9JuO$!Io0AFq@_nSAS)5`n(n1%utPZ zyngM8=ufYiFvZ8u=@GPzCmuJeLzW(=A?um&W@Z*<>9>EeT-Kb{sfx1pYKuqjS!?kr zWb2UAtC^nz{8V-Chfzts)_iQs9aDzt9sqz4=b%&%jqN!h=S!^AbFk`fY>vk}8hNg<;xsC$s-0v6nuW62d)#$4me3$v_31 zQ6SVg0000$?xpO^dmpaN?1=WwEbb-luGo8CxHYnTY&9QQPuru;KU=Mx5X!hJ|8cuE zl*@9UOF&m1!4RP2!i}Y~_$ge?TijnQC~-g=feR5gvypc>FMssjw-eJH!&;$y$D7J5Pg?i+pgfCSt+`UQeLKyuoZTqgtQmiWj_JH?XaI_+}~B~T4A z(U&QNn&^v>gEKJ;or!h$OoSHz000000000000000002157nWQ;XF`>1O8@`>07*qo IM6N<$f>pGqd;kCd delta 380 zcmV-?0fYX91D6AkB!6B>L_t(|obA|Kj>8}fKv6oHop}FCVlVTNsf92vmBfMcp05a6 zNbTTILI3~&0NlMiCyO!awTN6XzKEo=q|+5=w~fajr{7!6uiH$=Po4j5wQ)3*X_x(Q zyI0%Ya^RPME*n7&P<9c<(pg*ztNC%BuNIUvppC$3#6@J}S%0>TF~)Xcy7zD{zZIa* zZ=+JH`65tDiD!Ku;kp8fuf8j6QG5!)l(Yj=p2?%UOQoNshi0_Fz+0AM|hJ%;V-w#2vEfRp1tO?H&l?i#tUUr$@IRLzWk z9q+?9AI@j`Gj$d^j{c1Or100001)~BYyz~Nkl3dY1B+E_dR+72Rte7MWg~O)XSpOra5?LU!x~*K+d`3 zcfLp|%~_srn}atO=^M~|&9~iu5d>~Q(|dkPRqmhkTBH_KG=EbZEAK_f7E}+;;(mky z0RE=|+tB8oa_!NHk&W%?(Z~<9ILz68wEv=xc2(p)LjDr2MSo#qp9QT6bT0J30-QKB z9VmPYicSG;ro*zW|Ja&-ZD1A?*fY`$aw1MM^0hw1579KETTQa;chg9(` z-@Q>v*;C#xhnd%d`YF!+(f#<=&)Rg8I%~-c1+) zfJyp43Qupv_FT~6XU_SpcN+cpe;a3xlwZQ_73e& z9Us>`hCUhp`lsLpJPcX-(+r}P{$y$p$to1dJ{(EB0000000000008iBz5%2V-gWfE Sm5KlW002ovP6b4+LSTZL)qR=( diff --git a/tests_zemu/snapshots/sp-1-tr-in-1-spend-2-sh-out/00019.png b/tests_zemu/snapshots/sp-1-tr-in-1-spend-2-sh-out/00019.png index e7072e1b1ed594ead3275a47a5a7675aed293e8c..6958c981b015b1ea976e5ba479ae4a4b4a5473c4 100644 GIT binary patch delta 470 zcmV;{0V)361MmZoB!9O_L_t(|ob8%XZo?oDL}}HVaQ`E5mwq521O$WadUxvgz7oet z&@2q>Bq0C*000000KADW>j7+#Qrfyd#`s4gxsh+{0lXawV2peLVvG`2^NAnp0i37S zJwM*vBs?I$0@M*+0rh;>bs^ybWQz2P{u9(KNL~FPy#jPM-hUe50%U6US1g9M1^okr zS3sWc>P947fQ+v687#;c3IG7`Uflg8IXu-|$=d4EszclzL;KFwt#-HIt^kF8DKz=> zFpmC|QJ3r9%IUWNnMT?ESFrq2N@@5~eZ^rsuqbGmF2=w zj|IrgEoJ^jiGR7Dac4ng+BVy1Ht~8dt)KR940002+PHfW9+YgJATxgi?t;9;t zV9*Clbh-G+D{b(wzcc)6g?%H|bY8s{Lv`lW+Rcs(F^eMle7HmiP0n+|9~RSyVK4nK z1_fBmIOpo@3fH)tpS;M%g37+v#6sf**}fsLZ7<_@N`VTX6Yxu%uhB6X0U?&o~*mOVAA@ z&H!KU*$YwP32=Es?u=+{|p)jy_)OqA#-gS{|t1h;@-YJ_Rd3Ykc^tcts}<;%G%DpbPgfc8h?j z)%~bjD~dN_uYWAn7UC|-;?2?H4y-r@G1+#AG;tMq?PC)1N@H?&FDOi7s>;!a4&|bCNg<;xsC$s-0v6nuW62d)#$4me3$v_31 zQ6SVg0000$?xpO^dmpaN?1=WwEbb-luGo8CxHYnTY&9QQPuru;KU=Mx5X!hJ|8cuE zl*@9UOF&m1!4RP2!i}Y~_$ge?TijnQC~-g=feR5gvypc>FMssjw-eJH!&;$y$D7J5Pg?i+pgfCSt+`UQeLKyuoZTqgtQmiWj_JH?XaI_+}~B~T4A z(U&QNn&^v>gEKJ;or!h$OoSHz000000000000000002157nWQ;XF`>1O8@`>07*qo IM6N<$f>pGqd;kCd delta 380 zcmV-?0fYX91D6AkB!6B>L_t(|obA|Kj>8}fKv6oHop}FCVlVTNsf92vmBfMcp05a6 zNbTTILI3~&0NlMiCyO!awTN6XzKEo=q|+5=w~fajr{7!6uiH$=Po4j5wQ)3*X_x(Q zyI0%Ya^RPME*n7&P<9c<(pg*ztNC%BuNIUvppC$3#6@J}S%0>TF~)Xcy7zD{zZIa* zZ=+JH`65tDiD!Ku;kp8fuf8j6QG5!)l(Yj=p2?%UOQoNshi0_Fz+0AM|hJ%;V-w#2vEfRp1tO?H&l?i#tUUr$@IRLzWk z9q+?9AI@j`Gj$d^j{c1Or100001)~BYyz~Nkl3dY1B+E_dR+72Rte7MWg~O)XSpOra5?LU!x~*K+d`3 zcfLp|%~_srn}atO=^M~|&9~iu5d>~Q(|dkPRqmhkTBH_KG=EbZEAK_f7E}+;;(mky z0RE=|+tB8oa_!NHk&W%?(Z~<9ILz68wEv=xc2(p)LjDr2MSo#qp9QT6bT0J30-QKB z9VmPYicSG;ro*zW|Ja&-ZD1A?*fY`$aw1MM^0hw1579KETTQa;chg9(` z-@Q>v*;C#xhnd%d`YF!+(f#<=&)Rg8I%~-c1+) zfJyp43Qupv_FT~6XU_SpcN+cpe;a3xlwZQ_73e& z9Us>`hCUhp`lsLpJPcX-(+r}P{$y$p$to1dJ{(EB0000000000008iBz5%2V-gWfE Sm5KlW002ovP6b4+LSTZL)qR=( diff --git a/tests_zemu/snapshots/sp-1-tr-out-1-spend-2-sh-out/00019.png b/tests_zemu/snapshots/sp-1-tr-out-1-spend-2-sh-out/00019.png index e7072e1b1ed594ead3275a47a5a7675aed293e8c..6958c981b015b1ea976e5ba479ae4a4b4a5473c4 100644 GIT binary patch delta 470 zcmV;{0V)361MmZoB!9O_L_t(|ob8%XZo?oDL}}HVaQ`E5mwq521O$WadUxvgz7oet z&@2q>Bq0C*000000KADW>j7+#Qrfyd#`s4gxsh+{0lXawV2peLVvG`2^NAnp0i37S zJwM*vBs?I$0@M*+0rh;>bs^ybWQz2P{u9(KNL~FPy#jPM-hUe50%U6US1g9M1^okr zS3sWc>P947fQ+v687#;c3IG7`Uflg8IXu-|$=d4EszclzL;KFwt#-HIt^kF8DKz=> zFpmC|QJ3r9%IUWNnMT?ESFrq2N@@5~eZ^rsuqbGmF2=w zj|IrgEoJ^jiGR7Dac4ng+BVy1Ht~8dt)KR940002+PHfW9+YgJATxgi?t;9;t zV9*Clbh-G+D{b(wzcc)6g?%H|bY8s{Lv`lW+Rcs(F^eMle7HmiP0n+|9~RSyVK4nK z1_fBmIOpo@3fH)tpS;M%g37+v#6sf**}fsLZ7<_@N`VTX6Yxu%uhB6X0U?&o~*mOVAA@ z&H!KU*$YwP32=Es?u=+{|p)jy_)OqA#-gS{|t1h;@-YJ_Rd3Ykc^tcts}<;%G%DpbPgfc8h?j z)%~bjD~dN_uYWAn7UC|-;?2?H4y-r@G1+#AG;tMq?PC)1N@H?&FDOi7s>;!a4&|bCQJTxLjV8(0OTIZ!D5W*+RSFeH?#F9>*1=SmyJu1;rG_^l8veGHzyDo`2=CF~;amO!pqf(yf5> z{5q97IbH->Q=+WzTS!+x_0>1SEsD=Vv;xW}x~vRN?><+1*sFBg(C!|z^%4%B@>Olm zzCL6d+PXt{x^Gu;oPRWG0*(g(0H9BL8oF@yd1Y6(#o4@;jbBCnP1$Lh-?imJ5P2%~ zVH`3SI*#70RcTDZ9qP$1OhEQemh8xH2uje&n1G8BEZgj~E4$8apxY8ZoR)o&XXwPg zMbW&wW|GOiOeNK1UyM086IJL;yob+3dI10c000000000000000fN9=;@jpF8}fKvAZeov{BUv6p^CV<8@f25_Kr&sStx zNNqw8bq)Xk05JDsIamlmuD$mw`uE<)qr}4%N6&*-C)4k(=GSbb>!*(Ywpu@u%D5^2 zu-+WRcnJ@LU&&X$~`=}kQs@z;wfOX7p0 zEMk2aH(l-2$awfz|F*LWaC-LL=>_-#2NysNx8*{Q?`fld#6Fdr#Kr&B6ys-DI$vtr zlDw%iQtV2JKfVoZ^t}1g`W>oCCi`XzsV4izsKJw1g`UKF_(`M}000000000000000 d00013<_!r|W1aXLh|mB4002ovPDHLkV1jGExwQZQ diff --git a/tests_zemu/snapshots/sp-2-spend-2-out/00016.png b/tests_zemu/snapshots/sp-2-spend-2-out/00016.png index cbac6178130e212241008c9afc67c65ba696b701..58ee321eb80f39ae207a6d31b9d523b22f73653b 100644 GIT binary patch delta 349 zcmV-j0iyo?2KNGxBYy!tNkl+*+G@f2-nE=#KlsNlhAggwv%b&82^~u7@Z&K+LBeD12qAuR6R^IT=twBKCZh2pa=)FEBh)tB^5bcr@1n$Pfi ziIo=a&5Rw9XwSY`%|mBD_$peNJ&_F{;Lj2(L(D;RJO^y6qkqTajMLao(BC59msm3c zZoEO^4I)9i)X8b2od)GKUxiudv8DsWxW1l<%Bv>t(Ip~IcM8+gs!6F?HUmT-e4K^J zdi9DHbbyZUe4>AycZyJ6D9i|73VT5Z-1kp!!*^KQiH6wEi6zA>*NeF4xA$TO6W0_a zeN^wQNMC`s*?-+>;oF(-fK`zYLJ0X@#%gFF;{^3%t+9p|$zg3Shr3eGNbFks!W~t} z3JGGT+&;{28<0p4FFHb`dEqDU!gFe9ZxkFsX5nz;F4QBDq3SisdhdOK4aXfIj9%(h zMm9mM$#6+Ip1DZXZ!Qo)!h5<#yidNR8F#=!>9rxOfq$#PaJs~a3mEp6X<4+YvFU}3 zAl8e#l2yL&RvVspSH6%T1>`nVPpIKaXWmg`)w6aJ9&T{W`z^9|n-$D>3ceDzOlnLU zaFfjJZ^KA6v%eYk!6)G=^hpLuW*@wYPH*vSD87>epM(1SSs)^s534~*O^J$QFe`Wo ziH#IV34e; zr>dD>gUY?N#;~C`w80sGjGNpH2++%}F8LvM_-#TP0@MMkCfeEwYpPN;7n73mj7_Sc z9|n3MBW`8q^KU>0whayJnC{GmS%NTv;TgwZzJJWvcTXmS5JCv~FNoC8tfU7%df-nz zLCrwI)Fr`td|iTE^^De=AiMiU>T3~Z-k?_*(U)d~Ot4N|EqyQxR5Z;oat{PgFAEI5 zE3c0Ly_dD#$gvO(%ZjE~82>sPm0FGkqs{7_!+5}J*F-a*eAMz&)wIlsEG$FgUWLm! zZDE!oy##?PfO&eZA01k?MhuGN#=)eds@O8(y|y-PI-Hw0p7$@X@Did9m{&9pU|fji yp7x1M5pP2|e|R8RxO5(Z%n(8dA%qa}BlrtXr1ROJXnmVL}+g^mCe`%sF3( z2_d%>&}{<%fa!jsC-9V7YkyfviJHm3yGBpo1!u~=$y9)Y{N|INH(>w( zCh7kuJiHa#b3%uoIrncp-{?pCWSrr|zAELHa4-AUR{8>DrvSkeAeaIyX2KcZaN0Yx z-#aX3IfgzM|NN)m1^gMZ^rsm_E&a*VAd*!ml6^RmcmV(a000000002sYi@kh-gP&1 SW`FhBYy$0NklXlGsZJQ4!A=hmQeOxo1@I z59j-c>4VAD1E1J74#$A78)x_Uw zOVV>rPNTBYmhxT$6H(>U0b*RoPvT;inVZ*}YN@6Bk+@xr=GAk8+YBhzw6oeX)zaW~ z59QDS>e`hnf1R(iMb}$Gv`TH{ikACqLm!u{+9DkOmfyxrp<0Xa0#TzGYm(T-8dWcP zBfUaxv%5dYdw;offJ;jN0Pp2?8rrM2-R!!>C@BlsGU^7l6UOnz(vy!BHl2nxY8m4L z0oDK1!sij}a25YvIe3lXTr1CS5r=@{;`W$(9G(H#`A+rmx08s$o_G18@lb0jQwJ*q`bu_F-pFkA6$eV(tG@c_y*M^ll^U! zRFnP9=!27Z3!U_kWcpw!(hC3p00000000000000004(zh)AEj*p=dCA00000NkvXX Hu0mjfOrPYC diff --git a/tests_zemu/snapshots/sp-2-spend-2-out/00018.png b/tests_zemu/snapshots/sp-2-spend-2-out/00018.png index 518993a1e4c73387c538a2f58266982a360d8237..1e4be69934787c368c2b5ed677cc7f5a2470be3b 100644 GIT binary patch delta 329 zcmZ3+^q6Uaay_G#r;B4q#hkY{qxqT)1X>?n+#&pJ|B`n{+tq|Gad(LKx&MFfd68k> zN@iU_1_Y?kSUM%>N_yde&|0SVPeg0KTC<+`GClR;ypxJ)tTRd_E`K?^jv+Ld`96r2 zENsi0TjvsUMg2q1KJJ;z(` z-@Q>v*;C#xhnd%d`YF!+(f#<=&)Rg8I%~-c1+) zfJyp43Qupv_FT~6XU_SpcN+cpe;a3xlwZQ_73e& z9Us>`hCUhp`lsLpJPcX-(+r}P{$y$p$to1dJ{(EB0000000000008iBz5%2V-gWfE Sm5KlW002ovP6b4+LSTZxg?+vN diff --git a/tests_zemu/snapshots/sp-2-spend-2-out/00019.png b/tests_zemu/snapshots/sp-2-spend-2-out/00019.png index 1e4be69934787c368c2b5ed677cc7f5a2470be3b..6958c981b015b1ea976e5ba479ae4a4b4a5473c4 100644 GIT binary patch delta 470 zcmV;{0V)3D0`LQnB!9O_L_t(|ob8%XZo?oDL}}HVaQ`E5mwq521O$WadUxvgz7oet z&@2q>Bq0C*000000KADW>j7+#Qrfyd#`s4gxsh+{0lXawV2peLVvG`2^NAnp0i37S zJwM*vBs?I$0@M*+0rh;>bs^ybWQz2P{u9(KNL~FPy#jPM-hUe50%U6US1g9M1^okr zS3sWc>P947fQ+v687#;c3IG7`Uflg8IXu-|$=d4EszclzL;KFwt#-HIt^kF8DKz=> zFpmC|QJ3r9%IUWNnMT?ESFrq2N@@5~eZ^rsuqbGmF2=w zj|IrgEoJ^jiGR7Dac4ng+BVy1Ht~8dt)KR940002+PHfW9+YgJATxgi?t;9;t zV9*Clbh-G+D{b(wzcc)6g?%H|bY8s{Lv`lW+Rcs(F^eMle7HmiP0n+|9~RSyVK4nK z1_fBmIOpo@3fH)tpS;M%g37+vR delta 328 zcmeys{FrHiO1+k+i(^Q|oVPcl`I-y_S|48AA^dIsl6Obj)r2o`cZm17|9|g!kzw9S zW?exB1gOwhIwj~zdf|c4TBi3;L~FlVv!3`eJ@w+elZt7qGfE{ce>uF4AvBozK8Thq zY|EQl=Mr;8{X@?_?wQNv%lb!0KmvOOmz2)xce>Zxszx!@6tIg-va!D88U+Rn5 zyh;>R*B$mc^1Jki@k1-6YsM?ndam@BnVS`F?0s*(-n^`c@2Ss@`178Jbj6K~ij|I|L!UEucr(SzJy5&O=zU6x<5KlktXPs|8E+r8v_*1Pd7 S^YeoSAVE)8KbLh*2~7a45SvT@ diff --git a/tests_zemu/snapshots/sp-2-spend-2-out/00020.png b/tests_zemu/snapshots/sp-2-spend-2-out/00020.png index e7072e1b1ed594ead3275a47a5a7675aed293e8c..6958c981b015b1ea976e5ba479ae4a4b4a5473c4 100644 GIT binary patch delta 470 zcmV;{0V)361MmZoB!9O_L_t(|ob8%XZo?oDL}}HVaQ`E5mwq521O$WadUxvgz7oet z&@2q>Bq0C*000000KADW>j7+#Qrfyd#`s4gxsh+{0lXawV2peLVvG`2^NAnp0i37S zJwM*vBs?I$0@M*+0rh;>bs^ybWQz2P{u9(KNL~FPy#jPM-hUe50%U6US1g9M1^okr zS3sWc>P947fQ+v687#;c3IG7`Uflg8IXu-|$=d4EszclzL;KFwt#-HIt^kF8DKz=> zFpmC|QJ3r9%IUWNnMT?ESFrq2N@@5~eZ^rsuqbGmF2=w zj|IrgEoJ^jiGR7Dac4ng+BVy1Ht~8dt)KR940002+PHfW9+YgJATxgi?t;9;t zV9*Clbh-G+D{b(wzcc)6g?%H|bY8s{Lv`lW+Rcs(F^eMle7HmiP0n+|9~RSyVK4nK z1_fBmIOpo@3fH)tpS;M%g37+v#6sf**}fsLZ7<_@N`VTX6Yxu%uhB6X0U?&o~*mOVAA@ z&H!KU*$YwP32=Es?u=+{|p)jy_)OqA#-gS{|t1h;@-YJ_Rd3Ykc^tcts}<;%G%DpbPgfc8h?j z)%~bjD~dN_uYWAn7UC|-;?2?H4y-r@G1+#AG;tMq?PC)1N@H?&FDOi7s>;!a4&|bC)jB z8Gzu*-jY>?=Trp+D;J3go_zi3>d}t@)pB22dGcp-p4*vJ)+Q3vbNt{R_PhHveyq59 zMbyq(a$e$xV~Z_Z&WU8)tS*~4QM7*Jva=1}#P7v-WXC4u)^0aqJ{Fbq@gq>MCN*P^ zY*4GO*YSY$dyB7`J$$_Xuh`?thu`}b_PQ;~y7Dpbr^K$QfwBer1sE87vSf_U-I<>0 zW;W%{vaRuFYcFhk9(u%yC)Pb)I6mxr-f7X(=Nal<19vxW$p6U~AuF5EbI8Tdull6h z=X=L5`2FnGTb#X8ZRVTRnoDNA(O%4-mLxi>v$jI*5;w@7NWkV9_sea;Vt=%HB0!>^ Lu6{1-oD!M)jB z8Gzu*-jY>?=Trp+cPO zexfJvlv-%Rnvm!R!uzO5?jhu+Jy1U18mbLHNoT!Q+}U3%V47yy7t`acR!Z^iap z(BWs!`K@;v{rG8}fMA=nu!u^lLUG@VBAxsEKD7H86eYHv2 zMq?Q8q#*zR000000KADG?Hjm2O6k(|F~%?5$wGd$Z{Y1v0A<`4AjaszYL575-@tup z-Sg|Ki-ZN-&j9Z@o&oiE_v=EA3y>+&d-R{+-GaQUA6(A>zkdsFjpG7jYWMe84Br;? z4{$sK@_6@dM2-uP@hg1>3sQyx006ufbB`puyP79iTfJK~h`DX3>}<_yw*+$qD9EYM ztW`Y59=$E}sqZUHilvhpcdK9y4Ho~n=7Y}t$!ppm<)-9S)B-es{7n;EJ_;znh6 z;i$y|WX6^<{(qp0v7a$#L1oxB%V{?8dM&Nr%8v&p76bqQ0Ps!}($M8QMfrtC$xmtD zW@4p1?Ct|(NU$n4kg1W(h{8dCr})#6sf**}fsLZ7<_@N`VTX6Yxu%uhB6X0U?&o~*mOVAA@ z&H!KU*$YwP32=Es?u=+{|p)jy_)OqA#-gS{|t1h;@-YJ_Rd3Ykc^tcts}<;%G%DpbPgfc8h?j z)%~bjD~dN_uYWAn7UC|-;?2?H4y-r@G1+#AG;tMq?PC)1N@H?&FDOi7s>;!a4&|bCQJTxLjV8(0OTIZ!D5W*+RSFeH?#F9>*1=SmyJu1;rG_^l8veGHzyDo`2=CF~;amO!pqf(yf5> z{5q97IbH->Q=+WzTS!+x_0>1SEsD=Vv;xW}x~vRN?><+1*sFBg(C!|z^%4%B@>Olm zzCL6d+PXt{x^Gu;oPRWG0*(g(0H9BL8oF@yd1Y6(#o4@;jbBCnP1$Lh-?imJ5P2%~ zVH`3SI*#70RcTDZ9qP$1OhEQemh8xH2uje&n1G8BEZgj~E4$8apxY8ZoR)o&XXwPg zMbW&wW|GOiOeNK1UyM086IJL;yob+3dI10c000000000000000fN9=;@jpF8}fKvAZeov{BUv6p^CV<8@f25_Kr&sStx zNNqw8bq)Xk05JDsIamlmuD$mw`uE<)qr}4%N6&*-C)4k(=GSbb>!*(Ywpu@u%D5^2 zu-+WRcnJ@LU&&X$~`=}kQs@z;wfOX7p0 zEMk2aH(l-2$awfz|F*LWaC-LL=>_-#2NysNx8*{Q?`fld#6Fdr#Kr&B6ys-DI$vtr zlDw%iQtV2JKfVoZ^t}1g`W>oCCi`XzsV4izsKJw1g`UKF_(`M}000000000000000 d00013<_!r|W1aXLh|mB4002ovPDHLkV1jGExwQZQ diff --git a/tests_zemu/snapshots/sp-ext-data-after-tx-reject/00017.png b/tests_zemu/snapshots/sp-ext-data-after-tx-reject/00017.png index 518993a1e4c73387c538a2f58266982a360d8237..1ef49baae7efd0519feef4aa9231a01174c6c573 100644 GIT binary patch delta 257 zcmV+c0sj7`0;U3xEq_~%gdh+FP^Z&7VgE~FFa2Rc7{l~)nxf1(Ux*1Iw-nHA0|0>O zexfJvlv-%Rnvm!R!uzO5?jhu+Jy1U18mbLHNoT!Q+}U3%V47yy7t`acR!Z^iap z(BWs!`K@;v{rGQJTxLjV8(0OTIZ!D5W*+RSFeH?#F9>*1=SmyJu1;rG_^l8veGHzyDo`2=CF~;amO!pqf(yf5> z{5q97IbH->Q=+WzTS!+x_0>1SEsD=Vv;xW}x~vRN?><+1*sFBg(C!|z^%4%B@>Olm zzCL6d+PXt{x^Gu;oPRWG0*(g(0H9BL8oF@yd1Y6(#o4@;jbBCnP1$Lh-?imJ5P2%~ zVH`3SI*#70RcTDZ9qP$1OhEQemh8xH2uje&n1G8BEZgj~E4$8apxY8ZoR)o&XXwPg zMbW&wW|GOiOeNK1UyM086IJL;yob+3dI10c000000000000000fN9=;@jpF8}fKvAZeov{BUv6p^CV<8@f25_Kr&sStx zNNqw8bq)Xk05JDsIamlmuD$mw`uE<)qr}4%N6&*-C)4k(=GSbb>!*(Ywpu@u%D5^2 zu-+WRcnJ@LU&&X$~`=}kQs@z;wfOX7p0 zEMk2aH(l-2$awfz|F*LWaC-LL=>_-#2NysNx8*{Q?`fld#6Fdr#Kr&B6ys-DI$vtr zlDw%iQtV2JKfVoZ^t}1g`W>oCCi`XzsV4izsKJw1g`UKF_(`M}000000000000000 d00013<_!r|W1aXLh|mB4002ovPDHLkV1jGExwQZQ diff --git a/tests_zemu/snapshots/sp-ext-output-without-ext-spend-data/00017.png b/tests_zemu/snapshots/sp-ext-output-without-ext-spend-data/00017.png index 518993a1e4c73387c538a2f58266982a360d8237..1ef49baae7efd0519feef4aa9231a01174c6c573 100644 GIT binary patch delta 257 zcmV+c0sj7`0;U3xEq_~%gdh+FP^Z&7VgE~FFa2Rc7{l~)nxf1(Ux*1Iw-nHA0|0>O zexfJvlv-%Rnvm!R!uzO5?jhu+Jy1U18mbLHNoT!Q+}U3%V47yy7t`acR!Z^iap z(BWs!`K@;v{rGQJTxLjV8(0OTIZ!D5W*+RSFeH?#F9>*1=SmyJu1;rG_^l8veGHzyDo`2=CF~;amO!pqf(yf5> z{5q97IbH->Q=+WzTS!+x_0>1SEsD=Vv;xW}x~vRN?><+1*sFBg(C!|z^%4%B@>Olm zzCL6d+PXt{x^Gu;oPRWG0*(g(0H9BL8oF@yd1Y6(#o4@;jbBCnP1$Lh-?imJ5P2%~ zVH`3SI*#70RcTDZ9qP$1OhEQemh8xH2uje&n1G8BEZgj~E4$8apxY8ZoR)o&XXwPg zMbW&wW|GOiOeNK1UyM086IJL;yob+3dI10c000000000000000fN9=;@jpF8}fKvAZeov{BUv6p^CV<8@f25_Kr&sStx zNNqw8bq)Xk05JDsIamlmuD$mw`uE<)qr}4%N6&*-C)4k(=GSbb>!*(Ywpu@u%D5^2 zu-+WRcnJ@LU&&X$~`=}kQs@z;wfOX7p0 zEMk2aH(l-2$awfz|F*LWaC-LL=>_-#2NysNx8*{Q?`fld#6Fdr#Kr&B6ys-DI$vtr zlDw%iQtV2JKfVoZ^t}1g`W>oCCi`XzsV4izsKJw1g`UKF_(`M}000000000000000 d00013<_!r|W1aXLh|mB4002ovPDHLkV1jGExwQZQ diff --git a/tests_zemu/snapshots/sp-ext-sig-without-checkandsign/00017.png b/tests_zemu/snapshots/sp-ext-sig-without-checkandsign/00017.png index 518993a1e4c73387c538a2f58266982a360d8237..1ef49baae7efd0519feef4aa9231a01174c6c573 100644 GIT binary patch delta 257 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 N002ovPDHLkV1iEA_)7o) delta 18751 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 R;6DX`RFz&UR=qF{{y+Zv?8^WE diff --git a/tests_zemu/snapshots/st-1-tr-out-1-spend-2-sh-out/00008.png b/tests_zemu/snapshots/st-1-tr-out-1-spend-2-sh-out/00008.png index 6d1b10a3f195a9bd1118fff1189fce55d93b5611..cd2f52759f160c3e2cf6822395ea675b8c84a851 100644 GIT binary patch literal 5467 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ℑ+ciB` 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 wBJWvvGbBq1=g2#G^5&Ys6uM?$Fo2Gz`XC;$Ke diff --git a/tests_zemu/snapshots/st-2-spend-2-out/00006.png b/tests_zemu/snapshots/st-2-spend-2-out/00006.png index ffb1f570e4d95b204d2a2e0fc5c0df8b62bed4cb..a72927492aeaf44dedc947ec73f6ad012d4916a8 100644 GIT binary patch literal 11290 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 literal 18607 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 diff --git a/tests_zemu/snapshots/st-2-spend-2-out/00008.png b/tests_zemu/snapshots/st-2-spend-2-out/00008.png index 6d1b10a3f195a9bd1118fff1189fce55d93b5611..cd2f52759f160c3e2cf6822395ea675b8c84a851 100644 GIT binary patch literal 5467 zcmeHLSyYqRnxzCq5JO2_MUg<&wG~kO6Z4?zOu6rTebF54~1D_&=WSob#Xa zop0}NuYEfh7O>vb%GAKXVExe}2TvLpd~?shVAaF5tAG(Gyrb5@VB=qp9z1Y5qe3Q> zBR(duRcEsJf}g5yhOIias`Qubu_iDRf0L7|iof4}#3cB7u`?G}hpnIf$?sr*_afGs zXuW>iVj$)3_k2C13zu$ zN}m^w>KAPOEA~&o-CagF{#ke6wE|okp7=k2pV8$eWKuct%3<63WpXH+Vs!RKIjZ=0G0=7W7QSQ%90%9A6}LBn=9NjL!MX z!sQibjzL8GC{K_QO>ZG%#X7v zlJH4>R%WJ^`d-)BE2tXmGJzA1jHwtrAKC##(MFtit3)C+yd0uUy zjwHpF4_YWRno(Nyo5g#JX3zI_d<@~Ilfo^d`&fIKE@5n^!Kq-88g;oe=+(Nx!^pNs zkZyk72?Hez##2@3f}V3Der-%<426%4Fd}U|5O+@YNQMILhhP8b5t%$OmjRtyUdE36 zg3ZdRleRxlT=q&H_FA{%-eL!sH`PLQ zUzGAGDr%XW7(YKV)6n6``8_?#W7~Tm%a&*~TDzS6VG+v{u&xa^HUvj^j_Wt}D|oa= zCwA0G+f#OIKQDWFB_kGrD7jlEV&_TTn6Rm&nd7FL%66%>xV~50aja0IBArGoEESF$ zg1XI~V~yBdO+lF!YDix#`U(ky)O`GvcEjiTLRVkId#WCT2EDyVNt*|cBZ{{_nJ%&k z7JJ=$CDMD+H>s+t3e4Vghwk*vt+2pKi7{@M+!;e!tB|2K_A3F-- zICg)R$%(K?6zvjC0DNNS!MO(+(%}9KjnCyhj}t6LXbvh9$CV!Es~V3^@cf24r&KQ+ z`OHi?#n#pquD{H+G4#&%7=E(A%p5uM4hbccA|ciwb8~awoE6>NL=T6<5ekKr7-pV_ zpUC$eW6oo1)dbgc>8fGwRz2!XK%)=)YFo!L4Ufm$`ewW8dG68;q(Ug2Ld)_N|5);y zw!=!gpqZ{J0l?c9IVKW`#>P|}$+G`)>sWi9+lQbOW2DKj9YhzQ(Hdtn!kI1Pu<&Cbn8|P`)EWdF(@RSetXwAZ3g+ld zJ5oeu&&UZrL<(Ojj;&qJ7C}sz*bGe%XaQrThKP@}nu>a#L5OFX!qQq>QFLKEHQcd` zlh8l)3=(HTA(Q2W80yG;Jz*o~#EG7Xx%TtL>nx^GbfRyLyC~AJ47iK8KR7&Bk*`!| zeY*W1CV43oBN61rV)J<5FPznZuw01Q{Gia%}ehJ?zd#y9xOGtWzN2}2l!!NG#KNOlhJo4#n>>(BKzq{ z9Bfs$b^OrgHY8d7C>#bWs}UyCbUiP#221DKt4gDy*o6+h%dfaA0^{Pl4^}>I*lZ~R ztqEgmj$w1^WSxFU{dZ%@w4jMrfvoG!CpXEhVyUT_*}04ddlLPTi`C4FHIoU(oT5rB zc=U$))kI^rS^Cu}gAc910sJd;S+^8lI+dR!s?|?M%f7h~qxvvyD8T$a2&zjxk=v}V z!G0URB@43|OZqDfIaVqDQdRoHLX-o=>oSy}TK~+Yk(s7Yc2$-3L(&}Mt_TGz16F&t z2sGTKrrG{kS)F3Cix-MWS1Al+C69UWvPErkWV&P1)rDYvi{ou{<{u>}v7=*e&i*jA ze-wp3Ng}8tm;bH$8s8BK%PQLe zOrA#a$>Jd=eWw4`dMm8G+of%y0uqU&5skuysMcd7CzzxJ0{(&-0}Wc#CFbk4(H+Ak zPXMnxFd&EsG(3I;`P+W5PAZko;zH7+&^C(7D)&662(RjpoH2{KTuJ*<2g&I}7p|BX zJqM6B+=NM>2HYj?_61)nRdm7M)RKRu@B!u}aU=K(JRUEbDX-uyu2i|B%RQIh$3h8= zj*fizfZctrL>4r0)*bKd>&r~90bO`8$ay*RyEKJ6>at+_LiJnvAE zP#{rWlejzFMMuBWaf!a#<(27M(l6~kTAZu6uwK`KJ)u;|9P-j<>eA=Vasb*-!IY?B zNfw8pHia}A4eOCGmgMf6t=rtT&ut7Kn9fdb`pQ*L>lwKmmtyU$mPGf&T%Zfbgu-Rb zf;17w8Uog~Gnr1~8Ch9L4STY^Y|L@~)Xw2Rr9$zR@o^~)>Oh-KDn5j63Tp`^z-Y!E z_@D2yOUcB`hD@7 zaq;ca{JvGUV)e#PIS6IbIhSIT6J(+wA3`_r+l@G~ z^Dw)eEX`>BtFE(u)KS2N0bBEK8`;CvOLg)a9jcJGxanS~_CRz59Z!I-*(wWqZ7yn4 z?TFhrJ?*I$PqX_@@zbfBcr+=AOl}rQ{AUg$N@cm{z{ApX7cvi-)ZGR&{*rPTN_z`E zzncY6DQW+^C9#n`Hw}8}ZR1FiMrDmgH86Yb3y#4Lzwditln6)=d4S%PE*xZqhbLKx zcOBQF=$)ONQS~9)8>DOTX zf?UM(b&eouK;MBq|5BTkLmkOCAASje(uFhLtmeFp0gWdeHr-KYF@(t;cuq1+x(CCl zlEC5coT=H@x$ISW>zc#%gw!HZO+UrRcIl5^-&jW`t8!0pHW=bL)mb%*v$M`wR!T|Y zb+-qBA+(`0KJZHKvSzVah>!S+GZH~=(ZI?&jrTMg3$sW7@`)0fP|D3gpjBC=}i)&8W z2=ba*DlGvfd^z3Yv8y&0v?b`rurs5AU_(2LGVg=7%^ZZ!($^q z-iH;lpEJXLi!`@Cf%K=e#j2CsrCCg+*vH#@NIzWZFPK8q0^)2xHv?L9Slcv-*Df<$ z*gS`3hV%@gtc8*p884`Os62>35DIW>eYWS%D-;T#2wF)nir-M=`Q`b)-DF@7lX?iK z9Tzq!fEo}75KPM1tg)6#1dP}AxxHwM)&{{}P%5cHSrvft1kjDlYu6xA@MluZ)YL_$ zC}(NzQF@eoQOh$N$aTPA-xwKl4h>UdJ^@qp z6}Yt%oyc%4sP4>vm>>C00$iNvyDY~1!56v zWx9JXhVn@9TLz|NNfi_kI3)o|%8H>zcXFXFKP-&-}IxlPfBqAIZ<8q(6EB!OK>^H zG*39nZ)akfPw8fP#u3MUg_nirp*WielNKk42`&I-8asz$sx)$Awn_Lu{=*NSbrvSE z!M*79qU#fW=3F2*U1z~+qzI9o+RZZN_g*n~tA0`IXiKA&6Lh71chz(pM=Hl`)N9|>SP9rC%+tk20 zdsP$Z4Gi(%c6mqc<$_9oa~c6J*Gj+RC`*!> z430^)(n?9)2zdL~em&e%eikX)U+eiFxB1HGNZISyf8FX@+7R|hZXH?~4)3J?+1$oc zFCw>LYrfz0Cd_g`EId#?AwB#uJ=&m@=rh;a@kV1NE)n+`t$~Eg|DZ2f2UH^B#YNOI z-KP^+?K6^KV`A8=EIc;Elsq`8?x#7!)lc**KOp64up0aDf&F5LUnCJ&Sfr&RDc?wy zs3Qve#v-Jy+PpZFHjB2q;>O%47WOcTMD0SUuSU=yl-|(;P7p*NRW`to?K!k8^%oaN6JNf)Zr>v;uRk!+r;H3k}{Z^YE7L?oL>c>Y$ z*LeYD8pA!56)T^3H=UAW#LEM%LCcjiBUg$m-I-HI!O-U+*Xc*I9H-*g6~_H=R|h*( zN*NF3&f_!*CEB)^QkywJZX7QsUql+RoyD|9Z3dT`vvF5wIb)2}9E*_l(7nma%vdooK~JS9p2y25<-Ktk;KZ zQpG9f6M+dP;#M4si@)N9BAl89fqUw`SavJhSX7zlk^r>Zzh5k!tT_r#YlWq4eTe+W zLewfCk2+F)5;n(mW-rD4V=di7a+RKzzGDt5g8$M4bhZ|J`vPD@3Rm5jU7%NF{l2aI z+VMl1Vn?C!Ussa1avh(X%mY*s9M0=?TS&MB(9^P7cO6R)8-ZW?<~9D*_atytdfRin z_xDw^g*QUX34L4WK^t(cT^14%IgV&GlB*OjPTd~LQ3Gw)tue!V_h*SkVBm0cYg&T1Kt!SU!17XGDy2EA@%`H! z$ba1h{XZswQrgP%F!7hG7<4TqE_uqnjz0m7xD#cjWoaI<;Ke2q8A7bunKW0~GI4wU z=;Dj&aNk~$Pk%4-IrN~(A5;6JAU#)`M=XM>WbvRst3@PEK)-$v)FeptTYPHjHjF)d z?0C=gi9kTX8|q$kr-X_!eN^B05(`f{oI)wC40hzpPZVJjSxnaV9Q4c~c+MQ7MbnOGxWK<8qCcr^H~IL|l4y*X1AV9m^wRYeg~7%d_wp%_9>A z>7U)fp=~c_OATYEJj!vZ?@yc zIqZjw-=Lj%lvkf^vdvxmHT2QiUNmg-{84CH=JUu&bEVtBN%IaUJxn-}8RcI48fy9oezwEi-~pF-iEhF!pc`@! z+6XJo8O0x3X3ps#-N)_A{$LFE;hK-#YT`@gbxzQhcl;v$i&VvTFbhwelBso6#EDyC zY;lS10_J&4#q0l$Amjg{g&zU|l9&t1i-69g=p66K;?}5{UfYS#k3aWUnL*u&|GLwkEbxF|SOa zy7p}-5j(MpMmS*Xj?S>2;jH1mC7f8b+*Cw1fiyY1fWIhLoKMrqz^ty+@H#48IA(wI zWZDqy0?TT`(>h5JlLhc39IsbwwaYjNZhb1Pm{LXqQO`pl!go|e9S^r7l})q5aKM7; z72A;k4ZyVWdz5o4nZL#`$$5z=1QmL_+@TJ(vs!tv+K zvda%@i-WOW5|=J|I))pRHiANGX1;~D)AvA%dlC9WHZ=+XIEEjOiadr2YzM(9KH}qSl^9OLelgNONoWUiws5~>dbr28rhKh z$5V2r9Ssc)(YmKh{*LJ~EVcr4aW8syV|V8~tbL|dA%$_!Ik$mT-)x@7ZoCM_`D=2C zu7!a*4sSm=IMA{_424AH*i=L2=H^^oUGX77X9Von##y`^y}@tl)$c*qz)Fp;rm@TH z7jwT`G`u~>;TK1B1O+GCh$Hc_4fbqmqsX{@7g}?FjT7>VdG@zmhK%`pJ4rtgzkL#* zZpA|{m@T60JeO3-*Sxo zh9RQ!VN3MA&4^H|S1xruYRBW}BlJ0p9?O_Bwwk8{8YkI|{^*)}q<|K!2`GJVTD0}i z8C}UgRV{uhT2+v2E68waXIyZgF=VXu<4mBuhD+VV=Eb|*S2x2XWu@zY&^Eu+;N(Eb6+i6nQ4fga&8Ly|vb zEu3+9=z_J+9rW7Adt?b8L!Go(q9Yz(2o+26E$FlZ17SgWDejTFU|-xeTA!G3?(u~- zleYfyC5&F~7$4lne>Xy(rhh-*0p(nx!x@i;o7E-z`S6RsQs<1HUK3$65;n0EYVpqy zUQWahS_Q(Q5VOFE9Yrs!a<*yH6HkV%Kbd0buqTD?WyJ4hK+i6(^)wV&Rh;9r$Jnj8 z4qj%lC;K-~YgszJnqGTvnsi%8Vi1L{3TvsE@WV)78&{$>Ur4s+axHA>FtMD53Mb-2 zKI_!(XodxjY)4`xebH{~e!rAx%4-(zt3vIuXG|c_O96P8BQgN#@P&5L@Fo)KTY%!P zKvSNFtA>fVbcFOqu2NWTs));(H%zZt?Aq_i)LphIF9ncl#&umjS+~O;Lk?`dnQfc_ z^E)Y*;2Eh=pT9ete2EpKz-^1$jwDR44XMWJYB_5!#dHf+@6w0i+Ceda$0DM z&EI4P-gJfcMy^v>Ffatl<88FdWt%Tj4r|Fvw{T?&a3{O*ET0?D1Ky|Cusfl_r7Z_f zR-F4I2^o}+{xy_EeFmHT;FRpSnnlmG-FqfZShUpTBkwq_Vi%?0Ir(6mV=Jh9Z#-C{ zP4sa1*W$EB39nWmFpUin(-9;)7h+l;BWIx?mxNWv8IbP0h!-9FK)JhBvG z)B61aU>4hvTBoNUgv>g(`#-aAd#eqzy-_ta_@O~+?>qkF_KZCKT0l9IBZ}bq<6H#+d#(oiX;y2tI!jX zx14USNEq+K78sKCCDOPyDk4T-66@Nhkm4MPpw^LJ;AF+CW3vOZ6jG{}0_u{T#=><| zhrQ_s2g-#$v}!`CT{!ZrR)7^r)$qhxdP^y56+;_I>>ZVP4mQj zSZ;D@EK#TxHrA9*u3sc)t*;kKdvXPnV?SoClkcpFLC4)TX(`n`pPlW;{7PFgLu2hb zwRYba>B}Z0e@VZVwT*zcX_%QbRi@M_;|r)om$V7&RmLQMcYM2}M{4R((!cyuDkv zw|Z_@(7yR^bzDhUGsXNyXNS}-QtHX&QsPJyS82}uVZwJJ;QC4rbc?O7g$YE*=WZZ# z<8+m!kJI&!_V-iD%&c;Dj;U=G{9rG(X8HQ5Xk}|Xs^-9#msNbnoCDCJ@3SOv37#%o zg_Z!c69>N6ogCLUf8qSUQjU_#S`pP7W=d|%Ex8{=33}yU32%JLlKv;D$)twvwwXX6 zOaMNqjwkj%V}e5UC8-GP%`y;fWT{cV*W=sLE$dfhA~YPOb$mTx>hgS#10`pQ@N{V} zygetE3QBHp3IRf8{ZBsMa%(JKmB}?vTe@8Ek$lDQE!gS)=9=zcu%-hMfzrl$WwD&d zO>#8&EGy>VR5EQObIJ!|f40LB$?!((3{d{2aT8ZkJ}s@;mBTX9jeI5gf}Ce85c^)X zn=T(k27DaCYujq5f1{P7o>9d(+a#fSvq{ZF12;rX;%-4h$h%_x!s2`fV(8pjICbVW zk~@q<>E76FCtuMiwjvJ%7g|?m@^3h2F**n-x5Ef77}qC=d(DpV2!|Usk$2wH_bfV&gB?9%{DZP zo6R~gP;cB5NdTZ;4)?nWPyOg!q`?}Oosh$>O@!@29nTNd#B z3YmRDssOi8JC1eu2F>>(q{*8LYP`(BHPU5qLzlk2H+&mBmFwz1LA!c+Rm)V67awPr zeq2`sV{6Yk=mm@qmzs7#a@p9bzmL7(&|={ZpS%6F<*Y=PXs(^%jLXB1t;c2&*oB9u zXFb2uG?(?QY7Fz&yWqaq9y@dm^6#;A0CbyQB#wHBypD4&xrQkf}y&b)IYnQ)CKfU;1qVq?^a=;bzWiO6|4k6^H#Ve*h*;j%&GPRd-#LAqX`Ra8}6$LT$=so|hva)$Bp@ zbbf8Ah@?w=@k_G-%H|(BPczj*J`*}D1~&SF$Q}|0YuA{|6u=b0NaYG$kU@=-Us$mSi{t;v4LUzzubMk}5X0Yto62;vl+gTXFceld z>1>jH=?+OVr_t}bZ5j2~L47N7Z#VJG$1}!*nmm_iGyHG4-fMtJp}d8|PH(`jEJ{Q= zW%J&Ff(c}7a$BJ*ii|j$Ik2&@p_90#=8)y7YS(TxYkmw^D3Yvv(DIu=F%q>s2EnrC zu3y1Xdk-b5^eMiI*rr5zRmf>q7J#?}HczjGI~}SKLnd97yUf5~4bJ#sZ;$Xulo!CZ zLS`f`nPq+P!8)W{>|}2nXMqN15&eHrc0YH*Ps!vj?RhsU#vU>lQ3j<{5s|%KB!6#E z2Mk+1s9#D%Q>vnDk5+&0u_j_cr{2u>CB*g6xnvjES&D-<0?fC%7yZ8WqDQ!&DOGz0 z1>ubc;z!DJ*m_!)Y~E`{W$Bqqzr2x11KTN;4+bMn!Y1zaw`U)bjnW9O`hIQLc4MG$ zi`M8t;^hwyJojt>!$|`SC#uLSr`q|rUwKq()A+s7NrW&I2uK|cW;SGj1Viqi$@;@& zN<`P3;Zeq4g-SSy)Gsa9hIHo|j(P5lXT}zwv$Iu?p$2~~v2h3$#pOE9N?4yc{YOvX zahDR*$!$HW>bUKi_FS8?@gNU*`ckMKf?UQo+o?PI*p&TUzS`}{*)3QWO@9NgT|*txwMXf zRitWzFS+bq+KXYYe5Au#i&CU=$oGKQBPoiFY`&XG%;M99n-z>p|B&aJK?%U;tGpWq z&(8EnG4srO@M7w=Ba!VhKq>}d@#xbTK{lgonMTcs%OF7<+hJ&17bUnAn$ANaT4p`$ z`(95v!vt4;&d<~R=s%@hpoMXX`}xyBuo`>Jc;)`#Az!>(*Bo(Hl1=zL&ifC2$@|TP`iC99;<=_l29o@U4j-SD?Z`CGIS0r) zCC~Dr%z+mNT4mQ69NL6S6&)%A#KQ1rjD#yx_39vrsO>ixev`A~z2!nO_adB|DLo@3 zO}wBx!DVpurZSK&h%Uez%FV&>gVKay+jkh*I^<8p_T&P<;yRSzXC(t}NF6o3(zLYQ z>u6geW4~@!ZZi%7cj(k$g!Zm`er{msx;l`AEhx|w^kYm7s;WBHO<2}FQJ4P-$4{+= zn`h^>*08@nh2g6;Tx!KF--!;4Cw2||58+Jo9!;Yje1yEd;I-rCAg_Bz&dG8M=+N%yO_i_i&B7!MBu~M@CTcVzFX;qw+kA4 z!)?n^y#5HMNIXDH3?=z(FCb22=_?+Ex95}J-TO#m7{IvCVf`^o#Rr=-d(VCsi)757 zLb?)sYYrULwmb%|X4-Ynb({?%{7&hu*A-idfm^niJ5y{ET{3q8a-+rk^1G!2hq8G# zz<7Zq)wC34#LEL<9w@H{elKNecQ$omo!Q)JfaR~Xa3x1`m}QFG0voU`SFOt7PIc9h z$u?FK&(_Zj0(|G$Xy)wh$=CS8McVr3k=(+Z)Aq`112plMi3(144v(fTTHRzW*uj0f z<;(i&n-JYjd(AoxkR}XBdlU4@7Uea)rcI>Fn5*Qb>b@?x5cuDDNm2cyo`t2QrI%}B zR|?Q3tfajeD;RuqU#Xc^j#t1-?$z1d$(awVzW#1$U27OfSuBLsvM4sm`Os_W$__u6wM5JSGv)?9rC z`g-oNbNd2v;Qe)ojG>`mL*X#mAw*DB8rPq*)Y`Gu+PME=bhBg9AMiTVr;n|ua8rx0 zetjZfhG9}bN^LvQ8tuhuxwUoY>6T}HxrW`_0Se?y-s~+Vt`^btRp+{i>=F%om>~}m z`T~ARZb~zVp###rT=U!lJ=d&XH*_zI)h>!8x7rh_oz??>@oun39BvB9$yaOWCl#`` zhZiC1f}qMs=y8c+o;WQjjU6!DexzYV=i7?egJl>hO(Bz9d-)`_Mw`;-H&ADN3Oa7K z8=O@mtkHOrcpHBlt?hYdK&^CQwsOp`ygkb8^3l#DiP=z_#m^Yn_r|1YM1|9~%NtrA z$hNSOpkgnaNX{h1s6O}l-W@qUb5mgwQcQ6Eu|l?&4h`K$8zfw&i4($3jkRx`2Mn))GOBhKV1^NR*6bs~L`)D3^HNZgfsmJwE) zAG?pJMTkP%Xp$dB^!kRl6pkpIWOKf&#*;vhOE5X`|9M6H~}?2Ie%JL2$_n_ zXHBhSiC%Q_AJ*l=d?J{_m}f7PKBv31lvX5B_i{Ly?9i{YJna0E#6^7BziQpL^IHL& zH`AK;P>nh3;FyfL(iN=`5$hsH5<7}NSB&ZSz5SsA1suS3v*bo<6j@T6SVa8a4~bvK zMSNoUeqK&zQXVdNivT=q5Q_fPU8c?%{gUib^OiM2VqfrrL3ej#c)TgFbJ^9Xeg;R}ciG zTf442Q)Tgk(DaWE4zP#lfad94+kTMtAeg>D*?dda=ZsfKd7~EXvv);)ABUoZwxGI&YsTK-bmYt4vmZxxkpQt{{bQ0)0@GCeQ226oy12TbRqy{ z+f&i^;%k0BSL5+7XsI#<3NNTKw6FL;5Mo~^0}C#cl{dd7Y=VePrsT@^ZzWlB6#RM9 zE#`Ik4ZBO}z5~NQV2^(d6^M;H0Z;+}e1M|H2#rp+EioX{0ghoLmvo(NTrjV(NfBFP zXinL*T-|Q_WF&Xg;jCgg!3_j!?=k?+Q`R!KA$L7CHWt$;kvTBECU+1-t)2{T$G-Xz zX?gr5P|H!1FL&ci0Uj|QP=NSon3%~RZFJt~jEv-xeK&}?_`6}On z8?nyWGP#3&HMOs1$NcWzGj?;A3X<5^WssJ~B;j5V;hZ|NB=>uVj+V_XLe~^IGGfY3 znMN2$W&+^uunA<%GX*hG1`1mK7>%6*u^T|mQ(&Mz^ks8VzPDNA2Xe3k(YtY(Or2AL zp7J^3x+ka-SLOVa0+bJ8kjVV{4XRRdW6|{Vn*IB8>3B^`uOTD6x98RhsKVz!$fgIz zviuXpJqBcAo|~IzdpgR!n68_^w1%O>i`v3o@sBFqS5HO|T+U!3$lNbZZNt)Af6Wo7 zr@F6i0Od8gLaT}=#yz{c&8LpJb_#u9d!#?}I=XWv@R+Lm+RLGxCGr=9OJ_Hb6l%Q9#()Evn3(WxtXdoaSnE+^^lK~cNq_C5Lq=VcD&D*lpsx(ZH27h6 zdD5w1*=yIQbMN;TNM@P}wHsZ#TtCrk(ZifDI? z%9h8ArcS=2w0$`m4$!2YB->|< z&wO_mL;J3{$a3|3k0hX;lvN!K!hm{7ki>%>pPXZ)LdSxX3BS9Q#=L%2>$~mx?$-}} zgI`DA1q!SOoz(C?*J4{B&<%cFU2WG|rcgWKxArE=GA)_6gv(jh8H8B`^0Grv?9`3n zLXR__d}5#TbbJby2*3OFsvDAfb^qM6zaJx^6hf)^Lp=}uu_xjp(K6}w1K!?s$UoOkDK;$~)hLHH6E^dEl4^Ov7_a1UrNde*NHXClk<1Nx$~?5Q}= zPuR~5y5QJ-Oq{{{{kN04>jrtpV(|VW8RPa%TqK`8`Y*203wbr>X5P#^+LK%ck#6b5 zElm3AuiqJ%@TMl6$GMR-Ir@w(uY!4?<%*;WdBITDe0IO^pEuta>M5RkpTBy=O2@u&^VGB|O4Lt}*BE1tK z1fr;Pf`k@Af`Af22mt~F2!ylT-+#`{dCtv$zVlt3tNCQDm08z(-!aD+>&0EmTY^U= zkMi*F2%6o#agT@RKspZ(@7v#afh&4eZ52E`Iw58^{&*0X&mc3g#d@6mfcZFQ!CG^- zEZn8|i}5yp!k?b^IpW9*|NZ>!BlrG%{hj$S%Br1s;L)|?cunTqx0lH)R$JN6cshFP z`&kCOPt(}@Rajo0<4HK)w};~oT@&Oz_EhrVDIU$=lz4oP+w+Y4Ud!|T54Qt%|N8eo zK#{TUh}(;1ojkC6I!I8-?6TT1oCfolQpizUGDXxL;%F$F##R!=3A0jhXRCPnAFcjV zcoP39d_MkD_?7)r1it!JD9ykc@T>f&(N>e5UH!~(saaPvYkRj@lh(_M`BLhq5h_UM zM~OWh9dPIjiMvhRb3V`I>9_5i9hBlR&#OwF*?X3R?7M80$*EUEEB{f?q^sx+5=OnT?Gn37Rg?MYx0Ij?zg~ME}(8IRQ;~;`T zfl}(60p9!JvVFL7S8%?35A@Wy2FS)HUc%7#(f1&AZ?{sgFX|epIow&nZ1#o;+*4g8 ztg^LQIMF0Sp0gMCWt8X2$Nc!8BY8lB&f_PlqLE}ktyvQx<5e*PQ1DreT|Jikcz*iAK>YQ;yS!BpZAxNkQ zf(C}Hk~%lHx*$5ufCP|a)4Ft0ORxGQ#lT>UE~8qlC5b*C8jVqi?nG+0O4LsKhnpjFw=O-xS4K7e#*Haj|HBRfBg7A$$n7l{35H+_GSk+Ilx}-nHeA5kS>6KqkKI_zE@_tBGBeVv?Z4<7 zkzTmpUGM*(;dZ$xlCTHO9c$nvOLK0&A<=m2*M|Y)Z*Ls zFiL$Wy1=emq5hKxhs{0*FFhPoXM7~k8rSvY%|Z-hlZ&5By4LeT0&Y*f9DdS(S_;rj z&7JsOf1%biPN_n!&lft|*Yd?O!eswk#VD3{UkruyNQN(jFj28avr~@td@V|Mj==irg?*jemsxzA zI%ogqV_Nhr_Q|5K%*1i#&8jn_inzy3xTHB9k85Qwbr<7|G**0FY;4S874|wc>^h-C zH%AXnI|LjY*`BhDP)~TvQP{pBU*%%3f4-_-DKjntf07ZWeT)5R`u&RorwgU*huxM0 zm1tGkRi=c}pPva23;rNqa?!Rm@Z-#W=6Q)1RBCzS_%(I1kWDF83_m5|d8zP$%_vlC z_T zZ?t2ZPhP9B61cW|sV{`wMLV=+T=g*>QHhgUmgn-KUc0j!jGwwM5hR~>v$A7+CK77%Kb5i@`Mk(`)`Rvw6X)r~T7vR!*g zbrSXv$UXE8-wQ5}5~rCFQ1#^E6$}4D+pf89>OUC}_4^mh)Yy*uh1-1ekQRSnZ+p#6 zi;vTrpkE;h$IPUmlHT3}vi69#M~sCKh%4Y+3X@$lYr=HW*yQXHQUuu%hv5r|QW4%h zqa21S!3BBrR97AKbap>+Qv>AfAcrvxX?ZyBLf==1x#c|AJXm$VPObI65lEUNe$nit zcj2IvJ(@I7HvSHLi8d7=AY}7;skGapYi>29MLO-4{?Wu#d4(!qL=JFI2faf4Rugv# z*UPQo`2Fx0dxneNWjnEAG(8=1d*=5>ueM4p)MStn=|dM1E!4Bbc>8pf8O(b9I^*D_ z#zpc5>o8o#%mE&b3eHW!Hu=E#K2oH}u9rAyJ!z;f{X4L z*^6V#gCmW{mFC;-MCuh3@4GmpTNNt;*hVNz1JqX^vzkE|AJ1wTn`=bDpXf;ckOSvN z>-{mTL1wZ^3|lT#uV9I<4lLP#FcCjX(0CK;Q{8f!%5vb=5&fgtE*bK912-X@?U-g^ zWO=zqbBJbx((flm{t~^+TgIQ0V*9)5S6GW`U@rg-awc1#zXM%Z@NvuhN_spalO){*TE^{!ch<(Nun zErcF?W;%DzJa8O8AS>l~KD1F+L`Sod^4p64{9O-uGqo_!$F#HYx1JNvK$%2CF;A; zQv}e;LHKqv!o?KA z9|cC~Dpqfexp^+`v(RMaF4-Jq*WY6>`=3 z#q5z^8`s4j%dL|;5~RmA#q2qKv4*uj{LM1nDVc9OGMHxtEGJ*=svdl+rp_JK&N zSGbZ-G2)QbB3ylk4oqfB+T5$z%WyB20g+MYtFKoILg&SP-KGv1CNK(d>B|Zz*C3kt zLF|~sn46TC{oo;*wR(r)oP|H$dxWi*l)nw^b=_?!>=M-KOd?tR5p|LtKk77Q8AYv` zH(26UXBX0SQW?szRJHg615 zzIN_vqxLD~lPB#rZArSrf=c>Tyu!jFBEiyma;IS)+3!y8?DQXHyL{5ROe^zGczOHD z;gg2W3?lewWi<-36%a2b%&KvZ_!c4-;uDSG^_(^uhEj2D@tW(;Cykk#R1;;jG`484 zO3_5q5`81uK(^rWB*a0X_QJc-$8H9%scu5Lyi7KRn6&H)3PxEy_ODp^R_1|ihz5Z2 zx?$BvitF_Bbji^jYzW3nzu&cXtMiAc^EipINvBstL}LPBdIj7)_OvSi^LIArbh^1p z4hbzW2(4M0XdybSYSO)hjh(BNJtE81wVF5qx%-20Z)(xs?+VhdKH0PUDkvxu8Kij9o;g@w z=|q>fQ+h-!WyR7DbJ=a_p6otjr!8V4F(2mhr{SL?n+dDM3H3NN@9%fTJKyK%U#~uy zU~p$<#xSw)sKL|TdJDn>#{xA+n?V&!Mv%Dc`C8euMAY&S7PDYzx>RzO(Oth3X^<+j zBKCaa0P&N4o9hv!{m65P`_$={W;f;vTi{dl!cist?4_C_C_eOizYGGWrV#qwFnWe< z7zSFfttFC+H>rMy;2+3=!#*L8zJ#VL*?Eju&(vBuZWq+<>-*Zy#A}W-r|%;=o1lpe zRNmDPjSY9A<~}e_-M3*tSPnPK z5H+=im#z!uk%u)>TF{T*oXso+Upn_Knt4Abi<%zUE1h&tgy}gy-CRX>^-@P=>u%I5 zsjmi1UuskY#s8e}*V^PxG9Z1*ecW#p287$KQ;45;if}yc>gtM2i+TUSd%gp<&!rZ^ zxZBjiqFD$+58HrLg)ICnr+3dgOa28}P`rMMEh_QlVd=%BPx5ntXs6k>rjFhs^P@I4 z07B;IU0bIXeOP1e#ld9U>=vQw<3{t0F|=V!812qqcctyEMTsRjK-4Wp|YGt9QzXN57QiEiF(sI*NhjC5gwb+Bm=L-&XCOnY$a~6(z>L-KAn4~88vO*{Wbwm8Eqigt@uttj`TBCcZa?yZ-3UQj^~zTIOSOIG==|Gc?%c&TWTHp zOPHJ%W|~>RFGzI7#u_9(#L__Mbp8CjHwjV7YbTSIb#<8p$<_pfR>Nm=MFhmlyyl(v zA6BYU0?uvXCc@dL5b@&Z!E=a#qpmgM=#);iXjl*Bu166rWb6kmM^md-7N2TJO>Q^` z9YN;Mfy44cA_DR~cN?knaVw@>Su3uy`C$Ml`k$iFz? z%1529dX*C0^ckAqxd*`Iwfho<^+Cb*J}2lI5p|j%_3e2C65L;+pXit+i=@Xc4G&zu zr5sofTr2NwxMuwB?|W+8w*gL}w+1Ku)-UuOKE>02n_YXD2PXF4B2QL3qP!LGiAh|} z7Ww(hSi={4dL=8mz`V-~<0Nyrv;=&8a(Q`1*O?wkFNfwakyrimH!>;U&7=F`GufVG zWNbu@-1{wKmQnD?zQI?Cl<2~$1)~_XcMsTtug<9I;aM>Y;9b?_;v(ufPGNc5ac@sb z+d58r5dR@iq#ffR^x!lsDD%lTb^-!Vt*NOYPDiir?HOv|TdVhh*v)S1zjq4#`7m#s zy7rOjGL8pbg>w)hTj|RW_qOHc!r1Orn|a@XlWd0k<7u3M2bz?Vg97JLqcY?JNVYbf zM*Djl_FkN8>mR@|*hsnjx==z>TjbkW!1OUW+~?VoT_B3Z0)Fs3^W zW`=%?Ej4FGVbm2t_w`f7odd@&Gc&TiiaJTKx1Tm2=RFG`_?nw*0}d9NlFEA?4K3=dWGd%Ji1{KF-dJD<8)NTtOeB{}{2CvY&{j>wRoXD`MW zC9W%aI-H7&{*{L+?6BB|R1Y`=kk``}60!(2s!;-F**!OnU`lnZ8Y~ zQPZR_%`c2&uhxv}()Vm_-b5LuRnE}D%FD|GNCtS%7a?EndtD}UE6kgKca5BFKP;c@ zvK;bTz_3`-?>CRlCJGg`R)a$CeHt{%i=L|iOR_4)IL)nTo6Q$y08|{&8f$iWC3~f9 zYUsqhF0ErSPDh0OUkET}z?j<dc1h*pc4=A#Q3?ar%2-5(Gn@ zRM$2X!!mnqzYBt{L+y-WXPOw%*xWzk1+}4yB^`g~^s|~amZdT0L$EGEaNv+AX9LcK zxH=g#RTcxo(VpIy9$NZULwN-lXYqfWoRF8Elp53^Yvodpg}49BsVzD`I4qyPNj@a| z-fJFPbse7&mdDz>KBpt}5O38G=|*&=zV{@~y+{zM3_O7^3Thy2dqtNm=x&c19yB>@ zZ;lRQ7JE;bep==S=qCM-Lo{z+r}+=)tU$R{L}?j#N^=e>Edhc_J|!Sad1iB$Kwt56~aTw4Ulew#2=6 z9`@F+yH=*mO@w~vTfJ1ZhXh-q2zS{I%oP>lVrw;;6kub6h-e`z}6wQsR;ylOKi9>{E$;*_Ij@ zHw=>Ly-_QwA<`|(9s2!6^@_Wo)p&r9WT-);uRTI@T`4$35E!-g%(bTEiRt?7Ay}%8 zcv(~0I~buhVY&mRpJkUg5+0yZ2XLP_Ih9bxxzxELs>DlAA^H)t8A6G)eh{jZNI0A z4f7?5)Op# zkXz}ws@*VV(F+9@V>}$YKt`H7U8>EHez;ROJLBpoX`$n>9@g2tVSpg4% zW+9lp4f=SEYlngH%gtE#_=YATe=M`vV#1W%c+_}#;PvL5&yqm~tWPj_-h1vAh2%d? z8q)trII#_+GcbSo#YgS!zame&yqSS(y83&vM+NQa_<~HV{pM&z(HM6-M(e=Ua{48Y zyU;AMCjlBZ8If*@k@!-bWNgSVfmp9kbBufIr8h1IOqZOazPUfOJ1&cqGlH4s=hfwR zK!Utik8Lkskb9p%zSJ1xESu}{^+R9BPe^jHqPz#gn8rfn6*5%I^yR4#Op468oh|0m zo+EaLK}318{0f83$(=6uaBpA}^wlq6`|K=8rfK^w%QTspjo0_Th2G48$jwWI`1`co z@sZOFmL^TN6HdrRvKsa=(A8_2ts7zZQul`P%_|yE!#AlivC{-e1NK>+fa=Jnp>3&* zhY_h_)I`fbcY10VlR{H#Hew1K%Wh7-X#(>R6j!CxF$X* zi96EfLi_wm+~k>D%?!pz5+gW4GX6O=#@;z;JoYoBu0x!~D_iyilwCx{*+6cg%1XLP_&JlwG95c~nx$;=vYUI~^tnw!N&dnTS~{2Q$i9>DjxA^y?wt4fwRmW_ zf?w`@j1e_zur8G_hZ97 z;hrWNH;60mgUk~t19LI<;~TUvUy|*gHk8-n8Y%B6z^~k|E;$;YigLXIOGK6*uQ3h~ zR(3xX;=Of)nhH(Vdao<^4Qt3m&&>mGHkTx;v1T9~WrccY6I9+yFRLi8x4U-9Vclb< z>pp=NxG0W=G1|N17Fb7WTHh?%xQPspyu8rW*m!VGXSs?mP)n-kBFA&#-U)S0{qLxq zb@8(10H}`i(rdGf&t)hLPy>lEtD|K&`!x{lN7{@u_!_K~^2hxj9FBfcu?7gBV{1&d z^5XN5ufm{ucvLd$2l*dP-E!>?r?Hye6XeKmG<}QTmeib~gG_4+aH6Fko>*H{*Y`*l zD`tr3Ur8vgt=2yBnex@`_cGJoav_jNSFi(oFwrdIpvyYX`pyC_8*? zblBGI@!jHPP7Cp-`VZfw=sPEPj~SDE<42nVm}PzmZ=zdUSq3mCmco;Z@hKmRTFgfK zciC^^n+7YN7J4+{GOkXM@dL;2lqp5tRF1U_INNqL+tVS4`ufG`OLv}j0rfz$%+^t= zQ>V*oKL;zBoU*L}y=+xmkiecdQcjLft9Nue1hLcx5ugcH%XA4kZKHj>Mqsl4Eo9## z#QPCb=%L}q_@6P$IBVV2Xe;u{<%m!ln}m7wzBhk3Nq5ydBl1d1H5o5Yl-^6|_((kr z*EkL3GmoZ&Qod@Gb!yRh{>VaO7+w)GZM+d@pAK_eCC0r@Vb&s zDi*DHr|QPdoL&VRn+=!e>kp<91jKUCSADW2WQBk%Ycsw9!MxEc$jq2&vbe zwYC;r6D?;z{L;eG^n^!ySq~k(fu#M=r?0*e$|*89iwqzEK|?1Mhy{9&T#z;8y{Wey z9C|HJGI+n zvmB*9t-KV&3)hTj1y%j(^$5N>DmecpEVtN%S7F)N44T}3{+m+YkFnd{J1d+-9&Fqj z&$8K%K_EhRfF9R2Eq@|DK;uP6`o+>SW7xl#h8FuHL(P3WJLys_2S$xr6Ff7i6NZcu zi4DbXD;G=4e!}`!Lp;{u-Xz%9(5|Pbk%MEc@4`28tnxD8A-8k+CQsNGB^BQ$tn(F4 zp9PyfJ`Us4jJ4;vCis7=%BOh#QfRu=tWFKq`&W;*w&_sAlgD8U(y^urQz7*<$ z-XfqUJsdW3{MrM9arW{6Pkf(}b{AgCfgXm1Y~q@U_| zs4{OwKKlBKP3>OXzV1K0yc+73^H&X<`e4GFIrN7CCx2Wy(C%#lZ=c2Yk=h4ATOnP1 zTuXIfX-(Ce%h*WOC2nqcIYk}l8_7_U%4%^M699!=aETolR~FLo5>g7CjS?E_)>G)5 z-sR2$b;+83i|fdO`JM&jKpn{Wn|x(4Qy*Ele)}O#;2L9S53qg9hq^hjdbny@8== zt7P>74@wLDBRF%c%rgA7q`ZBG>B+Xv(hIZmRCXDCC&q|vdshBaz9`@K?1qGk+y&B9iLsDSb@QHWnk_v1E%ez#1|k^fS6ZTj`pvu^k6eb2zoUHCFsC|9VopGuc4c|BB%N#SxvZszM*;v6@}&1CM+L3ClA7+(t8*;mab@j?ZEf zlPH2Ptj_oBeXt->YzWH9jy))B$V&s>3Ca`pY`&dRps^D&B2$i{(7!-l8BgYG-sbC* zttdd2#V!+Xd9xd13}naYHjX!gr2)c9g4z}s9O`N*Y6=Ko3bnu)9WOJAnW+)y_fIwm z9*K&MKv1I)`r6*>D&r~>oUnI2p)S}D1pQ1;B9M*zwaAu*6qYSBp~FS`3S95*E<07w zhFf@e?1wJw`YOt>*96?OlUw5=ef$`={*5Qm(1M_`VZd5|U~(=LQR7=g=6BD00VXoY zAK)m~#-y=Q-00x%tC7D%-i1B$hV(qk$>x+f9S|X%q?wC6B9W%d7Y*a$4OY`|f0(w^r+o^I{u zA$s2J%RDteNT^pjm&el&7<42ns_BYJfVE=BabV@*fn5W?!$5vU5zN$X%bNk}S!+$K zP~l0OaPwqsLUTX_#@Ts%t#?fWlqnC+y=j!Mb^d8#K$GOy%#-xw1VHW;wnE*vu>p2V zq=9AjNgTfUwp#(7%GzFvIo(xfmfu>PhXk<1;9JEcKnW!PHjf83z#P8^8jeiXIFe_y zxm8(SUaYvth|drPIjP3n;W4J%>y+GWl08y`1Oto~v(TdTxz&;HT~5B=eY!U=NHDMW zX`}N`<@^WS1s&i&0qyuTPh4#{Z=V1sMvtrhPYrr=weJ!u&_#AOZ^9bW3QpqE(3WmF z9}6w*q6r#+wD{FN<)4d=a<z*(-n`&aeAAOXiiByd8I`O{0u zM!Ji9wRq+}?-mhAJuN$jbR=vqNob4%EhEw*+bkk?((mJ@UuNCq`8Qg$QalT3lxE=A zJ#VA!03X<}trq{a6QbTE?COIERxYFA$$Zs-1mAZ$S^`fukNLIlr*}rZ%CrcXw zT$F2YH!J3iZjIA!G!~K!n=h|+l0IF3+l|QYmy0yDe(gzXTL;_|Y&?)^EWh+_;cT3- zI#)cnxcW46>f5lmNPvXWr?x!`rXHmDYt45U`Kv zS^1)2s7qa>bQc6QdOsSyzA^iB8c00}zeT5xcS|aRQ<92%_mnh;pxo9)?R` zWelZo0jcx2xs5NtjKqkJI_(U~Jntafix=x!rS=0UfcX%pA>{Qtc2cKn{EQfSkAyY4T{Ut#KhHD{?lUdyX$$M3THPdJt{ z-GH};-kMR>0MgzZGsZ|57=xGqET8l%6KpA#qt^@ckHSi#fZW1tJ)O&Hbn0=*XSIHj z;W~u^BM9N=S+So5qN()|R68g3ny}#sAev4w*~DLO1c`vsd`}sch!FjrZCty=*&t{% zm2?@|mnbeGhc}|%q>^+}YsTp>e}zQ`*sbhekJ|ruQ8L)s#xlUOrdsSuB3d9HDT(Jn z2$q7VHsbKuV#UrG{i9Em!l$-^&P(|oGZ3uo3FW5Go|Uh)bse>uuzvdZqa5G>!Q2YS zMIvtfP7c&2$gdk1M|{dRMs1zb`SsK&(4#FI_|GAFw%0d}l(q!b)Hw~1$uh+!_ku^{ z;4@vA<-cYY*Bt3~0QWG`k?%j^dHfH!@BV)i|ISSJ|JVcje_E`RU$$K1-tCw`(k9I# z3egq3o3OF%HyR!b*jyC#WYhd=j?Le28z`%$Bf$vEQ(eIbYLLC$E$8uIX$7-2uBj?2 zq6AQlTvJ=C2^!Ae(JRKhegJTr^tSvjFJ-=^0~{MWTKvDfl-xaY*Y2U40a{XJ?yqc( z1>!XoP?RvELV9azu}=fBvhgOYOeZzD*dD43R7OA77(miUL1D+5t7w}UFG^mGCZ;!+ zTZ}aaWXKbuiSlm?Pq9@^9Yfbp%>h3_QE@l84;GiQ{|jzGJSniD%e8trGw_pl7Eh+w|V z=>RFgay7lQ`zyc+ zS6T?b6*Sw4FP`LC9k_qJ)m)wVs}}4lEKgd0ZTTgdVoa+w7BL7>A}XRACXb^$V zdZh1;uN#82=KMWNT7xe#KK`;LMSI$OGj*#nn>>MqEgHgFM->U&qf7Uh8JXqitLNVc z?dKbQVRQCYBVQY*INxDz@Dp5@9pnK0l1^0IPPd&|@;O;uQ|(uVI*rW~Z0ZAu-kSrB zA4L$!o@+(>7Vr)u8Hdf;dq$a+4I2H>{dd77M$++3$mR3b%XlrSRX|!J&dQ_O(7Vqc zkLc<~T`XMMa~+$0iE{+}z{AMf`&Y!PcF8x*eR7fL;6=G8(Y>DB(yTSW_2=~SW<`fc ze3PWvW$)wZU3X<}#LXy7FP~Fis=Cmf$d$f&hAvmP0W|zfWWcMyrg9g54aMngrM93@ z&H4|!AHK^ou&~ak*1qEr%+-Y^F(DX$e4x^Pl(uEk?uX8nL3{8G*2tZgQ77yxu7-;1yH9}rw4OyxTh^oGTD~FEjCwnf&{Stw2@?h2cR&i8Q@3+qPy$+TdqIS zD(9TP2^f@Vm(qT25rLQSCPMLdYTiqKApP~J;jL9Vr#$~|duNl2oJmUte3bL=>ivAx z5chqrd4W6(Ji521l~t-9K<{$t<`Nj|n)FmtXw2AMyAuBgxya3%Ju7;$;&snlJsm<) z9y@~w*(EVPyd20B*vjvTm(Gay`VlL?Y+%1!3!V3_$=+z#bmXCzB>d+- zP1sK^UWhTO!AkP1Ozi_^LRJi8l;Qlkb@1TcmStUWc#0ZyLVI3d|R7w?-NR0W)4)wY#AoX*2*7AjCO0n?0`R&?S|@uJFa-MyKpWmlnS7!hUw@#tRQ21# z9VJc`JDJt5)mKm1lm5UzWa=ikc5n>njA6G$65tvK_ zw-$|EW<%9WV~T*t8`6?JyZh&MKkt$0e2)NQ!OWAti{FEDVf%a9W+!_tP#*}p?p)^#r~|%@feRK0W9fso$3rdb zY|eKTHr|Lo_L8R~UL`m&3uZWs!Eb#{o!!_OB6;17bPweF&a4x9W50M!dPJ zPsj6qI4<`@{6_x6VmK_1!~>{Op`-nZeIf5-SJ(Zc9LFBi=OQIYr<^_ktasbrbAW)e zo(7n1#OV%dZOzs6^76%2tupyH7hB#-wy!_mbn5murlNlG|6cp`6*5V>1VbKNR(Ugs zR7`rer{>!{<2fL4Z@fwUCoN3vvaTHfF3G<;iGvqbP2vBFCU5Qgjc?Rz}1 zf1L*G?VrAi=pIWdey@0RUm0T}A}rYQ1oGTat*_cIjQ>;^_3;I*!tCF#%+)Rx&CE+3 zaRv5BKy|SF87L3-x5_^dxcaWklc;CZ1H!@&Z~=YLwZue&vL+c=oL=x!|vI82O( z725oBk$_*HjnJV6KLuQYnnHN73TqLmHAT$wB6cG9++_k;DhdJc3Jn=0aA3@t#7&C1 zkFeYqC4h#}4U3YkS(*BKfBi+tjP@$Okt}X~zM8LVRcI#>H^}djDjm+X&?myB9-pY!zVHw(nB%`xz4a{qg0U3nQ$z#5UdY~W zr=R1ZwV{!N`ur9LjCtZW0?jgRrzr`O4t*^arjxrbx~cj8=e`kJ-RHq=EjwLmb3_6k QA@Z1+THdI>?)K;Z07vA8L;wH) literal 14717 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

Z8Cp}_aDv^p? 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 diff --git a/tests_zemu/snapshots/st-2-tr-in-2-tr-out/00005.png b/tests_zemu/snapshots/st-2-tr-in-2-tr-out/00005.png index 6d1b10a3f195a9bd1118fff1189fce55d93b5611..cd2f52759f160c3e2cf6822395ea675b8c84a851 100644 GIT binary patch literal 5467 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ℑ+ciB` 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 wBJWvvGbBq1=g2#G^5&Ys6uM?$Fo2Gz`XC;$Ke diff --git a/tests_zemu/snapshots/st-ext-data-after-tx-reject/00006.png b/tests_zemu/snapshots/st-ext-data-after-tx-reject/00006.png index 82489637c89f0d7f8adbf0a560715b5df3767067..a72927492aeaf44dedc947ec73f6ad012d4916a8 100644 GIT binary patch delta 9227 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ℑ+ciB` zXik5HsmKlY#7~ZTcpkG~+7bwehhZ&exLazHm_O@4jg^mZj{|$Q!zr)l~HmJNqfWrFMnkjqf_) z`tk@J#zQ?Dx9L5y{y=%;cz=Nnck;lx^Q`y&xeifg8#kQ0A@n0W1S)QE*uT9#pFL_`{`>cE`#yNgL`i7+ z=69VYeZscUi_%(AP9A?1*q8ofEBCV)kr=`;vQ@W3?zkndv_{ru-jgVz0~r}jowNEg zRjTjx$&>d2%8joh-7%77DMRCpm6tB;F-Nc6ckJS|oW<$SA?TL}XJ#|}jLBM#qO0^6 zj|kV)R{(%*-s(5Ch;=&1S)^^Lr*d~o=@qZn36RK7RPDOu`rw#}J~4$}nc#4{oYkf` z{;z%Aimk(GQ^)Qq?Kw}*-rxu%Q;7U>Jj11)Cmzs#HXg@H@b)`jzQ7qr$F-#|rmvQ0 z9a8%huWzDu;2-*qm9V;xkht@t4Q7iKwiC!{mp-4=mr^T~Uq#+^OiW$gxMcjf4i@`J zlBFIH&m^(*S06?hH#*Grw6nFVF09XS=}JAgX$)1Df)#hzj?rElWIoBrS69uA-~Z5| z!HwCT6rw@h^WK1x|*&zaz-_0JTcmHm_PkFO5t()mm}Cg3UJ?<) zb^Yi${c)T*vjSLz+*2~k&4Yu3P=enAvfxm!g=Hf9W?@ZyB=J$Hfb#nNm}*y5*_JH0 zs8$uFSbnRY(RSE({(ZQ{r!4pFjN2amj`8!_7u6UAg6(BOq)Ct8q7=KTl-J4DkY0^% z32t`deYox}50|8_k29?Abj;-Q7g8aZ_@84|4soW%PCb%00M-}%e`0+v*K&6r>5|fa z3W$%=zGneao3er5J3K%}Z~nVEPI|HEzkWO;EDEr-g}(>K_=^~}E72by$dkqnAmpqf z?}>FKxV}ut+WV+d7cuZ|sZH-?GeCspeyz2hUp3^BIiL`!{wg4c?)E<=n$H?oM!5ezQD6KDy>a|j z{fZkPf=%bWTGW#(ZBkLkp5pY0=wF^}y@nvG6vMg#RnIVBaou8Rz(2yYk%cpLkY?om z8G7wfeAkL8XU=~B=K}WbwW5|*{P2k=Es?KnR^}uCNGv2{)}oreC{L()HO62jSeJK0 zl{UHRAp`r_#l@#rdy0Bj zZRHCVQI_SY_&oIGAjSYG>B9Pa>>ZhdapD-{~3IwxZNrK{SL zh1%lcxSQHDzmcoS+#}^}Q=RLO{#bwY0?SKV5)7MEYF0?YS9?v-YC57!dV%V*`QA5b zqLTz#^!>iH2)!ir9#0}8Z7jxls=;co@U`Jr&zhSf1t!iAg|<7!}~P{xh29vUJ3V` ziOcd{zB0dpA&b`?r4mz6RJf8YC*M!ugV#ap!qUlKQMwerFDbhFnxd?uOD?khWf~$i zhC{OG6tzwA1uQnOH_zQ{{G&}pRQxsdGnAILnqR-~aK_+gv7>E;1zB>&Gs(}#NV)AS zK(CKm#&4i_(?9e@z{ySJ2%ID^11w0oW0in&e;4q>4)swjR4M0}ib*dsmTo-76VUw= z-F0W&jAl+E^dDYiW#u-@ozOP1*tx@)033Vh;kEngY$1g-B3CUjr)}rlJD!WdkHyql55Tc9n0&}k9|5nbrT3?-kTFA zmxSa#aH{txpMy}?3+VCBpWVy>U^eA;wngwvg+e?c2zoVsp>Q}58K8>@ri_~|*$)}!mXN9J`I$HvQ^xf^#4SJupn33;A*O-&~NB&4x|V{G*JIO@#S5POWHi6Bq88s}f4$U&`+WBH?uH@8598 zs9mF-rc`0nm+vk($OSx=$+m6-51@{F2ZHJ3kNY{CLn&L%r|CD1W{z{aq2juoiWIyi z+)v$SdQayCJ$Y#2AVC8XB8;4WV3x!-sT`SvW|Y%zcXxNnZq>!bZpm6eQdT4Hl1_}b zT#TkG^6N`SRLNzFF04bhb|d%>UH}k?4IAu?{Waf@^J-hX+Lvfdl=YHqQWco1^C#Ts zZZ2E8s`P359d=U)p0sKjgydVr-6X5AyL{XuZ~2e zlnx6=pNa>F)7zx>d+dKQ2f*JwrHwH}Vd=toWoO^r$11A2sNEt{xLRIi!pr65Qw(Vm zAWb{)x%P0r%#Fjqt0`tXO=-$Ve~tFfO&Z42*iz%u;<pMN}8u4Tc>iL+Ls1aILuiJ7vDfLX6i>{9mA(fu%&-3 zo{~p&wpd(Uqy{l_u2T4H%c#G5(p$AB%YBgS6&oVvzh`e;%GXg z=&;4bIX52Y1PpO!gB!TqG2;^d6zDlO=s=^WB9Q_^>&|iLS*IVPr029{>zrpofoa0* z+iGmmJk|GqA!+pFlM;s;SZj<|e#w-Jdv#RK*G1H}>uQ0kWY&3sKtZ4K%y5$^@vm_759D4UEN1Q2SG2yl@aB}sH2q&iKi)R_1)sY2@+7=&L1T+ybB)jqb+{k^9~p>%vLLDUGeWi`R+9U z@Y5MAZ@8!#)TB*Q^X63aO#nb-ujrCcT%N~LlHVq*bH$-FH!jzPpC*)Fi*;s+ zrID>|l3R1H|0ci6Qcu=yE8)##YhdD&CwW8Oyv%ge>soC)@UZdIq|L@^_V9yTDaPrP zg}4NPf$BWBpccxgihkYx3y#_!LX#b<84GI(iX9cWKU&CvraoOshr23pW> zhDMeCp-CiLgn@?jTRtrHtop!#``uXvUGatbKPz_e`<7VB-f55WFHn(q`}B|8#AcdK zt!nfNdZ-z7qrZL77ae#=tfHNbrM&p-`t*>jp);0&eQlDNexUFL>}u8^C^!?IFH#PfsZ1vD>jnhJ-61d8gJhZV8g-(k!ic zZHHb$lgD0ZPwjkDN2pd8=IXVF1N|4x2pw^U6qLktoqj51^V--`-=5!?A) z@}}unV_b$qn<+_J%1qAzEmz_^T;Ad8dKkc#bAb4t9IP6!|&_UX>7;_w@8=S{Ie$>Iw-cL-nvhOQa zW{jvHCfY?k91$t9LN=@iteX!*UOXMt;%&Mj&(;W6;E;K(JL|1HbW|e^kA>67s{Bnz zfH>m?To5mbOz39)O7(d7KNy_ahQL~n0>PINVMLCZCjYLI1 zxd`|V?xoq^mP|w)v&F~_R!3g5C{G+6x~7T#9*r{2hY2bKx-i_H(&l~YftI$AdJP5+CEW%e_2HvNIL+5K@C?@W`8}W3hnDZI ztt?+}%KW83MB24IKk=lzQ;HKGxk?+v-fScJ9##!b6e5!$-E~~LIE-EKFx{Py_|grWg3-NBXH4>EE$mmD z<{ek^fY3}RQPbu``nt_Jqb}of!lpvh{Z@P>kGNQ9Z)Nj}$%&+|P9wsUu!#H_x(yPtt1WYV2vV6TC*P z>+;;$TIo^Qfw!N0<*D4@bU*tjRwIYebYAUnQ12!|LZN?Ys5IYNY#%QmXi@eAT~b6U zIqZ)%Bv2GnvVDD&^XSzt9n*!i&{2V($;X8;WM!*b>h{iQ_y-ej{k)54+=02(T6G9? zaK$Ml?peSwIo--%FrtR)JGKO(-{nDoCnyrP_%XIblMyZ&76k@-n|*iz0AIHz7fjtWxmd2`c^du@L*n_1VtK1$8ELg z`Q>5NV8{Bjk5EpX#A7)>$uN^74X=$1*Y;NixJk#a26TjV@jk4S&y<`)4!n zAIg90Z69!U+SC+D@y|2uE8cSw;)hR3mjQwV_Q_dC3nh=&{Y{bFPqbq!9~Z0#y*j6w zDHA;L2-CB*g9g`pIpIs3%fIZ{D*k;nw)FM*rX%F9gXS+9yd-tKhGqN2lLzO5ILq%t zc9YtP=YhUgEhk!ix`r_jEjhg3A39)B&*fnP%1<;Ed8oX^a-XnB>?Pg|`!fccJk1wk z?dpY6-4*!C7x|RnOy^k}*3WG%y2!&~Pg8SDWZTo_gYr!h6Mx4wh;c9IOZMJ0NRR?k zBI?on(&EFK5@WQvL1CY6SOZnOmr}q$OiWcRB}{gjvO^;7gXHhqcDgm&A$CDqGx{g!N1$Crh|9MF}dT}Wxj z{lmU_3uyG#R#PRU;B*FrO-QBHV^*RJ|CQ@8`2Mly{Jy)l>1>`?o?5hv3kYRe9LXI< z4{0=NpnRpQX_>%8@OInJiWbX#Ne7xeiazMcsF56zb9sM%{~uy-Zr}Ywuk-h8m}EV} zHYd+RbBN3Bq_tty902n|SI)fwRf~W7ZbmIzDHKxLa8Q_X_F2KyKqB_ZoN&b& z$3^n71m;-TUUU7 z;-am%A87Xc$MZJce%h^pUn63r$Ui7H)MnEKE@x(^M|69zNNw!V|Dsgfuf|8Bvsn5Q`{aYA0wc#AmNM@uWV z3p1eu$*H0NxRzmtJ(e<+=QTYyvQdEshh%iFlPAhFuTu*Ix`8WxqR+^Dv-sgK8fuc+ zECtp*tm&B8nd%ura?frzMeFF1oTf9^_po-rl#Lv-&W;P)ONuoJZeIJ670v#UePK~Q zU@}!?75sJY_wf5ZK9Kc(qlTH36+AAh(5hFe)>^rp$P`_Z}Tc*hQAHE|)K^Io5M*vQ{&TiNqz2h8saU=X{%WCz77{)r0eo)(+2 zU+3?w68_9bci(yDry5aXp+Xea)uJjPmD^Tcwkz6rKQLxqT&yq#)|W0=vV2}G!#==~ zIJ1&+yAids-V~75)R*igOq*u~2&Qv2DmwM2WRp^056kU5cV%#K3w{oQw}0U)9vsT3 zdQ(P(dfEV$UEslDL4EDz({&Go=)3i<{E8YKjhg)2k(4#B;UQIeO1|+4qecZviG}m8 z=~REe7mO@#yK1cNMAs=Uemwvev`2SH_$IgWVv*n zuBsj=<4Y8sTvUw62=v2!`TGtUhpD5QjKZ6iV*XEbTLvZ^y-!UIvGPkJtMX4h#qCv8 z%_tQ{mgR%ab8V7>_>$7AG_+qTMBXHD`!XH`2lVU-m)mEpmODB#YUU5FpDa&d+LhU! z^1E_Nlgq%@9|Ky3|M0}8WQ+NV@7KHlUl6t6qo3^3yfB}ec&)oV3Bst01t{FV@dZU? z>QP@Pq-g3ni+8=97>M$fniKl`^s<% z;2U1{AdENuXaU()y?Dc&9AS=5)p#{{dGJRmB#*=FUBW@GM^c2S4Su z$Ed&FrJS7$!4sl1RbW7R35D}gSx<80yYp(lG9X_>9#260a`!#&#jZUUw)WP3%<^a*Xr^waW@V}{CZbJr&@X#av!Qq1Lq|Mo9WB=c)IRi`w&(%r7jAYyJr1TT z?xX)^#f82H=yF)I zUPW5l2cRxxRX955=dLKM_!-U|eBtn-zk?7cAPPDcU+eSkmnPFoI+hQBAO)3!qo_cm z9pIJtttOzrVYg{I>~f(9VZ4dYNRz7m7z=M%G{VGRIF0^>;E6KCh4}C6v^_mOhYo^@sk*4_2XSNkj zAVi}a>&3HaL*0x91h$`9z8N9DnAuvsMDF)= z08e0Vao(XG)efOx1_b1<5S6|4Y5Mj^__&f9xkCLr;m>;_+FISu*B=f1WBUcdx&S4A z`EGHse)Smt!iSB1;Xx+iJ#8XiAO|+sdMuQW99#JXq$>jeb?4(6;$J3a>w0etDq`zC zhrGs$4NzP#llsggp9e^URQ5$CY@M~GM}Qd@{|*@A;l&L=C)g%h&Z3Tg;g*8_=;~EQ z;&n>=W|D8HVT5oS4F{P_1mDBm;(msCwlBF|>1Mzojm_3BoJJ{8a7a{F00{Ka5}|JM z(Wyc$S``XHQMQm}JixCWeKEVN)dD*^^$W5|+Ek`bl^y#0EqQjK?%9NHYT<`aZ=EQl zR6FCL0k;IdIWp;h@k0+Q;VO7P8KqD)sSj^5AD5ai87Nlc{VJ?(Gu;*>uV5<}qY`|} z2EvX&UDAEAA@N|bmI|Wn<_TZ@-bM|&>5g?2yQ;&fCyn$ z*>T1pC~*Oe>X}q_@>ZB||}+mlZ`PL>r-9iox4A{@+Ynk&Ng^4))cT zdc#ks&%fRmbXYB-eW0q+rmc}((gZ;JhnO}_&LU} zAr>HIUe(*F(d2V$^0)S-H!qZT`c(*!B9Y8WuJ}e3obbWGpEjr)iiFqcsX9MU+4G=( z9%c#Z&X9DN65RcUPKjiV*>*Kzo%u}y&|wB`>WB7pLP%!%SG!HaKR@sJPh9}uS?7dN zhg2k!83)bJ&0^`Ig+ZGH14{e062x0MmU$3fQrIRD{KAZJqOTe}ataV<+zn+Aj2b|D&!LZSt8R>Gj{2f`_AkA?>6_{e2l+eiR;x24bSg zOznyqZD@{n-I$h<&MvoWjUbna<2vo{6L7xZL@=*K6m~(vqaRZ~x@5YqS8vkNax;>{mH=vS znEF!q85h5wUd_8L0IdH*bR6#0Wc1tYV4%vY*VEY+2``1Yp4HNq?lu({j|+4!-Y%nn zDLDt9QgwDrWeI=b6}^pbgG?G;pkm0kNiE;q@}#-9j5O+E^*$yQlXdObX*zIjWK*Am zGecm369SM_K&gd8ap|c|Q3{9fBr6{IlsnTRTm^NIaHAQz7&*9_G3L5cvG;i2`H6T3 zlRPc<*SI9A5e)&n{1e6qNnB34ygzPqMaDqk(@fvsZ|J;$vO4*}TkA(h8Htz?qLT73 zwxOcK8(=^e5>z<5i>`KCAZZ!9NV&ns2o&F?V?eC@#3Y5{8(Yf{Q#owCnJ}tnjQEUt zz^MMKGOcrK$%{Gww=0&IEdvkv^uU1lUXl^r!Z>R0O|_)}@=tcADP^cE4e!9q@uK45 zOSzZ7|5T$dYtGt^8d)2oAKctKH@;8&mh-+!v#DGxYs8Fl=T7Pe>89Hy2&-Nd? zC>*U?7%xWbD|u?_&|J>wMx*3%cGDzVi7^nshXxzW| zNQeAFTgK!x(3OXc;wa9zF(T|})i&Q#^%wa=34Cb2yd;w!BD&8Sn_zlvHOT^?HsOBZ;!&Ovys`4cH8P2DV>J0tz6A3*v;W@hFr__D# zJE&)=n2M$XHmxm^ONy@Y*hs)fv!zm@GW3x$>S~9f1%HZ*HDn_`^^8(x%w?MY6jRoO z)lBhM@SkuqiUq?bdj(Jr!z5q>4UjJx5Ush?|19Pp1Ij$|87Qutc1dSLV3C+%Gvhb9 zk5OX5@-WKgJ}@6|0?4WI3jCbPa4*cQ(Xe;;W%#BQ!{G6ALC_^=vdGKQH`-U%gG9 zNbBf^w#;K1c4{C8ICiTrllbeQ`-Quo*jEjrs;>lJBhxO4@KT zwLK+&DG%#FusZr!$_R12AxftvMexa)W%GqjE(~oIoP0y$b57oDgpr4gRNF_&NrEz~ zPkxAb)lb~Bjx$lQ6XH$2wE3BNBX_Oexm=HuEnm#T&*Q0u2B8(omxN%uBr@Sj#2pu# zAH8q4z%RuI1RoYm{pH+TvwYFXQ6^FtpWFY{rRDtw9~Q^95wOS%`B*SS2}V&phV3z0 zUM)^6AG0HC;?2aSK4bn86LhuH^+0}(>+h_w=PaOV@eXV0fK6hbgD&4Y;dHZoidyqI z5R}2k{nT8gvx)f`5@;H=?kd_1y$!vokJZoS$GJzNi3W;|e>MH;{9j+IUAeD*4y2jT zrQ@0Oc6F0O*xSXuwX|Bi*fY=t8aj?sT+DLWoE<+roM12gl>FTOMlVSUX^QN1y`p~bqk~8{i0E_g6|D1fYuISUgl=U6Bb~Ab}BPM`ob5E(t)yeh35#hjfKU?^9 ztX^9SPyn)4?36iD-4x)m14J3>F&5Xd28<&vO*{1Y&V_qMjgNj*0$JLwc?g##QJW;! z`iyMFuIPRD-_Q1Tl+AATL4?sm6=|n4ve>W9EIU^FH$Q!M7VgphrlWdQH-=cI0B7Eh zocd~1GnhCmt5#K`ex7kvhs2c&nfpd)%l~WgYf-)j_mu>?(Tsc+3(fy%W(vK5HuE^A z(FUB{bS9Y4_{ABAs)AT&gcPAuP{pv zeeRL_9*jd@So3b@wqyYplv=n=!Hu6x39F} zKoy*7O#1(55^U%q)J50lj)>tAIw}N^G?o}kM}Pt9@(xK+06Z-7*uTBuH8=lWf@9Ue zIBnx#XVOVao%w(IFDO9E`C;v)spTC%agLa_WQ_ouSqrxihnnGgVIJ80-}+shoN zN8T*(MK)D;u+$m9xmx%X)Mv$j0Yvb73LF7Kb0)^gG$2?RN4U>^%FrbPc`4BNt*cQD z`Kqw{Ueop>nQ?u~;$}y(9QNlwM+4eP`Nqm9VfWgSo4aA7H*ymhaVKf-fB>Xth;mg} z`}!LyH@@ywfz-NVdP${N65Gw!gv!cZRYwHvI|2O*IYF&z3V3Ctcw&G$y#>=al zT3|*g`CKX>>0k9OPSCP#6eQ?k3(pML-RG73 zFd=ZZ4jhR_J+&k(CC0E*UKLK_Dm=V_Lvqrsw4WN@cnh?Z~xYr*j(~sv?orq zq|(z>D5&1y#rFi;u$Ix!DLWFn4bx!*jfH?U_b{#}+)Y7io=lZZhxfz*LC0eeVibN)T=jDv`eKl^8hF z5$xeP5Cf493^HTeuCTW=e8`&&bx_ zTI&5ZGY@e@o2NGJTX)W0Sz!wYNGFsq!CPBi_>lmcY+&%SPsnMC6x=Q~qH=XZ%hG*c z$@p&wo#ygpLvAfCLdlRw6)*g**jjl(RFOyauXIxq4CM)@-j1;96%}`mGc|!D9)@uL z^kfz%5dN+uASGusbfyG6%($EZ)zypKWmnNEi8p1fyP^`6Uz7ytv!=PKfnnybhn1I@ zz?h&H(B1>JoOt~wG9B*ydCh81fs8qGM}f_!A5KTvkpwJaPrTW>4Y|T|Y^bmHOu0v@{m)70Zcrp15{6ubI0oDCes2i1~Wk^@UHE zt9y?TIbqJj$)5>(ZKWi7g=EDY;=g`N0z8nUA5eo z?ghPDPKA44GdHh*U{q1_@MC(w^0Bj=|9oj$DJpwQ?hH={+o*G90?swd9?6$dWSntkqAJWXuqEfASnz)|bN25{?|&R$i8IAXB_YMBXd*@vQ@T;hCO45uB-7B@!5U#I zk||EIRqiwC%3Y+~*4!*caziat8pmcLBzHS=-s`7xeZN1Q>-v7L>-!IUuIuyu zysppd^?tsd&qrB8Uf`O^>AVwprFi0tVbPIBq{fp|`L63yRpA3?a;TwoId7~b9uMKA z&fQI%eKWGG*{pb6V@ffh#C6^B%QVjk|AO7(hVJ*s$SYfwS>83Xz8~-Hz?`k-j$K&U za#^R)GkL=uCAzx3-+VtO7IwJc-l2mHk=If0zEnN`YIcFLttjH9Xa@YAvGmR%%EsUG8 zDuQkj&iE8t$wa&MSVxfPPQ`ZQq1S^BX4i)aj)t~Z(oQb|~wuSX>2 z7Ep=}&98cQ$9W}CeO%hgw;wxe9!eX)W&L@sK)^=jz1>9 z?Be7P(hsV4JpEQa*pw-#4c?g}GE>SZ57Bj%wU%PQsg}+zj*ZJu240>G<=anN{4mYW z1e6hU7xB^yk%M!-eaeS5P;T0ZCMxof5LAmk{A$9degFYcassk+3y&!z&bS*DG0#?% zo%ad1y$^fvh))nUKcGH^fsEkAvwD>))&yt6lE)f~Sp=vkyq>#ho@67KoGVoYquO?@ zXr!CwP+OxG^c^gq&zvUOfoWo~5)8x*2y&Wa5AH#qEsQu(9DgsxUe;MmBnK7&Rz|CqrT3ZgIc_V zMDc-o<`nZtpTws#`@@NESNbMG0}pZiBRU^xUz)?d?wbFs$2P*8GabEa2#EmauSc1U z-k*|@f(52(KzCpb1}c4WEvfo=J7sCRceo}>5qqoM--F!I$OZY$KC8G^1BIdrlJpIw^)OxkG_NtGhvcDjYjlxQ}yrPf6xEj(M#7sFI*-(Wo#|F zB?@3a0bg$#L)Cw5VF*b%RQcrnDrpq6s;=`mL%#A6SbgmtPN{P&pC>P1{Q@(&#q``( zzT~L7kGz|qy{5rw6yz}YeS1KlK9$Xvyvm4b7iKBW#+W^AN{uPOfM?>kvDxKPKuSx= z8s3=`dvO>P;j1vc4xnfMTv0X^*1r)g@kH006UPVH*QhVvUKBIw2;jvt@^PJj?!up@vM?Nec*f5mT+ESNDP(?(5Aw_(N9b2e~9pn~EW-kXO{5mYO z-c@VCwy*SDMX^$IcH%faFY@HlIUmygtr&B~42O^h z0%P2>n$AW*@+u~LU<6{f;ggN99fPq2;hWROmtwpRK%nmsC1v)J-(n7MhTL^SK)P+w zJS}yLewGh8I>@leQ(3yf3964-n>n)(W1|O7sA#Z$ zJb^zcnrw2b?@t{8vNZJDz147ifOa6w`%l%TH>yL;u-}UwOTBHq+~5TpT083wiexv_ zH!B|o(um-ARA_vt*(OIfbdM<^SWHvCY^#?Y=l=`tps7T+`$B-C25XyNpT$+%jaj&Cc0122j(vH}G@B*y5( zG6iJ6BEh@qh$LK>itkHgXZ%J$p%T4X93PTIGzf`A*9TK!BAX^5vE3@{b<{P0@6t-b zxBupjOJr2@YidcK5-kg|fGjb$bbk+0GO;;hvtjU=<1nE^%Pz&WlAia|agymPeL+}+ zY@7VHiW59M9f9!&XW?*13c^b%s za-&C?z}Zv~W36);ZTn@V5xK>j5s199zHc`bLYKrWrJjL;qr-5^oYBV^dIg;XR%luwbox9HjdVtPTh!0*^QR0Td@|r& z=Q>)T_p*e96Q};sxts$6Q+do&5{$9G=lhNWrqb_#ZXT$SG@S=(Ny`OZvBfM4X)KHF zHNi}mEGFxm%T9z&%}8%##P8a2U&`C(jmesf{1|n~9yKHZ1&BBjH*KraDePfy0%X)u zl@nM;j)gQZDV5tXC>wf|e{kYp)4(bj>bZ{*S3j&iGM7_hylZh`xa-v4;JbiILf7KA zSRpS9pH@ouzIWByjMnfN8WBv)W14t=%1ew;d(&8o72(_G2&NarLzD4$LTLE`vU-+EYO{yf+l zLGk{r8zIjCq7ZmXn@yTEq3l02^hx53+HFll97LiApE7zf36v)NcfBg02V)&-|b zplQ>l1IwI=BfS7>OPCNh5b%^ zd`S6h3-k_iMD7XIUgc%%w`jz@MQfle8{RCGBF8z)aVJ0u`*0&=Ly4&_ZR$p)0s+o* z^FcAJHl&AGKFPat7xXm@ci^@EuZPX;8uAQ^dDc3*m} z;D81bLKH}dg|rLIfoH@TW|b5`(^&C|gSb>`T*z;gC6v2tPt?YRdQ6nV7wrhkM-Dd; zFIyF^r=~;$-K{~OV*~hVNLhSeLE;Vjq^o$vS}lpj~{`Vba$Yt9IBC2Nq z3MIi~uh$|-g`_SYV%z5T&*Kl2iim!FYhD_4@U$#)`W5qhOmI%N+Gg?5zxln+GcLrM6yAl(jnu0IbgNd1p-E+fwKeEQjE8^{ z1OgM1x{ofF z%j}F&R#w)_f{uw-C1GGyfckoMlP*>7$wE*&y6sXyr$xl&b$cgzw=iXA$;U05JBhXL zI!IJ8K#CFO!9U`G*4RI9*46op>vCu_Dz5^EJXYO-Zf*~PA3pQ7bV(}=W!gM_U|db! z6=8D5*S}chNx!q`8fW+_fwiXrvHGiI5@N!Q&q#u2V{YQ&6w7HapU zkLgd{xTrwUix(D?h;I?O4d#4a7FK*z1=d!{UD~*6TrwCos{_7zbadjM_CW;AhVu_M zgPJ>0{y#?`~7Cwc+46k>R9ArYnOWKW?PHce1zwl zoZNH(&dD%zjf12*f6FNau8n;m4JfRWT0mnQ0hS&~vwwS}oVp{({*rlf9|4Xo0qR;l z>|OLD31j-ux$$UOZ1^}Mr0<82@MDEX^G(j^?Nim@B541r2!=9%oV)YlX9lf zcLRHa#iq;35NM1$)thyTtZ2pM=37kGa1;@5w!R@`>CW6=9T_yECccON?wNw-BytwU z@oHGhD(Jv@q6x+zua@M8Mxu8oF2qpFqsI)J6km>jA|+(BRWK1crD$LScJfs%EgfSy z5=1<*k5Ue9u>axJ;5u>aO>b>NSOy+Q#5IXd+W#W7u$ebh;s!o1vi{YXAS^t908rZb zJ7A3V@ML?o2?yS~)Th6Zm5}-(7S&uf;$lHkG6Sne@AlBBjh~!FUS$k7;xb2C__4&I zLYb`2r54=3#gKW`@ud(BaSmx^znh3)e$~6z_&su+>hnp&;BiakHhR}^Qn+qQEXJ88 zk&?-%8kmk>75WVzFJASDsNsi;)03QIuY=loEI-8HJ*WJ(e(!tUMy^*2L!j^2x8|KE z8)3Z#RaDZX_j=rRIL+&=`?xFTEi97@I%LPb!))bTT-;qJEm}whW~4XTdU=Cx%9e$~ z0~^iBANgnSu{+JjtS-a%PdurFhS|o3Z@K(SDT*ClRZj$0?7PVQ*e^@ zDzF9EbG$y{Rrf~Der%`sg#CkwBzubT4Z@n&ov?H5r&g9;4`-ef8GAmztjlHDx*B3@nEzpAE;1zH&f-I` zkNkCMxdqZ#@zvb(O|I2HI`2ahYcI`sB9_7|^JGV8x|U$x39S7o5eo#)^gGH4wmbUY zT_&0@eLp=BXq^ zCPK>jjIq~Q+hsZxPY-3Lk=N(@^RRleYV8&3QfD&3nB^5JoA**96eFL+Vph4uQx`eF z4=q+GC%3(7r+RUA#y90HMEol&x6iPxh|6hNI*+mS!eUO^TO*yaRNSZSS|YfIsW?{4 zeCmi+Vv@~d5INl6z1*b4yl{pZ+y#_GGHs14hOrQ)G+zIoKQ0} zfTgVk$YhV$)4b5UGwo1HPiBZzr)epPl9a24H-+Ur;v19UDB^GCbq_1q*->62|E&JY zPOO1LeX?uukbgkFotrR%>YZYHnb_$;`q0|;ziZ%m;f+6`=b@aB_~#8l0iX8yW2vH- zLib%8*acy-;LXoY^fK$`MYh1QK0Cd3%2De~FPxHh+M{ETJxjYb(;4s4v*xlYxFN$4 z_-Q-A{I1LK+-0iK6ME4Y8yma)Vrh?Gv+x~jipxj4FZq5TDZc3kq^~az_YOk8To*-^C(?M}gVsm`(s9d~0?)Xh; zt#5zX3GiW4&GUF>Q9-Kcg)N9}Z~0LBQd^6%Tse`o`@`JgAPw{{fwqcX$r!LZwIPgl z7wfC7xeD!^I%)`*HO7G{{+ZEe__p`UH+up~7nWCD&EZ{g zTrcXonvS&hw(?0y3fno`+a0`yJ3}Zik5Dyaqr3ate?>D7rYw7QC%50?@8Pif+%c#Be3Zw=|#5(Y#Qm%BZin%Z*I%!>DprmHUJp4NqdEqV69X!VBhz#)Q03r&Q&A z^-rAEKS50F%4Tjtgn0vTr+7~AZw0Gfcm}_i^WHKDIklNq9;m(SbD~3M4g&x#Xm(u4 zV*eY9R$D*9+*M;DAYU!US;B@raDIIHxn=w^QwmGWEa~Spf3ZDUk_bVUj_pl$saeVV zD#4-`QQ?y}*z?$+B)%k`4#M9nh-X>P=?z>&(~0Z20>e`2{3IKjhk5Ybw0uC8A@8zF zAUfc3V5PTtbZ;NA%n7n4_Kp7ieN}9~C!F4Z6cm>+vMv^rUg*Y8`hW!BiL!fuU{vHS zuvZG+BeZx4k|Bn80r(|v;T5x{L|%O*!yy4GIoMlL)m~ zR;3Tw{nl|bFsSgCu^0ye-=Ow+p0eGPH|_KL-jd5K_0G*xPKB9$hVOzgSh8Dw{2<^4~b4f$itEZii>{!MG4H{+k3=WbBG9 zu)XM;$^7`_LaQ)(=$jM{sthLwqb}zbnx8GJjC;Cv)V^|yL9y(AP(VFmR~b8RouPAV zp6wSDez_Fd{1L%XoZj&`=A+Q`)_^zuEFR_6;09TLh5KpH2Pth`*;4Chz8oo5uM(l# z2LQ^kDsboi7%*@-kifA4MmGo3GNIX$!cBgARRkBW%1O#lx}%X!pTIDz6wcHn&w#FM zNZ8O|+kW=1=Sh#BIL>c(SqsXlkgc-xi|CUpT>3pWfxG=lX1@ETn~&KfryMt?gp;qC zRizgUpm1k&<@N?uL3pQ8-h86KsZevJ4dH;DbrDoGcTF&=yDpzILTcn1`$rc-56|JMW!)k+WGAsNkiDrhqFm4+uo+oQbn^aE} z^OE^noje^AT6G%V*CB_Pu&ep*UU8lTj!?Yf_o$Rb+Ct2}9e<4KkmA`TG%itlo4(nL zP~XpVV;(Ds>v;^~$`6t-J8@)C?`1V=?$~^J!>6N}zqq?WMyn+#G^az0kr>-CYWmpY z56v)HE{hT6YwtU1bh3D9Ledjz+wk#poB|`)ll7w3(z$UKrdUx#f5e8)`8ZP2I)iX3 zqR-MS8sD^~Tcs{tEe{Kxn$FdtCH3H?tcJoXoXL~w0rX`J*B+G zq)bSi_pVozrQaLL`ebSYs8#1t2-~~~90D=XRY-#51kj5S?BkokS9iVjz?Q3}0uKd! z?dn6W;Qlg?%6@#a?sJgiIMIE!O2C}N*)c-^)5B4z@a(B{H z^dW8XkTj}n(mGtG`{Pv+i%-kzW`hqlFv~X`-8`sAS5!Lsd;3KdYgA`xznfi4CN;l4 zF%r)ilgSQq;m)0BeVP0z74t2*#0D9Z#!9;QzvGN}^NW0)BjL~QBDD)& zDPUQ!G*J8*6}!x0tXPuF6tJvu%C5vYixb?DfKx0oaP-{pSpl0~7<2nGh4z!0ufh(5 zJarYq{k9Atb^1Y3gF;pLJJUo>(B!jJFqd)YpOf|V^+Vs8;6rdMw^36gs66&L6`fEVTe{hfUei(#vd_p7H z)?M<7u!tC=@As2ix+qO%1UmvtDz}I1UIklK8A;PYO!m&-S@LXWyVIk>yFQppi-n2B z6r6A_I;Z4v=I-CC(ESF%@99`5aESDDsNt176?X(`Zbt8Jkj|bv#8qxzv=%{2Ph1(m zmeBRueCxh$N|!~%p;i8dIbX{1q4HiltC>G`k-M{~B|41q)j{Ed0fC&4P`_jEX5q`s zcnB+9Pw`LE@VkE0ZcE`^uib?Kco!g}*JxlMjQkSwGU)BB)ws@pCRP5n#F;()yZ0XR z=U19}oCw}Pd&7$F#~5R+b2-hT$L-kd)6$l#>!6X!uOwza6z2h;ZPz@z#Z~)mQB8R~ zsfTM!h|N*-AM`l!l{%72A$AX$;Dk{MQn4a*j=#f?KUtZCr2LE#uDWakf`Rg0U{^R~ z@JFlin2dE2z@obsT^ED_F4ol`ZuqB4!p64#%69&r&e34$MhI_?sv=fm)U4gI%H81X z*bPj&(2i;ws@x{uznz7Nu75mPH!3os(T1_78#S3WDy$Fj@Ydv8a}n~-S+z&;C?vJ7 zZarmj$02Stwd{IyJsI471;9(;Q+YbW&*|o%)cm<7J;R zic*1w6Sw_3FaIt<$R9L}i0V(V^FE0ck0l-@TY~KK#n1btH*z#TJBlXRQ&7+|I;lU= zIvhl+IRs~|n?F&M3{hi=S=Om4+<%9>^EOcOw62ePYXAHai4)*+S-qVaKTvAK;1-+v z`TkL{>+pJQ&0L#YS#Wut*ibgt5XrV zVwsx#aQ1%0ezIjFZ0aApjGbMb<~5eR_0r{y$OWryaUR}zVU|UaS)ikpm$+-(q06Vx z4iD3%?V-So&E@MD4=23(I-@3?G#H1Q^R8(-+P+{qSIaF+lVeU#0ake=)IsY>HbDcS z<+<5A8Y@=CsvDa0Zy+ta!WT|0G1m3L(^*%cA*%;Nd8_?-M>~Hl?VLU|G&doyU!7#$ zZy1%(hq@lq)VF_z`C*cNtV|#IN;!3neSg%Qi0jzqC;a)Tu?P3=xN$e>wtFKr3ghee zK^W!$BuZxYee&LqHPP4G_uC@Cg2PY8L#Tab#y9hKRBR>XZSI73EqXU^;wBVAP2eOb z&(#BF#>03UHdU}VxvvzXmk&2Lv9zGAGZ0!T+_#d-fgJ&1-~DP}j$xH#iBZU0p65kl zGSU2vM~-fnZ5)&K5+i$cF(d#l#9#a_>{m!H88!N9Vou&zlL(XY$tJyDytn??J)HV% zlH=U;@(>uUC(Du}m;9X>s?8$X0OQNlHUFsGXKkNv2nTcz?|-0u5Bik;+^v2h_3MV6 zuHs4qNSgV6NbT?e0XX%)Netsi#+(K6j{qILGkdm&PdInaVJ$}A8GY2)p_1^chP)@v zlc*`UU(5S>(R4Q?*JU1@YVL0_sUtrv2=lI7f9ex?0(SKyXKX#B5KT9;iCp2ZMtAZ2 zLiyp{7qw#i=}qLHR(LtFBm2q>%5$;rD8qzS9E%~Y<49qgTd(uz$9CpjAgY1DE zNiju9MvHEdiD=XUtUI>V{eATvhGJ()Z)iRG@JrT-Hk4*U9BppofAin1@T z(o+E9eCmKc!(!2a)vyMA1K}-j)hrBEbhfGDERwFXR?Fe?o6RZhQ~y99_?wgmuZEt4 zOQW+HjMTt@Ay(-eN*MfbWGS;Js6E9ibGSWTG&*;~S4ubdL+I!>-QXF*#LGj95o7kX zkn7YQdhj6_STB#%BVu3wPEn`SKY7OpVI@i0X@WJ+^0m`kVNY^q)+0GzKiwT9UHzSi zZ@(BI651`%nFb7TG5bF&k42&x}y~w5)q`^G#XYTFNJ1NWY!H=HxFss+h+Q_p< zk1DS}{%YO#DaR`L6w9D^Z!Y5Wp4x=hvd^1?ma2}VY{Bd&CS#Tn6##LtagFJb zg=etmr2wh5^ukT7%!tReqvB)TnRTC}WT~!MoYSODmyxAEP&C{{iPSMeWGUA$W&pDB zjk^hIV339V4!}#y@4N$zO>3jeu>QCpokGZk1G$1<79EFk!)GTw2?PU47UPPEKg^by zlfmH=Hz`C$V?39W(?%+sk0=KlD&;Zms8yC-jsP z3!LGH)Eyg>QLAdOGI;y7{+k$k){BFF`(d=e0Kg31vv{hZXY%ldHzLuCZiL=wUsjfp zw4SCQgHTo+Uf!k(?Hwc?-rgR&qVI6exGMZEk=i!u^C2!|^?{xGgqS}Y?tme?3A~Xh zc;|QX^2su^;Cz|9T&~XD7)TvpAHcy(2_bSFOGG@oKofzHmE1z}brn|)E|58o^_5Dx z8D-uDJj8z6OAyVfg0)S_?f)U%c38jD%Lr1Uj~OAm8u7uf-wXXkqL{m(49s1I@gn6 zw*H0^#vj4Iqy=d1AgU_Ny<{ISn@uh>G>@!&8>|@nom}E+k=)><82Bpx!= ztzHQqolu3iai$njfN5sWdVhPdt^K@wR5v~@Ge(o~CgtKQ(M<@1aDlob{=U8rxjA`{ z&g*(>ze~%_K$_cdFR9OupsmxE8!Kaa_Xd*bt_}~Su5}W=oB3P(VQ{o1h??{ zYkZi+Wctvjn>NcT|Fr?c%>H?c)ZcjWs`97ypF7N|cHQQHjEgCd9AlHR$2rCX*!e{N z3))&zqI*R;R1W&7_M zh5jI$%mhqcl$9n7hsKn6V;H=G!Opy4Or@L=I&-i4cb#mEQwAW-vx++MR`a;^Q@*Q9 z>pD#=YN~C|7+{$FYLoE0rroWxu&T+jT*Dor%|d6h?p2rMs7pByLWoHrRMpTvtq_Pr z4}Dks_~z^KqIb{VU3QJPm?pRFuXg@H@170PLiB?BgxqWsGYXFjZTTW{Ir|ZVa2)7- zquI9c#F6LuW_r{g3)2<)DQx;Zs%TA|VYu$cZ z!&ph0Hv^Cy7&O%))_Jo0p*?ov=L^)yrl+<`+hGm^1)s zzf|+ahjdib@O&=+DKeDM)f(YAXgyO11)wPXMF!;n9@LEHPrn7-8CE*wVAb7k*N_8v zLI1(g*R{mv{Z&o7YG*QQ$(4p9Q+*;TWd5;0D3v~T==(c8LF*M=UF{#v2BEjkI}5WZ z6y=nU-*y>i1W@7JXy_iAe(7sV$0iL+T5Mt71JHOjhd3%jTVRVr5 zxrcJF2R#l@YyipLrwOl2nGc)_MVtgdCfMt_hMUxPX@d1=k?Qj0;&*xU=RvPv{C+Rt zF-vllQE8ietP%A!WG_U>{LY~@_eJU4sw(tM%XL46%H%5EkMz;cTHPNL4ZkcpN(i82 zLOmTZVAz|{JnKqukaP&_TN$h69nvXnN=Pe*UoM%imOXP&W5Vz`%_WV|{z{=y4l@mi z9zJr!Pwp`!$F0cGBhWd&Z)m6=C$im<;hGrxAbsDH&t%f(~;_#r!Q{F_oT5+m0LTzO!MDKfW)iOnUKZ+!qeB{;KAg8Qq|l;lREF_%%#47|0Ht+ z-Yb|@OTT9PL@7&mPFuD;jjW$nZ|f!Wi_XuR4_#-^m|WYun(|^O&LH%I(O z)@A$+rU;Y4JXaU!xJtjV&M7e8@g5v5QRh+RVD#(2IH<3~6XcHg^^raXfFE2V& zTnG5t_jLb*IB+pKrW6kZen9$N_Vw!7IG`dtNDUYq{C4lZ1+uTI;o+pUeqM?%imB@( zaYoSuhV$nJ27S)yEAXoQ!9(ACh6~d0(04p?e!XK@S!*;hKuUP^Y-pq;kV0l%LEKw+ zd?YVmx<>kSbq{5qN5lL+GWlMNv-kWxKl)d;(@I~T?Tu6aOQ`Q@K&?V{1H2`&ZvHgB zlMJApEzWGn&bSp_Z@uSuaPemKeVph=G}6uJG&?7eBx)Vj64xOeskBRVbLhM0>`V@3 zgB=bWXD?;?13i z^==-^+Oq**`H}C>T+U*bF(Kkx&7xGBanqN3je8p?nq9}K6n&C`JGUsTu`$5Yn$aL1 zgYI?)zRe>SJMWMkk&CcPE9|F>N74Uv>XUtt-LepDNy8#)WX$4{-O=12>}kP4iZ?0C zkEq`eti*ikU4DHcr~q&v!HJlK8LFqp+VFxS#RS&Z*Spvo27xP*^1voM;|8_ALd2Vz zX@xU^-yRQcDxr6DC%v3rPdPzlveNAWX!f!;!hICm*NevIdmhomWIcwz+$pc zIOM3%om)djdH%e-7Wp_1s49{+Q|^sgVpHFV4Itdf7`Reeo`2wDk<4O4Bas}bT2;y| z^3b>?DIxw>2Fvx(qtkK{nSl&@^So*Ghv2k_u|Mq_oXu?JE~0@Po~)t4AEfi7*Gc5q z^YyaPeZQ{$idFd*w|jZp5+=lRZz$hQ@i7~*&_)UyHurIWkJ4)yYMtnFlKg(z*X4V2 zwlXf~e7JfWphDw?WGL>VT>3bC$4GdKn|2%S{K@Tz?y!UzadNRIgA$|bI*1KTe5?8% zI?|w6r{lg9`tF6{TJ+;02WzQ^aW84ZfAn&~>*1|IHlG?3+O_z-y7_>(SNLqUv~+sc z`!U%He^xHbOxCKe2+Q#|yal1n3^@!ID3B%SFU81lq9Pt~l#|z1{YFs2T9!Yov{WQL zT9V;b^y&Da5aos05aMN#BJEud5lUI{KesfK#Uf2%f4msz-V-8bVW)@!n)J5)_V)H@ zqh#6yR{UmytP%Tyqqq->!Bw8zTjYj_>Wwg+FTVlcTQ{bS(wtL^*X8RY4Lc&%Auzr5 zM3;*|uh;x6Cr@|1my13x|Mezm80uW2RWGWUhlzGSR8IKmtu0B#z~L@N52R(UgN)3Z z=)Hgb742-7jKbZd;o(WZ#+}F=+akh*xBj(_zT5YXAJDT7K=ODcXKH0ZQMt^-ZxB4t zk7${NMRZq~8}u-pV(5cRR992I$F8T#*^GN8!B&gbT-ssH=6wCwXKn6$<^@CBtsHDm zZ}|o~GPPE%{k1w045k)gc1~rXru=s~^@VRqcDtxJTAn92%piUREQk; zgqt`xx`oz$JbIoyU2xH{QTh`zI{*0)+YxpK)BC|g0M{{TSa3={x^*wqArBjJ{B4+g z`XK<*a%9kFY#!@uphWP~xFaE&`M&_E8b6JnWF7^(^iDEXGl(VBimE`AqpR1A=DILI zrQ}`YgNb5$bL8~KoQDZK{x~hyO0hjdC#1kCIr(RNgCyUqsZ1}nLHZGoH-0qE%>3N# ziaLvio>@_!ad-nwqMv&3Kx}MHTYrz8$3=o7uzPT+c|X-KWQ+|jkLjlxv!KE^i_SP! z%*Qbx$94SRCedlv!r6{C#g4qR=+qf$u&&Gb4AyG;sa8AvRV%nd08XkT%D%_x-7nr= z1uQTP>?5%iC_u_6lKA)bXHFNtx$HFZKS}~cQgFIZEP1~hjKrE=J$ZEXR~~P@AXVO) zUu9InPd9MuNL1I4JuEjLx&M277x}HDQ~zrKs$TxPrkzCed)-rW5@hO`HhK7On?HG6 z{k1o*o|gZY*I#un*}e>F-_GpM_AjFbLkWe298(56Cmd?~W~l-{oO|PCp(v zIUzJLF#iUyyuPp+^X!I%QMSvJqLrq~Un%-L3+P zBRug;&7-`Ek?Ad_S2x<)yo(c>IAUL&2Xd0<4B-%DQbF?f3;7G7w{?CdaD7!b`XZ>m zL?+M)`en*Ie2t+5qMA1V3n^+6)Zkm^)>ZX)?cnfblIRgTzcMp*N5qY!c?EXb6{D-S z&Y!arH_%Z202u^tcS$0h@n7HgmItqz1|3Niah;)-<&HN_$d3yBeWI{OGuN*>{IiL( zD62$ZbKZTLlU^}TTuKYuI!{!?Q_?7{VQ#n)&0uI~8FI@N#u*V8Hj?u%36JuB?8`r5V+ zb%PJ~!Rph`O4jXvPu6)^a7+e^`>PumaHT2m^qw>i$|E@;CIv?l^ojE=I<4mCE_$LE z1OTIcmmg!C^tTj@OQ(Cu^p2RW&kNfBz{8ysyWIxoM6NUopjVXTD`E~F;x@d$X3-~b z_)YHBo^g0_K*NdGnW_WQ^ModGeDmj!79;iI=4PciTU6Gbzx*%}R(;(5z*UUX%?mXx z?jr9)Ic|koU~E%WX)+Sy^e!+rrAHlpTi*C+&k8RUQT;MXBGpvX?8YAujM4!VS041q z?L4{%pUi}>%GWn#Dz=DB@h&G)2##>6Q{=dKY@9Zw7)jH|_2^M!g1$-C*KgAbtfScM z%af9$$d+Xa1m{0v7nrgcP|3S`Gp8Cb+tQ>)bHLiTs^H2Vsh#GlIKP>)ZTRiYiw&`hfa6m0-kMjpO(G#XYce_ z_FfpEO-J1qa6bmb!x!u^HdgMNzsx!W->4+??wV)C9_kMO*@)5Du{>ci?DNfS7bh;d zq72sN*_fV3wrPlfEWy>E$?0>w)Ah?mW?04T!z-VY! zJj#h9KsE0w0|Kevr<{<_pCr0{$v7A}@~vi_xm@G`u9K7eesarx=DfIs&YfDFJ$-Z}2*(-Wj}Fy9}5TQc1s8 zvv;A!y4_lOyt{PBEvk%AjVhDdbqGrZ$~<(7k2azfi|q+2P&QxsO3X1i|to8 zNB3y2XKX+(zL$rwY1vJnl2^a1_k^~HH3c2mk}Ci*=DSl+Q|FRY84+hG!N=EGBwFJE z&@@VgMMmGPrkH`BcG3kwo zVl&wQ8FI|g=!h;dGg^5(1lZ6?j7OhYJa`|^*8CBSCp203q*>e_goKfkmiz|*P0fvt z17ge(sipY)-O)Z$jIn~v?&c4)WV8w2Ya8oU|NXRuwe+rfs*#ga79S@F!HxsW_EsFk z!~_lyU@PT_%IK)G2=3TQ|ur~W$bx)zoYyYX&ztG*7BZ4?D0a2GD=3iv;m z?E9XBk9G?w(Z~v+$K+vSypKqpyo)g~a8vgC;hwLpUY9{iiqeZl2#asffr0vM6F7C_r?Cgm4|XhVZWt8Xxccp@IRE z6G#7F^GH6j(}w`b&&L!wj^y<@cY+lN){Y`8+%8B#FTguu+!{oC6#a)>00sy($~~SJ zk$o=~lZ}i}Akmz<->pOpuWdRF90{UWks$!|K2hL(u~MH)^1Bf?kkBw6?awzn#_sHU z3=CUIU-s6)TI^*D0X73ThT0c4`Ahp3zK0A+SAWBg&lTtcl2p$ z4CxV3q7MJ1y<6u{uk72Ig4rMU#^%1QoeBv2cd6j%;DVX&{TSj7VQa1F?bL00cV%_< zUBLgD+p`JbuK=J`I(u`)rG1R)JSB|KC?b~Y14Lp_02 zC4sY9jkw?vKxVWH&^>skvwV$i*ZeLw~F1l)8RUAnHZw9azz&dh?sM*9c#yi|W3$g#4AsK-r zS@;zyJJ_rM?LhiE&V#>d@dw-Z&apNpFSuu0a>ak1AM{7^1?%c|89ou z|DH*MR&HF##aGM&jf{CrjdQ_zQ?J`(VBlq;geU#eEd!D|lKSW$d$7~A=ic}$IMDW` zOx?2f24_S9>+`IPX(VqMD}!_e-u6Egtkg)2sO*I=oT?n@e404(&oCyRWpnv*8d>1s zbCoBgG492{;L_E8@mDw?mx`&zMxLs?avLD$$N(eJ7(0#F$nif@)CcPivG%V!fK*$6 zj8gkLH=tp%_W+h`ui2n>d%{%%Z4y)|N2WRd$m2o8pxb+DXzC$YAy1oI7O|07Jth}n zF&V#QQ8ih)ZEH6s<)4JLWlT-w*PP@UfaHCPp)C;rF;XeaDH+eUb^-hk{vOMe$04WRmOd&w3RKFSPBC ztk>$NvZ|0v7Hl^yA5x=g=H^*zfp`1UZE)5g0)gJmy9pySy6XtSWDXOsA=Crt-)) z+A|ic6< z_PR1ne@T!V(K|Z8e&Z^3@U6M%kv!RgM;<1#gEOL7OLVL8GkBo1)c=*}a}cHN>kjUS zr!h9}oeAS%Hr;FyPt%Nlhr0ua{;+)eRHA5o^-GbppZ9$ghtqis&D5%clMENZJ;DHy zf!Npac+02$1#`q2H3kL+QIw-mInO2Pq*2;FS?jF!k@l9TW4^3RIWq^_w8LP45#;3p z$$SA`W22eA0mTnbWf!Zy6_y-}4)}f+lQK>hIG&sK@ZdIFI~3h|-u0UW0Mzb;F0B z3Wk!I@-T{9yeby0ND_<^IG{2%u70bKe#lK+gAKkd>3T~JR*j&DYu34paGWnEg>-S^ zMK*ld`ZdOe(xu~m9f--fVF5Aq0PZv1==-HfY6b>6=(F>|r&XG?SGozgJzUYWV{)|Y zc~)tK&xc=15Q)+uIS0J&(`X(9$nb1wJ*Ki9=i=UU@w)Sn&kAC~*FbA>Ni%8(zUGgg zm!QTc{c{X^w!-n~I%d^F89H?+Zw7~~n98Ynh&`+G159XB3(JZ1t%%%oN@gWZ08}L9 zRsW)XwY6vGsfUq|r*4$Y)Kt|aZ{s9jiVXnWfh@}T9KnjNwenS#xQGdU3qXsruu7Mv zog4Mbij{Nug!%m6-9qjZsg#A`c_c$r#3yGvgmkwLHlCdS_Xr! zAA%MU)nRP$WP zrPSr|yx(DE-3^$HLB^EE|1Ws8C!|XO!=~Spw{VCW!?u9n>ZGDkoFu>2-v_}?CtBPR z2kV>zNA?U(bg9Gb%Y#W)bQW^r;!A*allD3>g5*lhu!QHIZn0$K_==6IU8E@{2=mRbQ>K6+~>ervn_s_07B=2V{{s9$wo-ki2KZ1@cTc z=v~h)ugO~PVRfKBHUoniK=Y$REWmt;B4+@N`iD@U4zc;bW0Os#r^o&Nub-DUzPeHe zvP`L@CU7p9M6J&xKk%yatt-y)GgFTo^By~+Evt+!-*p;eS2mcmJweYLO^gxz2Zmhj z+!Ca4Duw5-)jp+;et8i|0UfB%zyrTCS5II1(>EawrQy4_$5jOxr#u$lho8;KTpt2mul8t zd|-69y4E=qDBfg#zCN<+ZN}>VO9AhFC(sj)S-h)ILX=(MRp$mjRkeq6v8Bd%KD1Qp*^oNMU=)%)tUT#;N%XBoO^o?+aIpOq zP-Sd)eM&szUuatYYQvEYU8>>M98A=~&W&D;?sZTJk-!#8J!{)gImtq;b$MiyQz+ zY+ts;F8>uvf<-MYM+yEbbz`dS`9#~0>fgL2*qH$RuRdAff0|GK|F7u(tLHOZ%$Ers z=;#~#Ils29mKs?W3wjxJ1OB&?Omap59;dS7JMeoUb*%r6KoF${$1F>YWXCauA)S}S zG!s@Z^_HZ|uY@&TS;Zio$AtoQCVm{fsD`s@=uNp_wz;5zY4glpbLpI>SB@R^{_xzRgE$A^v9eVfVbKpE+ z-9;>p@Nw5xXR%KWDc&a8L%| zjj_j5!y(*;{2wPT2tbwnZBN$w5$b1I#oGY<%2E$Ce_mY08oZuGt5GkWn@GSp3MjRw zB=c(@@8!OIc%6dEVz0GEoM<jqcvV+)~cwiFvLsx9$PS)x*+c9lf)8g5s`3oBnm z_y0|On%9+yV7c7%Y%=Hbgzi{G9g|8~?)Ao|LlV8D$ge+JE-rmjyYQbzvPp(Lzh8Sg zkieRwIV7}>kFuq?-hlOadi|<(TC!kn=d%9X;4Y5%o zhCP#;T(PdN&&SU`>lSe%@UT2(REYSLYs|`btY6yc`+bW^8p$HqNZy8#<3!tlWFllr zjnecQ(24Sg{#JFn<8ECmw?QcD*GS6tR_O7DQhiKyZ<93AZf;dWJ3sZ9UVcsXE>TlE zb!(=iqJx(Yb5?%(PNA}@eG*wyrX)n^Wcd)tM;Byiwhag_J{MNVI^mK2Z%vrDsgv4mL*x7N=?>R)8!N zb*5Uue%V#)KL)Co&T%RV#}nTQuwDYkZ8)O=hQiA0X!|+xg+N}fR)Q%xzvVG>m%MBr zI}4*i{cp{j`BRhE8poqo8W2J%ph5&$8X{sutbpuvRF;r}Ac7!*&=3&9mIwlBOo=GU zS|SMwirBCyg@A-20okjeMjIe%44AS6h=43Y*o=gG=-in*{q@e=nf?XubKW`c`<(NA zzTeMd-4qZz9$l{y0Io32`Ql$i|{NMH(YF-()xxIpVunJO=eJ=Q(DkK<={y)GV{uk|HuFWI^ z+(Q$sAdryT>(1W!($!zsn;?*`zpdaO#AEtfGjF-h0tORuqFMX7&#m0dONJX9sXq%g zjJ17~TnW&OkQh|O<(6QefNuC*3-C4$nL`{454Jd#X=0i&LgGBNwWDlPX3$wvZhl#% zk*67B7NV%a>k5B)pm>=qOxyruXmCGKQ=N7Nde1?#1`U#}@Bs>l=97V#S{aZ^>+>-a zpjC~C7~lu^LOLApZ#5Tz+Xqhhin}|Z(e0fG6o%HsnutSmTHoi(l>VH)0IG?mMizSB zPzv^>A(M$UO4PAyA3p;`3SP9loTTL(1Z<=cAGI$8376OEXXunOlP3{Jm&i5iLPm*Q z?fls$pzvHYV%pMWw}HRx(%a$=7ZBaya58)Is?JOxib8YFzLMc2|=a~IUJ2$CRh zIRfMO`I;@LM#A&a6qXZ}FW$NLFgKG|_cHI}s0L)~*XVt*9V0u8RC{{Q{=_tVesNZ3 z*;OrdBA!Z6_A8e5#SeXO_I^i-eZ4v8x-$N|p3sEuin*t9qp|SI#GEiT`VfO1p#srU zW^7Lnao7#V8RNF|7QO%u&uo$ivZ5JPwOmZ39K(9jO3^%^N!#ADMz-_-U#QTM(zRe; zGu6KYOM?3K#}`Y1sm=1Frw0i3a3#dH!GL2U*5l146F;?}idbma(vll3&D|g2s@u0d zlbK)i=^3#u>@5hutd>59(~qk_z5y$->Sz+jqRr-M)otw)rIAspHij(PK1I-#H#_eb z*H56NV0`A)#b{&ie@-m2y~xP^SYTb~JJDWKpr#OMW|QV>Pk-6s6p*gt$oMIB+oKIeY^&|GBC#{(bb z*7UZ4#f$Xe>@mrC0sX}*Ml=Ht4F1UP1Qza`Y|~8!sUaRfq7_UaxgMOEnG1Ht=Dh3} z_g*KnUsJm+FjDPT0b95w8r56R4KT_l$L)UG;Y@VA&or5Anvu)xFdBWRvPbekavAA7 zvPf#<)Hy0k-ModT$`W`8yw;e-HxAC-9kjc^C~L= z52{#Nz`F)B;y2fvjCK6|NbQa-R7*7vZ^7VGwRn&@Wru$sz-UlB3nA!a@m&0bi8%QW zgxbMb%z+VrF0o(3vqdlK+1)JwZUrb;4R~K8Tn5T_ZMO9UXB8=Tyw89`sFv!Jm0o(l zz(i`y|EdTiz7)KNVQUhSYUF^QN=i$x%`N7PBlPVy?nj00sEMzy?`wQG1-rgcQBIgm z+}Bk~9ZTObhlztzi>B3N){F(oP!w&|ES^cW@9&f4^47eJk$0{{6YXJ3ss*n|irr|i zb)F26DHLqmc@eZ?@UL=2w6O#zI{j%~WWu4|*y(?TVmJ=uFOu@ei_PLJ!btu!L}KlS zR_A8DdDyNNgRh8)8*hi`6!GA wBJWvvGbBq1=g2#G^5&Ys6uM?$Fo2Gz`XC;$Ke diff --git a/tests_zemu/snapshots/st-ext-output-without-ext-spend-data/00006.png b/tests_zemu/snapshots/st-ext-output-without-ext-spend-data/00006.png index 82489637c89f0d7f8adbf0a560715b5df3767067..a72927492aeaf44dedc947ec73f6ad012d4916a8 100644 GIT binary patch delta 9227 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ℑ+ciB` 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 wBJWvvGbBq1=g2#G^5&Ys6uM?$Fo2Gz`XC;$Ke diff --git a/tests_zemu/snapshots/st-ext-sig-without-checkandsign/00006.png b/tests_zemu/snapshots/st-ext-sig-without-checkandsign/00006.png index 82489637c89f0d7f8adbf0a560715b5df3767067..a72927492aeaf44dedc947ec73f6ad012d4916a8 100644 GIT binary patch delta 9227 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 FV1g_Up_2dr delta 377 zcmV-<0fzp91C#@hB!62;L_t(|obA|Ka>F1DKvB}^PT2pF*h@d0Xc)w63Krnp^W}jC z94QEja{vGUfVr3DWFZ83_TJwyzV|+!C7v!jyKcM&nf`7izh*OCUv>PumBx`!#$Ec4 z>%G!$mIJ#4H0cORfRYE-m(J``*v*gee5Iho0j&g1BJREK`F}0z#t=e1G0k_F%Weh8 z@3&H^#dr}YrNpwn_b^=n*{$ymM--pSvOPdohDz_0DfVP{3~io4OPjF!lrOzG>yJ-4 zhL+wCHO<}Cc${xED*@w!006L`${9mSy8=(`83fa_lR+`@f)0uplLEf1^TsNwh$lsLB*y&2rpXAdX3 ztEc6-V`yXW{TJ*56oX9k&16DN^o@~&m8e21u@A3AcmV(a000000000000000fZO~5 XAnjWSf!{fJ00000NkvXXu0mjf&l0pp diff --git a/tests_zemu/snapshots/x-1-tr-in-1-spend-2-sh-out/00017.png b/tests_zemu/snapshots/x-1-tr-in-1-spend-2-sh-out/00017.png index 518993a1e4c73387c538a2f58266982a360d8237..1e1abf11379a4893b5c3e2bf86103065d9bfc020 100644 GIT binary patch delta 293 zcmV+=0owki0>1)~BYyz~Nkl3dY1B+E_dR+72Rte7MWg~O)XSpOra5?LU!x~*K+d`3 zcfLp|%~_srn}atO=^M~|&9~iu5d>~Q(|dkPRqmhkTBH_KG=EbZEAK_f7E}+;;(mky z0RE=|+tB8oa_!NHk&W%?(Z~<9ILz68wEv=xc2(p)LjDr2MSo#qp9QT6bT0J30-QKB z9VmPYicSG;ro*zW|Ja&-ZD1A?*fY`$aw1MM^0hw1579KETTQa;chg9(` z-@Q>v*;C#xhnd%d`YF!+(f#<=&)Rg8I%~-c1+) zfJyp43Qupv_FT~6XU_SpcN+cpe;a3xlwZQ_73e& z9Us>`hCUhp`lsLpJPcX-(+r}P{$y$p$to1dJ{(EB0000000000008iBz5%2V-gWfE Sm5KlW002ovP6b4+LSTZL)qR=( diff --git a/tests_zemu/snapshots/x-1-tr-in-1-spend-2-sh-out/00019.png b/tests_zemu/snapshots/x-1-tr-in-1-spend-2-sh-out/00019.png index e7072e1b1ed594ead3275a47a5a7675aed293e8c..7a73d6c7b76d319c8ee842615f5bff1b433e788d 100644 GIT binary patch delta 466 zcmV;@0WJRA1MCBkB!9C>L_t(|ob8%huEQV(bkRsoIZUp6|LYBwPTaNU!KWi@F7=tG`IE0NstZMt`^fM(zHJ#n85(A3%5o z*nC$vBH;oUy3!k1kTVnj0N}ZV`$=+msyULi)u+{fggb`zoo!g{P9a!zClTop5RBbxX>|teM*>$S_grXmc2R4zJz! zjYsbDXufU<$2E1?ll_mOC$hVrU_pE*!jTaG000000055i4=XwL?6X|pnE(I)07*qo IM6N<$f>HP2t^fc4 delta 450 zcmV;z0X_cg1Kb0UB!8nxL_t(|obB3SZo?o9hG91CCcgiXxXXT6LlyznteN#6sf**}fsLZ7<_@N`VTX6Yxu%uhB6X0U?&o~*mOVAA@ z&H!KU*$YwP32=Es?u=+{|p)jy_)OqA#-gS{|t1h;@-YJ_Rd3Ykc^tcts}<;%G%DpbPgfc8h?j z)%~bjD~dN_uYWAn7UC|-;?2?H4y-r@G1+#AG;tMq?PC)1N@H?&FDOi7s>;!a4&|bCznY&9=gPsgLqKU=Mx5X!hJ|8cuE zl*@9UOF&m1!4RP2!i}Y~_$mCFr?|gbP~w0#0v94~W+U%%UVrGlZzrZZhP8BGKzM%} zGj%XO3Di=eoZm-CzkuS>cZN$$K8I~pn~Enswq1Y9@z?gk0Cbo2`Zdw}G$E4fYv&@J(inRbdL%XQl497>=XWTG!q z2sP0cBL_P%3+==@yc6LC0000000000000000000^^9HJCJ7>vO6H@>H002ovPDHLk FV1g_Up_2dr delta 377 zcmV-<0fzp91C#@hB!62;L_t(|obA|Ka>F1DKvB}^PT2pF*h@d0Xc)w63Krnp^W}jC z94QEja{vGUfVr3DWFZ83_TJwyzV|+!C7v!jyKcM&nf`7izh*OCUv>PumBx`!#$Ec4 z>%G!$mIJ#4H0cORfRYE-m(J``*v*gee5Iho0j&g1BJREK`F}0z#t=e1G0k_F%Weh8 z@3&H^#dr}YrNpwn_b^=n*{$ymM--pSvOPdohDz_0DfVP{3~io4OPjF!lrOzG>yJ-4 zhL+wCHO<}Cc${xED*@w!006L`${9mSy8=(`83fa_lR+`@f)0uplLEf1^TsNwh$lsLB*y&2rpXAdX3 ztEc6-V`yXW{TJ*56oX9k&16DN^o@~&m8e21u@A3AcmV(a000000000000000fZO~5 XAnjWSf!{fJ00000NkvXXu0mjf&l0pp diff --git a/tests_zemu/snapshots/x-1-tr-out-1-spend-2-sh-out/00017.png b/tests_zemu/snapshots/x-1-tr-out-1-spend-2-sh-out/00017.png index 518993a1e4c73387c538a2f58266982a360d8237..1e1abf11379a4893b5c3e2bf86103065d9bfc020 100644 GIT binary patch delta 293 zcmV+=0owki0>1)~BYyz~Nkl3dY1B+E_dR+72Rte7MWg~O)XSpOra5?LU!x~*K+d`3 zcfLp|%~_srn}atO=^M~|&9~iu5d>~Q(|dkPRqmhkTBH_KG=EbZEAK_f7E}+;;(mky z0RE=|+tB8oa_!NHk&W%?(Z~<9ILz68wEv=xc2(p)LjDr2MSo#qp9QT6bT0J30-QKB z9VmPYicSG;ro*zW|Ja&-ZD1A?*fY`$aw1MM^0hw1579KETTQa;chg9(` z-@Q>v*;C#xhnd%d`YF!+(f#<=&)Rg8I%~-c1+) zfJyp43Qupv_FT~6XU_SpcN+cpe;a3xlwZQ_73e& z9Us>`hCUhp`lsLpJPcX-(+r}P{$y$p$to1dJ{(EB0000000000008iBz5%2V-gWfE Sm5KlW002ovP6b4+LSTZL)qR=( diff --git a/tests_zemu/snapshots/x-1-tr-out-1-spend-2-sh-out/00019.png b/tests_zemu/snapshots/x-1-tr-out-1-spend-2-sh-out/00019.png index e7072e1b1ed594ead3275a47a5a7675aed293e8c..7a73d6c7b76d319c8ee842615f5bff1b433e788d 100644 GIT binary patch delta 466 zcmV;@0WJRA1MCBkB!9C>L_t(|ob8%huEQV(bkRsoIZUp6|LYBwPTaNU!KWi@F7=tG`IE0NstZMt`^fM(zHJ#n85(A3%5o z*nC$vBH;oUy3!k1kTVnj0N}ZV`$=+msyULi)u+{fggb`zoo!g{P9a!zClTop5RBbxX>|teM*>$S_grXmc2R4zJz! zjYsbDXufU<$2E1?ll_mOC$hVrU_pE*!jTaG000000055i4=XwL?6X|pnE(I)07*qo IM6N<$f>HP2t^fc4 delta 450 zcmV;z0X_cg1Kb0UB!8nxL_t(|obB3SZo?o9hG91CCcgiXxXXT6LlyznteN#6sf**}fsLZ7<_@N`VTX6Yxu%uhB6X0U?&o~*mOVAA@ z&H!KU*$YwP32=Es?u=+{|p)jy_)OqA#-gS{|t1h;@-YJ_Rd3Ykc^tcts}<;%G%DpbPgfc8h?j z)%~bjD~dN_uYWAn7UC|-;?2?H4y-r@G1+#AG;tMq?PC)1N@H?&FDOi7s>;!a4&|bCHkO!j3CQcd>7n1hw5LMyQjuS9wQ000000000000000004k#egTvGJUuZ4Pf`E? N002ovPDHLkV1f{EuoM6Q delta 380 zcmV-?0fYXE1D6AkB!6B>L_t(|obA~`j>8}fKv7!tCfxr>+@*_XEEK>n1q`(Rts>Jx zVkdwS=Kufz0CNw^!9oaf?7g4SzxO^KB_1w2dK$bs8GddhFSC)ZOYOh5Qa_T)xGDXy z-YRjk8rT(}D$SrI=yu@R%9(u>cJnkIuauNHp-SQ;I zUuC8i{gXhcB$o4g3)3ecyY$U)#N=~Xwg#j#gVH)=h&|bDL#unx(jx5srmu8yPX9h+ z8(KO;XsWBLaX-IkQ~~-s0RUh#$_68CYKg>6E%DA#&USl`rZ=@5#DCAG>=y4FWfJR` zal@6~8X3RV|8>~e1vowX?(_nDfrASmFSq4DkMC)tFJk|7`ydm4tI5XCF!g>ZZA;Ro z#z?j+CBA$cTIqT7r}aA&lT7x_WKvD`jZuS@n1xni9bSp_0ssI2000000000000000 a)4Ty4U|^kTr}#zy0000}SA{Ar&-{=RE0Z{L??0>17J7aLK-c(B~cTHw9 z1JoFpGkNzn_G^IZe02jerx{n5>z^=~0ePw^ds}W9^DpKlt#u+#HR?I#MYVZXdjtRg zfOV+t;HtYrv$LQxRt?ryeXLIwdY(zHQ&89+ z{ohbMVRglI3R-&3f9CN%1H$7;@MrvVwX+Q^|Gnv4yUIcbE%DRPg*Agr^rxwWn&?l) z7+4|;Sz;ZwM0f!J0000000000000000Dxh>!Cm)L-+juU00000NkvXXu0mjfx?G>F delta 873 zcmV-v1D5>z0{;e(BYy)%NklaTS`MeW4HOJkPeIZQ@J35z~Bz z-%G6A;a<$xF^SIXht)EC_Q9{FRoD~N004iMSm_cDqT_wQ-hXxcc${&H?STF^0YAi= z8E}yeifj-W?nj-RM&2nXAM-UZ3p3VqfEm~4JErog$$K=3!09d#np!m}J4T56 zFjpv9svQtoY;5(w@MBA_}$=23(squ?=<~IZ{-(bOP zpYgdB=_|+%yMH?^d^__UuqqNEgb?3LUkwE^4ycc{#xb%;j_7a++?ja50ouFvzIaC? zRD}d{QoetfKQ=ItFkXCwO!I+1kq=&b6K;)?BPcBFj@*TMBr{aACROjPFS2331B}tr zeafgN=x)+oQjYgrlPmz(VQu#(!8NSA*_!!HENOdn>eTT8**k zgNy;|MOn!zUwo?#Z@eo%$cO>#G1O0}?n)Q#sLV(3qqqro54hoe%dFjDg)p80Uxh7G z8q)^SBrE&d2vV)=Z$^FaNwf-ml1`G<2an>@J9sygKgp5rLGAerh=}3KDkvFKqHqjh zg)AZ1$bTRuL6MwNnT$GMziOcxgD)RbST86kVn9$N?NqyG-s3P~(s$fU0pr4GUOvQ7 z6w8{Is)fIT%B{7VZo_P7lQV!BH?VQ=fZS8~&RjDx-lalg` zO{t+DhWa35wzAjzzX2WGF%;Md-GvRSfH1)D#D6h_A2ast$wCMrgb@D)NDZw@dgQAI z|JDO)0twTXfbaOegn8;2t+zn+^v%@wBFwzOtTLl7%?O!f9bBz^F^g0*!!dFVgiJ33 z2A`GJdyw9TwO-`d2#3RpW>$#*+8vc%jwPe5>Yd$q$Y=MU88Cd+@>A8k%*iY)UE^7W zGh(@IR-(KFkt;xWd#)WFUbSWnn&jeON>UZJ%y=JL8#i6fEnLt07g+cRr~~E|&4U;h zrg^4)GE*cwP|jZ-01KDT1IUaJLI@#*5I=&yU}{0C;+B|t00000NkvXXu0mjf6EdeR diff --git a/tests_zemu/snapshots/x-2-spend-2-out/00017.png b/tests_zemu/snapshots/x-2-spend-2-out/00017.png index 1868aeb579ae502049da5cde07d52f0e1569f909..1ef49baae7efd0519feef4aa9231a01174c6c573 100644 GIT binary patch delta 268 zcmV+n0rURr1EvCyBYyzxNklr1ROJXnmVL}+g^mCe`%sF3( z2_d%>&}{<%fa!jsC-9V7YkyfviJHm3yGBpo1!u~=$y9)Y{N|INH(>w( zCh7kuJiHa#b3%uoIrncp-{?pCWSrr|zAELHa4-AUR{8>DrvSkeAeaIyX2KcZaN0Yx z-#aX3IfgzM|NN)m1^gMZ^rsm_E&a*VAd*!ml6^RmcmV(a000000002sYi@kh-gP&1 SW`FPJc`Wwv<2BF%eBM9U#Vax)L{s%-piw+)6Fow?uU_T2#*oVKYE~)Anl5RLcX; zd#Nek0OzBpf1T(2t~72}#64z}8BZRz3#x7A4r?z_RxC?ycO!bW(HB0^M0t_dPyKfK zH7Bh|uTb0Uu73~mULhS2@+1I&_X;}=eahLkwpVdVbRkQ$tUun^4Xrq=f z-Vx9|>N&1Qu-#4kd*&ad;-Xf?3?dEz#m((8*VsG*#8E`!xtMdF@$^h^`vSGI19U2H z7Xd%}eWFhG`$Yaj=8=xX&B*?CavQqrm7M)ztwdLGN=uyoo^SjJ-=uf@g7^m2B$NGR zj8v2T#pr{bScP`FNiuyf73l>4000000000000000005@>1Ho06gXS91?n+#&pJ|B`n{+tq|Gad(LKx&MFfd68k> zN@iU_1_Y?kSUM%>N_yde&|0SVPeg0KTC<+`GClR;ypxJ)tTRd_E`K?^jv+Ld`96r2 zENsi0TjvsUMg2q1KJJ;z(` z-@Q>v*;C#xhnd%d`YF!+(f#<=&)Rg8I%~-c1+) zfJyp43Qupv_FT~6XU_SpcN+cpe;a3xlwZQ_73e& z9Us>`hCUhp`lsLpJPcX-(+r}P{$y$p$to1dJ{(EB0000000000008iBz5%2V-gWfE Sm5KlW002ovP6b4+LSTZxg?+vN diff --git a/tests_zemu/snapshots/x-2-spend-2-out/00019.png b/tests_zemu/snapshots/x-2-spend-2-out/00019.png index 1e4be69934787c368c2b5ed677cc7f5a2470be3b..7a73d6c7b76d319c8ee842615f5bff1b433e788d 100644 GIT binary patch delta 466 zcmV;@0WJRH0_+2jB!9C>L_t(|ob8%huEQV(bkRsoIZUp6|LYBwPTaNU!KWi@F7=tG`IE0NstZMt`^fM(zHJ#n85(A3%5o z*nC$vBH;oUy3!k1kTVnj0N}ZV`$=+msyULi)u+{fggb`zoo!g{P9a!zClTop5RBbxX>|teM*>$S_grXmc2R4zJz! zjYsbDXufU<$2E1?ll_mOC$hVrU_pE*!jTaG000000055i4=XwL?6X|pnE(I)07*qo IM6N<$f?VX_v;Y7A delta 328 zcmaFE{FrHiO1+k+i(^Q|oVPcl`I-y_S|48AA^dIsl6Obj)r2o`cZm17|9|g!kzw9S zW?exB1gOwhIwj~zdf|c4TBi3;L~FlVv!3`eJ@w+elZt7qGfE{ce>uF4AvBozK8Thq zY|EQl=Mr;8{X@?_?wQNv%lb!0KmvOOmz2)xce>Zxszx!@6tIg-va!D88U+Rn5 zyh;>R*B$mc^1Jki@k1-6YsM?ndam@BnVS`F?0s*(-n^`c@2Ss@`178Jbj6K~ij|I|L!UEucr(SzJy5&O=zU6x<5KlktXPs|8E+r8v_*1Pd7 S^YeoSAVE)8KbLh*2~7Z}@S8{g diff --git a/tests_zemu/snapshots/x-2-spend-2-out/00020.png b/tests_zemu/snapshots/x-2-spend-2-out/00020.png index e7072e1b1ed594ead3275a47a5a7675aed293e8c..7a73d6c7b76d319c8ee842615f5bff1b433e788d 100644 GIT binary patch delta 466 zcmV;@0WJRA1MCBkB!9C>L_t(|ob8%huEQV(bkRsoIZUp6|LYBwPTaNU!KWi@F7=tG`IE0NstZMt`^fM(zHJ#n85(A3%5o z*nC$vBH;oUy3!k1kTVnj0N}ZV`$=+msyULi)u+{fggb`zoo!g{P9a!zClTop5RBbxX>|teM*>$S_grXmc2R4zJz! zjYsbDXufU<$2E1?ll_mOC$hVrU_pE*!jTaG000000055i4=XwL?6X|pnE(I)07*qo IM6N<$f>HP2t^fc4 delta 450 zcmV;z0X_cg1Kb0UB!8nxL_t(|obB3SZo?o9hG91CCcgiXxXXT6LlyznteN#6sf**}fsLZ7<_@N`VTX6Yxu%uhB6X0U?&o~*mOVAA@ z&H!KU*$YwP32=Es?u=+{|p)jy_)OqA#-gS{|t1h;@-YJ_Rd3Ykc^tcts}<;%G%DpbPgfc8h?j z)%~bjD~dN_uYWAn7UC|-;?2?H4y-r@G1+#AG;tMq?PC)1N@H?&FDOi7s>;!a4&|bC)jB z8Gzu*-jY>?=Trp+D;J3go_zi3>d}t@)pB22dGcp-p4*vJ)+Q3vbNt{R_PhHveyq59 zMbyq(a$e$xV~Z_Z&WU8)tS*~4QM7*Jva=1}#P7v-WXC4u)^0aqJ{Fbq@gq>MCN*P^ zY*4GO*YSY$dyB7`J$$_X@3Yy(8$bL$e!)#S(Dc=h6*W9}Pp#nF5zoQEpk~@9nf~sy ziL$g;-sM~CpV_^*@mVWLv2ESr^_}{w)3-nEdYay_f64~? PGB9|$`njxgN@xNA{#BB9 delta 326 zcmaFE^qFabO0Jcsi(^Q|oVPbT`3@`aI9%NF%D3jfa^ZBn48f!xCPTGf`J$G(0>)jB z8Gzu*-jY>?=Trp+cP^vY1dn8g_yu6<)YCy_AwV#mois37;-IE z^Rs-bdj9co_wVKr=VYy(<{PG$hx;1c3=j4&y&3K%zvhV67NOrCyq1WA{EGy3oE4v1 V6YcR|`LH`k)YH|^Wt~$(6984fklX+O diff --git a/tests_zemu/snapshots/x-2-tr-in-2-tr-out/00009.png b/tests_zemu/snapshots/x-2-tr-in-2-tr-out/00009.png index 518993a1e4c73387c538a2f58266982a360d8237..1ef49baae7efd0519feef4aa9231a01174c6c573 100644 GIT binary patch delta 257 zcmV+c0sj7`0;U3xEq_~%gdh+FP^Z&7VgE~FFa2Rc7{l~)nxf1(Ux*1Iw-nHA0|0>O zexfJvlv-%Rnvm!R!uzO5?jhu+Jy1U18mbLHNoT!Q+}U3%V47yy7t`acR!Z^iap z(BWs!`K@;v{rG2B;%E1M2avt3tvFFiPkZ^=DI;Aob{P(lbD}@PF0_C%~xHUojcl67&TK z&j1_m>Ov%(07EzQ1`^~92><}NFX28(4p%krcy0A+H6Y=Zp?zl?Hg-!0mw-Y)6&n9} zXh-jP)MbCPbjD49(L}cY3TB6L&cj3Xo|r9L&;&H$9>#7GP$BJ#*oYk&swKotl;zCP zhzT&}k}|(gVt?!#;UuUG+oqhFh}X5W-s~^mL?j3R007{gIJlw9SBm`&_ne>7z8$fZ zuHouFpf?Ft*#^C9)O$qRPJie4*9zxGtZBRYKnz1O&(_}2n9hWc712vX@edl4=cD2< z?4>W}>I57#IOm}`<<<>14m5>$#_FVOWl^E=ER;a5Jcj}yxcT{|i#I7kw**{ou_UE|2!=TO9JXrlf!)vc$s(l2`0o7BCHny00000003YCf7})Y Ul0GSZp#T5?07*qoM6N<$f(n7yX#fBK delta 450 zcmV;z0X_cs1Kb0UB!8nxL_t(|obB3SZo?o9hG91CCcgiXxXXT6LlyznteN#6sf**}fsLZ7<_@N`VTX6Yxu%uhB6X0U?&o~*mOVAA@ z&H!KU*$YwP32=Es?u=+{|p)jy_)OqA#-gS{|t1h;@-YJ_Rd3Ykc^tcts}<;%G%DpbPgfc8h?j z)%~bjD~dN_uYWAn7UC|-;?2?H4y-r@G1+#AG;tMq?PC)1N@H?&FDOi7s>;!a4&|bCHkO!j3CQcd>7n1hw5LMyQjuS9wQ000000000000000004k#egTvGJUuZ4Pf`E? N002ovPDHLkV1f{EuoM6Q delta 380 zcmV-?0fYXE1D6AkB!6B>L_t(|obA~`j>8}fKv7!tCfxr>+@*_XEEK>n1q`(Rts>Jx zVkdwS=Kufz0CNw^!9oaf?7g4SzxO^KB_1w2dK$bs8GddhFSC)ZOYOh5Qa_T)xGDXy z-YRjk8rT(}D$SrI=yu@R%9(u>cJnkIuauNHp-SQ;I zUuC8i{gXhcB$o4g3)3ecyY$U)#N=~Xwg#j#gVH)=h&|bDL#unx(jx5srmu8yPX9h+ z8(KO;XsWBLaX-IkQ~~-s0RUh#$_68CYKg>6E%DA#&USl`rZ=@5#DCAG>=y4FWfJR` zal@6~8X3RV|8>~e1vowX?(_nDfrASmFSq4DkMC)tFJk|7`ydm4tI5XCF!g>ZZA;Ro z#z?j+CBA$cTIqT7r}aA&lT7x_WKvD`jZuS@n1xni9bSp_0ssI2000000000000000 a)4Ty4U|^kTr}#zy0000O zexfJvlv-%Rnvm!R!uzO5?jhu+Jy1U18mbLHNoT!Q+}U3%V47yy7t`acR!Z^iap z(BWs!`K@;v{rGHkO!j3CQcd>7n1hw5LMyQjuS9wQ000000000000000004k#egTvGJUuZ4Pf`E? N002ovPDHLkV1f{EuoM6Q delta 380 zcmV-?0fYXE1D6AkB!6B>L_t(|obA~`j>8}fKv7!tCfxr>+@*_XEEK>n1q`(Rts>Jx zVkdwS=Kufz0CNw^!9oaf?7g4SzxO^KB_1w2dK$bs8GddhFSC)ZOYOh5Qa_T)xGDXy z-YRjk8rT(}D$SrI=yu@R%9(u>cJnkIuauNHp-SQ;I zUuC8i{gXhcB$o4g3)3ecyY$U)#N=~Xwg#j#gVH)=h&|bDL#unx(jx5srmu8yPX9h+ z8(KO;XsWBLaX-IkQ~~-s0RUh#$_68CYKg>6E%DA#&USl`rZ=@5#DCAG>=y4FWfJR` zal@6~8X3RV|8>~e1vowX?(_nDfrASmFSq4DkMC)tFJk|7`ydm4tI5XCF!g>ZZA;Ro z#z?j+CBA$cTIqT7r}aA&lT7x_WKvD`jZuS@n1xni9bSp_0ssI2000000000000000 a)4Ty4U|^kTr}#zy0000O zexfJvlv-%Rnvm!R!uzO5?jhu+Jy1U18mbLHNoT!Q+}U3%V47yy7t`acR!Z^iap z(BWs!`K@;v{rGHkO!j3CQcd>7n1hw5LMyQjuS9wQ000000000000000004k#egTvGJUuZ4Pf`E? N002ovPDHLkV1f{EuoM6Q delta 380 zcmV-?0fYXE1D6AkB!6B>L_t(|obA~`j>8}fKv7!tCfxr>+@*_XEEK>n1q`(Rts>Jx zVkdwS=Kufz0CNw^!9oaf?7g4SzxO^KB_1w2dK$bs8GddhFSC)ZOYOh5Qa_T)xGDXy z-YRjk8rT(}D$SrI=yu@R%9(u>cJnkIuauNHp-SQ;I zUuC8i{gXhcB$o4g3)3ecyY$U)#N=~Xwg#j#gVH)=h&|bDL#unx(jx5srmu8yPX9h+ z8(KO;XsWBLaX-IkQ~~-s0RUh#$_68CYKg>6E%DA#&USl`rZ=@5#DCAG>=y4FWfJR` zal@6~8X3RV|8>~e1vowX?(_nDfrASmFSq4DkMC)tFJk|7`ydm4tI5XCF!g>ZZA;Ro z#z?j+CBA$cTIqT7r}aA&lT7x_WKvD`jZuS@n1xni9bSp_0ssI2000000000000000 a)4Ty4U|^kTr}#zy0000O zexfJvlv-%Rnvm!R!uzO5?jhu+Jy1U18mbLHNoT!Q+}U3%V47yy7t`acR!Z^iap z(BWs!`K@;v{rG Date: Tue, 14 Nov 2023 17:02:26 +0800 Subject: [PATCH 21/24] tests: fix a vector --- tests_zemu/tests/vectors.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests_zemu/tests/vectors.ts b/tests_zemu/tests/vectors.ts index 8ed2b5af..04bfbe5f 100644 --- a/tests_zemu/tests/vectors.ts +++ b/tests_zemu/tests/vectors.ts @@ -132,7 +132,7 @@ const three: TxInputData = { }, { address: 'c69e979c6763c1b09238dc6bd5dcbf35360df95dcadf8c0fa25dcbedaaf6057538b812d06656726ea27667', - value: 60000 + 40000 - 55000, + value: 60000 + 40000 - 55000 - 10000, memo_type: 0xf6, ovk: '6fc01eaa665e03a53c1e033ed0d77b670cf075ede4ada769997a2ed2ec225fca', }, From 080036013cc8727f8bb27ee0559702dd3340d2b9 Mon Sep 17 00:00:00 2001 From: becominginsane Date: Tue, 14 Nov 2023 17:02:54 +0800 Subject: [PATCH 22/24] chore: more snapshots --- .../s-1-tr-in-1-spend-2-sh-out/00022.png | Bin 320 -> 407 bytes .../s-1-tr-out-1-spend-2-sh-out/00022.png | Bin 320 -> 407 bytes .../snapshots/s-2-spend-2-out/00023.png | Bin 320 -> 407 bytes .../snapshots/s-2-tr-in-2-tr-out/00014.png | Bin 329 -> 407 bytes .../sp-1-tr-in-1-spend-2-sh-out/00019.png | Bin 496 -> 476 bytes .../sp-1-tr-out-1-spend-2-sh-out/00019.png | Bin 496 -> 476 bytes .../snapshots/sp-2-spend-2-out/00020.png | Bin 496 -> 476 bytes .../snapshots/sp-2-tr-in-2-tr-out/00011.png | Bin 507 -> 476 bytes .../st-1-tr-in-1-spend-2-sh-out/00008.png | Bin 5467 -> 10838 bytes .../st-1-tr-out-1-spend-2-sh-out/00008.png | Bin 5467 -> 10838 bytes .../snapshots/st-2-tr-in-2-tr-out/00005.png | Bin 5467 -> 10838 bytes .../x-1-tr-in-1-spend-2-sh-out/00019.png | Bin 492 -> 476 bytes .../x-1-tr-out-1-spend-2-sh-out/00019.png | Bin 492 -> 476 bytes .../snapshots/x-2-spend-2-out/00020.png | Bin 492 -> 476 bytes .../snapshots/x-2-tr-in-2-tr-out/00011.png | Bin 504 -> 476 bytes 15 files changed, 0 insertions(+), 0 deletions(-) diff --git a/tests_zemu/snapshots/s-1-tr-in-1-spend-2-sh-out/00022.png b/tests_zemu/snapshots/s-1-tr-in-1-spend-2-sh-out/00022.png index 1cd31cb2583141eb9a68beca2d3844084ec96496..b7541f870581d5c0e5fae5452fba5da570e61034 100644 GIT binary patch delta 380 zcmV-?0fYX)0+$1jB!6B>L_t(|ob8#>4#OY_MeVZw{|EPBdoVKukg6CQmh)!2>T;DU zXi7m41i@1|EC%^p+{mZ4Lro8V!`osIsMJQLBegf%x;7)}6^o7GMbbW`tYn}FVhMrCU00ZLr6CVvzb{&|^>CR>X9;a<8I zOe_el-$K?jdwqEVoAmRvp#`$qnj!*9W)l8$OUa~38a+Azay=DLP#pYFY{FgAPjoH6B{BD()fUuMB86oURvgA5 zXmH#ff5N74v~}l!p$LHWDqFjDb(P3|4g(8S(X|r9r}{}10Ry_%4n*0dtsKhpNy}Ne}xBioiF69$<)-T*Rq7aeqCbzhl^o%kKSWO(p1sa?${~!p0 awR`~|W1vof;0gQy0000Dj<6$Mi8&o7;!1#50c$_mdZD`fBsk zo`8rf;#r%b`@=Ze_sqd-?pxgf5A6y3fFwNF#=Hc1ysE^OJ%5JTQ_x96 r2Oz}rVlOCzr5*qP000000B*nr>iCU@T!S?=00000NkvXXu0mjfT$_b8 diff --git a/tests_zemu/snapshots/s-1-tr-out-1-spend-2-sh-out/00022.png b/tests_zemu/snapshots/s-1-tr-out-1-spend-2-sh-out/00022.png index 1cd31cb2583141eb9a68beca2d3844084ec96496..b7541f870581d5c0e5fae5452fba5da570e61034 100644 GIT binary patch delta 380 zcmV-?0fYX)0+$1jB!6B>L_t(|ob8#>4#OY_MeVZw{|EPBdoVKukg6CQmh)!2>T;DU zXi7m41i@1|EC%^p+{mZ4Lro8V!`osIsMJQLBegf%x;7)}6^o7GMbbW`tYn}FVhMrCU00ZLr6CVvzb{&|^>CR>X9;a<8I zOe_el-$K?jdwqEVoAmRvp#`$qnj!*9W)l8$OUa~38a+Azay=DLP#pYFY{FgAPjoH6B{BD()fUuMB86oURvgA5 zXmH#ff5N74v~}l!p$LHWDqFjDb(P3|4g(8S(X|r9r}{}10Ry_%4n*0dtsKhpNy}Ne}xBioiF69$<)-T*Rq7aeqCbzhl^o%kKSWO(p1sa?${~!p0 awR`~|W1vof;0gQy0000Dj<6$Mi8&o7;!1#50c$_mdZD`fBsk zo`8rf;#r%b`@=Ze_sqd-?pxgf5A6y3fFwNF#=Hc1ysE^OJ%5JTQ_x96 r2Oz}rVlOCzr5*qP000000B*nr>iCU@T!S?=00000NkvXXu0mjfT$_b8 diff --git a/tests_zemu/snapshots/s-2-spend-2-out/00023.png b/tests_zemu/snapshots/s-2-spend-2-out/00023.png index 1cd31cb2583141eb9a68beca2d3844084ec96496..b7541f870581d5c0e5fae5452fba5da570e61034 100644 GIT binary patch delta 380 zcmV-?0fYX)0+$1jB!6B>L_t(|ob8#>4#OY_MeVZw{|EPBdoVKukg6CQmh)!2>T;DU zXi7m41i@1|EC%^p+{mZ4Lro8V!`osIsMJQLBegf%x;7)}6^o7GMbbW`tYn}FVhMrCU00ZLr6CVvzb{&|^>CR>X9;a<8I zOe_el-$K?jdwqEVoAmRvp#`$qnj!*9W)l8$OUa~38a+Azay=DLP#pYFY{FgAPjoH6B{BD()fUuMB86oURvgA5 zXmH#ff5N74v~}l!p$LHWDqFjDb(P3|4g(8S(X|r9r}{}10Ry_%4n*0dtsKhpNy}Ne}xBioiF69$<)-T*Rq7aeqCbzhl^o%kKSWO(p1sa?${~!p0 awR`~|W1vof;0gQy0000Dj<6$Mi8&o7;!1#50c$_mdZD`fBsk zo`8rf;#r%b`@=Ze_sqd-?pxgf5A6y3fFwNF#=Hc1ysE^OJ%5JTQ_x96 r2Oz}rVlOCzr5*qP000000B*nr>iCU@T!S?=00000NkvXXu0mjfT$_b8 diff --git a/tests_zemu/snapshots/s-2-tr-in-2-tr-out/00014.png b/tests_zemu/snapshots/s-2-tr-in-2-tr-out/00014.png index 49aa607851ece876836b6b645057420409a9d08b..b7541f870581d5c0e5fae5452fba5da570e61034 100644 GIT binary patch delta 380 zcmV-?0fYX@0+$1jB!6B>L_t(|ob8#>4#OY_MeVZw{|EPBdoVKukg6CQmh)!2>T;DU zXi7m41i@1|EC%^p+{mZ4Lro8V!`osIsMJQLBegf%x;7)}6^o7GMbbW`tYn}FVhMrCU00ZLr6CVvzb{&|^>CR>X9;a<8I zOe_el-$K?jdwqEVoAmRvp#`$qnj!*9W)l8$OUa~38a+Azay=DLP#pYFY{FgAPjoH6B{BD()fUuMB86oURvgA5 zXmH#ff5N74v~}l!p$LHWDqFjDb(P3|4g(8S(X|r9r}{}10Ry_%4n*0dtsKhpNy}Ne}xBioiF69$<)-T*Rq7aeqCbzhl^o%kKSWO(p1sa?${~!p0 awR`~|W1vof;0gQy0000$I3Bx6RoePT0epcR zvgZ?q652UnAtypU@6G~!pcDWA00000003|S4m-G$hCD%*{r~^~07*qoM6N<$f)7lK AT>t<8 diff --git a/tests_zemu/snapshots/sp-1-tr-in-1-spend-2-sh-out/00019.png b/tests_zemu/snapshots/sp-1-tr-in-1-spend-2-sh-out/00019.png index 6958c981b015b1ea976e5ba479ae4a4b4a5473c4..e7072e1b1ed594ead3275a47a5a7675aed293e8c 100644 GIT binary patch delta 450 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 IM6N<$f>HP2t^fc4 diff --git a/tests_zemu/snapshots/x-1-tr-out-1-spend-2-sh-out/00019.png b/tests_zemu/snapshots/x-1-tr-out-1-spend-2-sh-out/00019.png index 7a73d6c7b76d319c8ee842615f5bff1b433e788d..e7072e1b1ed594ead3275a47a5a7675aed293e8c 100644 GIT binary patch delta 450 zcmV;z0X_cg1Kb0UB!8nxL_t(|obB3SZo?o9hG91CCcgiXxXXT6LlyznteN#6sf**}fsLZ7<_@N`VTX6Yxu%uhB6X0U?&o~*mOVAA@ z&H!KU*$YwP32=Es?u=+{|p)jy_)OqA#-gS{|t1h;@-YJ_Rd3Ykc^tcts}<;%G%DpbPgfc8h?j z)%~bjD~dN_uYWAn7UC|-;?2?H4y-r@G1+#AG;tMq?PC)1N@H?&FDOi7s>;!a4&|bCL_t(|ob8%huEQV(bkRsoIZUp6|LYBwPTaNU!KWi@F7=tG`IE0NstZMt`^fM(zHJ#n85(A3%5o z*nC$vBH;oUy3!k1kTVnj0N}ZV`$=+msyULi)u+{fggb`zoo!g{P9a!zClTop5RBbxX>|teM*>$S_grXmc2R4zJz! zjYsbDXufU<$2E1?ll_mOC$hVrU_pE*!jTaG000000055i4=XwL?6X|pnE(I)07*qo IM6N<$f>HP2t^fc4 diff --git a/tests_zemu/snapshots/x-2-spend-2-out/00020.png b/tests_zemu/snapshots/x-2-spend-2-out/00020.png index 7a73d6c7b76d319c8ee842615f5bff1b433e788d..e7072e1b1ed594ead3275a47a5a7675aed293e8c 100644 GIT binary patch delta 450 zcmV;z0X_cg1Kb0UB!8nxL_t(|obB3SZo?o9hG91CCcgiXxXXT6LlyznteN#6sf**}fsLZ7<_@N`VTX6Yxu%uhB6X0U?&o~*mOVAA@ z&H!KU*$YwP32=Es?u=+{|p)jy_)OqA#-gS{|t1h;@-YJ_Rd3Ykc^tcts}<;%G%DpbPgfc8h?j z)%~bjD~dN_uYWAn7UC|-;?2?H4y-r@G1+#AG;tMq?PC)1N@H?&FDOi7s>;!a4&|bCL_t(|ob8%huEQV(bkRsoIZUp6|LYBwPTaNU!KWi@F7=tG`IE0NstZMt`^fM(zHJ#n85(A3%5o z*nC$vBH;oUy3!k1kTVnj0N}ZV`$=+msyULi)u+{fggb`zoo!g{P9a!zClTop5RBbxX>|teM*>$S_grXmc2R4zJz! zjYsbDXufU<$2E1?ll_mOC$hVrU_pE*!jTaG000000055i4=XwL?6X|pnE(I)07*qo IM6N<$f>HP2t^fc4 diff --git a/tests_zemu/snapshots/x-2-tr-in-2-tr-out/00011.png b/tests_zemu/snapshots/x-2-tr-in-2-tr-out/00011.png index fc8356d7081b13dcad053e53ce07100a458b385d..e7072e1b1ed594ead3275a47a5a7675aed293e8c 100644 GIT binary patch delta 450 zcmV;z0X_cs1Kb0UB!8nxL_t(|obB3SZo?o9hG91CCcgiXxXXT6LlyznteN#6sf**}fsLZ7<_@N`VTX6Yxu%uhB6X0U?&o~*mOVAA@ z&H!KU*$YwP32=Es?u=+{|p)jy_)OqA#-gS{|t1h;@-YJ_Rd3Ykc^tcts}<;%G%DpbPgfc8h?j z)%~bjD~dN_uYWAn7UC|-;?2?H4y-r@G1+#AG;tMq?PC)1N@H?&FDOi7s>;!a4&|bC2B;%E1M2avt3tvFFiPkZ^=DI;Aob{P(lbD}@PF0_C%~xHUojcl67&TK z&j1_m>Ov%(07EzQ1`^~92><}NFX28(4p%krcy0A+H6Y=Zp?zl?Hg-!0mw-Y)6&n9} zXh-jP)MbCPbjD49(L}cY3TB6L&cj3Xo|r9L&;&H$9>#7GP$BJ#*oYk&swKotl;zCP zhzT&}k}|(gVt?!#;UuUG+oqhFh}X5W-s~^mL?j3R007{gIJlw9SBm`&_ne>7z8$fZ zuHouFpf?Ft*#^C9)O$qRPJie4*9zxGtZBRYKnz1O&(_}2n9hWc712vX@edl4=cD2< z?4>W}>I57#IOm}`<<<>14m5>$#_FVOWl^E=ER;a5Jcj}yxcT{|i#I7kw**{ou_UE|2!=TO9JXrlf!)vc$s(l2`0o7BCHny00000003YCf7})Y Ul0GSZp#T5?07*qoM6N<$f(n7yX#fBK From 6acc6dd41e4821e3322052e70b983a89c386d8b9 Mon Sep 17 00:00:00 2001 From: becominginsane Date: Tue, 14 Nov 2023 17:25:48 +0800 Subject: [PATCH 23/24] chore: more snapshots --- .../00019.png | Bin 351 -> 336 bytes .../00023.png | Bin 260 -> 283 bytes .../00019.png | Bin 351 -> 336 bytes .../00023.png | Bin 260 -> 283 bytes .../00019.png | Bin 351 -> 336 bytes .../00023.png | Bin 260 -> 283 bytes .../s-not-using-ledger-rnd-for-tx/00019.png | Bin 351 -> 336 bytes .../s-not-using-ledger-rnd-for-tx/00023.png | Bin 260 -> 283 bytes .../00015.png | Bin 407 -> 389 bytes .../00019.png | Bin 294 -> 319 bytes .../00015.png | Bin 407 -> 389 bytes .../00019.png | Bin 294 -> 319 bytes .../00015.png | Bin 407 -> 389 bytes .../00019.png | Bin 294 -> 319 bytes .../sp-not-using-ledger-rnd-for-tx/00015.png | Bin 407 -> 389 bytes .../sp-not-using-ledger-rnd-for-tx/00019.png | Bin 294 -> 319 bytes .../00005.png | Bin 20968 -> 20788 bytes .../00006.png | Bin 18607 -> 18860 bytes .../00005.png | Bin 20968 -> 20788 bytes .../00006.png | Bin 18607 -> 18860 bytes .../00005.png | Bin 20968 -> 20788 bytes .../00006.png | Bin 18607 -> 18860 bytes .../st-not-using-ledger-rnd-for-tx/00005.png | Bin 20968 -> 20788 bytes .../st-not-using-ledger-rnd-for-tx/00006.png | Bin 18607 -> 18860 bytes .../00015.png | Bin 404 -> 386 bytes .../00019.png | Bin 294 -> 319 bytes .../00015.png | Bin 404 -> 386 bytes .../00019.png | Bin 294 -> 319 bytes .../00015.png | Bin 404 -> 386 bytes .../00019.png | Bin 294 -> 319 bytes .../x-not-using-ledger-rnd-for-tx/00015.png | Bin 404 -> 386 bytes .../x-not-using-ledger-rnd-for-tx/00019.png | Bin 294 -> 319 bytes 32 files changed, 0 insertions(+), 0 deletions(-) diff --git a/tests_zemu/snapshots/s-1-tr-in-1-tr-out-1-spend-2-sh-out/00019.png b/tests_zemu/snapshots/s-1-tr-in-1-tr-out-1-spend-2-sh-out/00019.png index fd57bdaefa866f92bd9c80db744ea450b2c8af9a..efceca5bb06969583d6935c9fbfc5c258c7ed60e 100644 GIT binary patch delta 309 zcmV-50m}a00?-1GB!3r4L_t(|ob8vv4#OY_hOt@S|ABkh4olGvhHfor&Ho)1gH8|- zX`+(nMrkEio?9MYu8ZxLT2#I2GFJ~+`j6tYB}GS>TXRIy~KckVax_DgA{ z9P_X3uj-+?967DR?3mnVU4}ZUB@HTXE z&S!M^omlEi0GOEYH-O9@R8CbT-yVZYBoor|CH2$buyG(c3s z9K{?vxs6OY_R#*^miM1q5$%e@Oe3J_kG(PVz)lYrdWqPjjJM-%VhK{~yO_4QI8t@^;n|c;2!BWW72QHIK|A`+JV>b zOZ7O>rx{Mbc|DICHgS)?013&D((V^#{1lWhY%Z#W{;wZpC;$Ke0000000000z=$9E Wj|LWp+OH=70000^M1a*!H_(S;{{Jle!HEtsf?dboJ000000001>*$w_trm)n193ub#002ovPDHLk FV1l?;fS>>X delta 232 zcmV2ZsQ))D2wWVv z>VUzPQnWCerW99yWpnzx72eEHjd;9%?TP45ubD8#$Is~zw2dboH>*RI9;YGeneb+2 z7G~+Uf3aNFoYtv|vi53=NAFo{@hN2MkkhM~p9B0Thh0$2%H-F@3(|a1OQqIb#71g#rvl0S2Q07gT@2e>b$d$EwW? i+fV=i00000;NtEIzO+B00?<(a0000j6tYB}GS>TXRIy~KckVax_DgA{ z9P_X3uj-+?967DR?3mnVU4}ZUB@HTXE z&S!M^omlEi0GOEYH-O9@R8CbT-yVZYBoor|CH2$buyG(c3s z9K{?vxs6OY_R#*^miM1q5$%e@Oe3J_kG(PVz)lYrdWqPjjJM-%VhK{~yO_4QI8t@^;n|c;2!BWW72QHIK|A`+JV>b zOZ7O>rx{Mbc|DICHgS)?013&D((V^#{1lWhY%Z#W{;wZpC;$Ke0000000000z=$9E Wj|LWp+OH=70000^M1a*!H_(S;{{Jle!HEtsf?dboJ000000001>*$w_trm)n193ub#002ovPDHLk FV1l?;fS>>X delta 232 zcmV2ZsQ))D2wWVv z>VUzPQnWCerW99yWpnzx72eEHjd;9%?TP45ubD8#$Is~zw2dboH>*RI9;YGeneb+2 z7G~+Uf3aNFoYtv|vi53=NAFo{@hN2MkkhM~p9B0Thh0$2%H-F@3(|a1OQqIb#71g#rvl0S2Q07gT@2e>b$d$EwW? i+fV=i00000;NtEIzO+B00?<(a0000j6tYB}GS>TXRIy~KckVax_DgA{ z9P_X3uj-+?967DR?3mnVU4}ZUB@HTXE z&S!M^omlEi0GOEYH-O9@R8CbT-yVZYBoor|CH2$buyG(c3s z9K{?vxs6OY_R#*^miM1q5$%e@Oe3J_kG(PVz)lYrdWqPjjJM-%VhK{~yO_4QI8t@^;n|c;2!BWW72QHIK|A`+JV>b zOZ7O>rx{Mbc|DICHgS)?013&D((V^#{1lWhY%Z#W{;wZpC;$Ke0000000000z=$9E Wj|LWp+OH=70000^M1a*!H_(S;{{Jle!HEtsf?dboJ000000001>*$w_trm)n193ub#002ovPDHLk FV1l?;fS>>X delta 232 zcmV2ZsQ))D2wWVv z>VUzPQnWCerW99yWpnzx72eEHjd;9%?TP45ubD8#$Is~zw2dboH>*RI9;YGeneb+2 z7G~+Uf3aNFoYtv|vi53=NAFo{@hN2MkkhM~p9B0Thh0$2%H-F@3(|a1OQqIb#71g#rvl0S2Q07gT@2e>b$d$EwW? i+fV=i00000;NtEIzO+B00?<(a0000j6tYB}GS>TXRIy~KckVax_DgA{ z9P_X3uj-+?967DR?3mnVU4}ZUB@HTXE z&S!M^omlEi0GOEYH-O9@R8CbT-yVZYBoor|CH2$buyG(c3s z9K{?vxs6OY_R#*^miM1q5$%e@Oe3J_kG(PVz)lYrdWqPjjJM-%VhK{~yO_4QI8t@^;n|c;2!BWW72QHIK|A`+JV>b zOZ7O>rx{Mbc|DICHgS)?013&D((V^#{1lWhY%Z#W{;wZpC;$Ke0000000000z=$9E Wj|LWp+OH=70000^M1a*!H_(S;{{Jle!HEtsf?dboJ000000001>*$w_trm)n193ub#002ovPDHLk FV1l?;fS>>X delta 232 zcmV2ZsQ))D2wWVv z>VUzPQnWCerW99yWpnzx72eEHjd;9%?TP45ubD8#$Is~zw2dboH>*RI9;YGeneb+2 z7G~+Uf3aNFoYtv|vi53=NAFo{@hN2MkkhM~p9B0Thh0$2%H-F@3(|a1OQqIb#71g#rvl0S2Q07gT@2e>b$d$EwW? i+fV=i00000;NtEIzO+B00?<(a0000Ng<;xsC$s-0v6nuW62d)#$4me3$v_31 zQ6SVg0000$?xpO^dmpaN?1=WwEbb-luGo8CxHYnTY&9QQPuru;KU=Mx5X!hJ|8cuE zl*@9UOF&m1!4RP2!i}Y~_$ge?TijnQC~-g=feR5gvypc>FMssjw-eJH!&;$y$D7J5Pg?i+pgfCSt+`UQeLKyuoZTqgtQmiWj_JH?XaI_+}~B~T4A z(U&QNn&^v>gEKJ;or!h$OoSHz000000000000000002157nWQ;XF`>1O8@`>07*qo IM6N<$f>pGqd;kCd delta 380 zcmV-?0fYX91D6AkB!6B>L_t(|obA|Kj>8}fKv6oHop}FCVlVTNsf92vmBfMcp05a6 zNbTTILI3~&0NlMiCyO!awTN6XzKEo=q|+5=w~fajr{7!6uiH$=Po4j5wQ)3*X_x(Q zyI0%Ya^RPME*n7&P<9c<(pg*ztNC%BuNIUvppC$3#6@J}S%0>TF~)Xcy7zD{zZIa* zZ=+JH`65tDiD!Ku;kp8fuf8j6QG5!)l(Yj=p2?%UOQoNshi0_Fz+0AM|hJ%;V-w#2vEfRp1tO?H&l?i#tUUr$@IRLzWk z9q+?9AI@j`Gj$d^j{c1Or100001)~BYyz~Nkl3dY1B+E_dR+72Rte7MWg~O)XSpOra5?LU!x~*K+d`3 zcfLp|%~_srn}atO=^M~|&9~iu5d>~Q(|dkPRqmhkTBH_KG=EbZEAK_f7E}+;;(mky z0RE=|+tB8oa_!NHk&W%?(Z~<9ILz68wEv=xc2(p)LjDr2MSo#qp9QT6bT0J30-QKB z9VmPYicSG;ro*zW|Ja&-ZD1A?*fY`$aw1MM^0hw1579KETTQa;chg9(` z-@Q>v*;C#xhnd%d`YF!+(f#<=&)Rg8I%~-c1+) zfJyp43Qupv_FT~6XU_SpcN+cpe;a3xlwZQ_73e& z9Us>`hCUhp`lsLpJPcX-(+r}P{$y$p$to1dJ{(EB0000000000008iBz5%2V-gWfE Sm5KlW002ovP6b4+LSTZL)qR=( diff --git a/tests_zemu/snapshots/sp-builder-addr-diff-to-inittx-addr/00015.png b/tests_zemu/snapshots/sp-builder-addr-diff-to-inittx-addr/00015.png index 539fbc4f009401761e309a12fe940286e24b32ff..d6d3713257ec260e41471a4730ccb7800e305dbe 100644 GIT binary patch delta 362 zcmV-w0hRuj1BC;SB!5gvL_t(|obB0L4uc>Ng<;xsC$s-0v6nuW62d)#$4me3$v_31 zQ6SVg0000$?xpO^dmpaN?1=WwEbb-luGo8CxHYnTY&9QQPuru;KU=Mx5X!hJ|8cuE zl*@9UOF&m1!4RP2!i}Y~_$ge?TijnQC~-g=feR5gvypc>FMssjw-eJH!&;$y$D7J5Pg?i+pgfCSt+`UQeLKyuoZTqgtQmiWj_JH?XaI_+}~B~T4A z(U&QNn&^v>gEKJ;or!h$OoSHz000000000000000002157nWQ;XF`>1O8@`>07*qo IM6N<$f>pGqd;kCd delta 380 zcmV-?0fYX91D6AkB!6B>L_t(|obA|Kj>8}fKv6oHop}FCVlVTNsf92vmBfMcp05a6 zNbTTILI3~&0NlMiCyO!awTN6XzKEo=q|+5=w~fajr{7!6uiH$=Po4j5wQ)3*X_x(Q zyI0%Ya^RPME*n7&P<9c<(pg*ztNC%BuNIUvppC$3#6@J}S%0>TF~)Xcy7zD{zZIa* zZ=+JH`65tDiD!Ku;kp8fuf8j6QG5!)l(Yj=p2?%UOQoNshi0_Fz+0AM|hJ%;V-w#2vEfRp1tO?H&l?i#tUUr$@IRLzWk z9q+?9AI@j`Gj$d^j{c1Or100001)~BYyz~Nkl3dY1B+E_dR+72Rte7MWg~O)XSpOra5?LU!x~*K+d`3 zcfLp|%~_srn}atO=^M~|&9~iu5d>~Q(|dkPRqmhkTBH_KG=EbZEAK_f7E}+;;(mky z0RE=|+tB8oa_!NHk&W%?(Z~<9ILz68wEv=xc2(p)LjDr2MSo#qp9QT6bT0J30-QKB z9VmPYicSG;ro*zW|Ja&-ZD1A?*fY`$aw1MM^0hw1579KETTQa;chg9(` z-@Q>v*;C#xhnd%d`YF!+(f#<=&)Rg8I%~-c1+) zfJyp43Qupv_FT~6XU_SpcN+cpe;a3xlwZQ_73e& z9Us>`hCUhp`lsLpJPcX-(+r}P{$y$p$to1dJ{(EB0000000000008iBz5%2V-gWfE Sm5KlW002ovP6b4+LSTZL)qR=( diff --git a/tests_zemu/snapshots/sp-ext-more-sigs-than-needed-for-tx/00015.png b/tests_zemu/snapshots/sp-ext-more-sigs-than-needed-for-tx/00015.png index 539fbc4f009401761e309a12fe940286e24b32ff..d6d3713257ec260e41471a4730ccb7800e305dbe 100644 GIT binary patch delta 362 zcmV-w0hRuj1BC;SB!5gvL_t(|obB0L4uc>Ng<;xsC$s-0v6nuW62d)#$4me3$v_31 zQ6SVg0000$?xpO^dmpaN?1=WwEbb-luGo8CxHYnTY&9QQPuru;KU=Mx5X!hJ|8cuE zl*@9UOF&m1!4RP2!i}Y~_$ge?TijnQC~-g=feR5gvypc>FMssjw-eJH!&;$y$D7J5Pg?i+pgfCSt+`UQeLKyuoZTqgtQmiWj_JH?XaI_+}~B~T4A z(U&QNn&^v>gEKJ;or!h$OoSHz000000000000000002157nWQ;XF`>1O8@`>07*qo IM6N<$f>pGqd;kCd delta 380 zcmV-?0fYX91D6AkB!6B>L_t(|obA|Kj>8}fKv6oHop}FCVlVTNsf92vmBfMcp05a6 zNbTTILI3~&0NlMiCyO!awTN6XzKEo=q|+5=w~fajr{7!6uiH$=Po4j5wQ)3*X_x(Q zyI0%Ya^RPME*n7&P<9c<(pg*ztNC%BuNIUvppC$3#6@J}S%0>TF~)Xcy7zD{zZIa* zZ=+JH`65tDiD!Ku;kp8fuf8j6QG5!)l(Yj=p2?%UOQoNshi0_Fz+0AM|hJ%;V-w#2vEfRp1tO?H&l?i#tUUr$@IRLzWk z9q+?9AI@j`Gj$d^j{c1Or100001)~BYyz~Nkl3dY1B+E_dR+72Rte7MWg~O)XSpOra5?LU!x~*K+d`3 zcfLp|%~_srn}atO=^M~|&9~iu5d>~Q(|dkPRqmhkTBH_KG=EbZEAK_f7E}+;;(mky z0RE=|+tB8oa_!NHk&W%?(Z~<9ILz68wEv=xc2(p)LjDr2MSo#qp9QT6bT0J30-QKB z9VmPYicSG;ro*zW|Ja&-ZD1A?*fY`$aw1MM^0hw1579KETTQa;chg9(` z-@Q>v*;C#xhnd%d`YF!+(f#<=&)Rg8I%~-c1+) zfJyp43Qupv_FT~6XU_SpcN+cpe;a3xlwZQ_73e& z9Us>`hCUhp`lsLpJPcX-(+r}P{$y$p$to1dJ{(EB0000000000008iBz5%2V-gWfE Sm5KlW002ovP6b4+LSTZL)qR=( diff --git a/tests_zemu/snapshots/sp-not-using-ledger-rnd-for-tx/00015.png b/tests_zemu/snapshots/sp-not-using-ledger-rnd-for-tx/00015.png index 539fbc4f009401761e309a12fe940286e24b32ff..d6d3713257ec260e41471a4730ccb7800e305dbe 100644 GIT binary patch delta 362 zcmV-w0hRuj1BC;SB!5gvL_t(|obB0L4uc>Ng<;xsC$s-0v6nuW62d)#$4me3$v_31 zQ6SVg0000$?xpO^dmpaN?1=WwEbb-luGo8CxHYnTY&9QQPuru;KU=Mx5X!hJ|8cuE zl*@9UOF&m1!4RP2!i}Y~_$ge?TijnQC~-g=feR5gvypc>FMssjw-eJH!&;$y$D7J5Pg?i+pgfCSt+`UQeLKyuoZTqgtQmiWj_JH?XaI_+}~B~T4A z(U&QNn&^v>gEKJ;or!h$OoSHz000000000000000002157nWQ;XF`>1O8@`>07*qo IM6N<$f>pGqd;kCd delta 380 zcmV-?0fYX91D6AkB!6B>L_t(|obA|Kj>8}fKv6oHop}FCVlVTNsf92vmBfMcp05a6 zNbTTILI3~&0NlMiCyO!awTN6XzKEo=q|+5=w~fajr{7!6uiH$=Po4j5wQ)3*X_x(Q zyI0%Ya^RPME*n7&P<9c<(pg*ztNC%BuNIUvppC$3#6@J}S%0>TF~)Xcy7zD{zZIa* zZ=+JH`65tDiD!Ku;kp8fuf8j6QG5!)l(Yj=p2?%UOQoNshi0_Fz+0AM|hJ%;V-w#2vEfRp1tO?H&l?i#tUUr$@IRLzWk z9q+?9AI@j`Gj$d^j{c1Or100001)~BYyz~Nkl3dY1B+E_dR+72Rte7MWg~O)XSpOra5?LU!x~*K+d`3 zcfLp|%~_srn}atO=^M~|&9~iu5d>~Q(|dkPRqmhkTBH_KG=EbZEAK_f7E}+;;(mky z0RE=|+tB8oa_!NHk&W%?(Z~<9ILz68wEv=xc2(p)LjDr2MSo#qp9QT6bT0J30-QKB z9VmPYicSG;ro*zW|Ja&-ZD1A?*fY`$aw1MM^0hw1579KETTQa;chg9(` z-@Q>v*;C#xhnd%d`YF!+(f#<=&)Rg8I%~-c1+) zfJyp43Qupv_FT~6XU_SpcN+cpe;a3xlwZQ_73e& z9Us>`hCUhp`lsLpJPcX-(+r}P{$y$p$to1dJ{(EB0000000000008iBz5%2V-gWfE Sm5KlW002ovP6b4+LSTZL)qR=( diff --git a/tests_zemu/snapshots/st-1-tr-in-1-tr-out-1-spend-2-sh-out/00005.png b/tests_zemu/snapshots/st-1-tr-in-1-tr-out-1-spend-2-sh-out/00005.png index 175022eaa3513ceb448c548d472a8cce0eb93302..d86c37dd71d8fc66f50a22a8ba706da15e8d352a 100644 GIT binary patch delta 18559 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 N002ovPDHLkV1iEA_)7o) delta 18751 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 R;6DX`RFz&UR=qF{{y+Zv?8^WE diff --git a/tests_zemu/snapshots/st-builder-addr-diff-to-inittx-addr/00005.png b/tests_zemu/snapshots/st-builder-addr-diff-to-inittx-addr/00005.png index 175022eaa3513ceb448c548d472a8cce0eb93302..d86c37dd71d8fc66f50a22a8ba706da15e8d352a 100644 GIT binary patch delta 18559 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 N002ovPDHLkV1iEA_)7o) delta 18751 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 R;6DX`RFz&UR=qF{{y+Zv?8^WE diff --git a/tests_zemu/snapshots/st-ext-more-sigs-than-needed-for-tx/00005.png b/tests_zemu/snapshots/st-ext-more-sigs-than-needed-for-tx/00005.png index 175022eaa3513ceb448c548d472a8cce0eb93302..d86c37dd71d8fc66f50a22a8ba706da15e8d352a 100644 GIT binary patch delta 18559 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 N002ovPDHLkV1iEA_)7o) delta 18751 zcmXtgcQ{<%_w`7EAV@^75uHJzcOkkUdM^ngdhg{X1c@4LM2{Yw!KfjK-lBvsI-^7% zb&T@6`F!8^{xi=V=b3xXJ!P-G_FC%la5nRCKC_r;SE(w<>G@^uX6>ewww;}(1zyoE zCI3i%$7V%fbPM*C?Ja@Htz-zB3V}{&@{_aZ?{99-M72I}2#=ijyHC-p%HQqp)`TYo zrP!uz_}_s*Tt{yLz40KBA5=*Rs&A9t;d28Kc0^Ot)6+@&cOmE0+1y422EU+?A41t2 zM!&cqKVD?B8tGJogoI>!>Oy`*9^UH+HNk;UzViO>6ZYEtfA=hvnO+62IXSd1i6!qBhGrs^5c_z>_7c$%S%Sxm2zHvs`-oAY>ZDdhBi}-F)6}&jelu@Lb zxaK9n8`45h=SLA=V6V`R6tp#}}OGGpUoCL(?aSjU1Ppsv6T6nb#tV6y`+m2ub*Y6W8E4)9lC$R~mN{y7&1z%3J|Y6iNix5~#F{Km zuENbJyKMlU9z z^1Q{6w*|&R*sHevK*iMlAl(-tQ<7I>m$#L*6-v!vD64Fob1O<8dfuqedra^!pO*PU zzw%Ot&M!p7)ZOmoFE(mO#vwPQtg0SOW+ahe<2QNt`XcjWSiI+KRIEqc^{ntF(jidU z2*oU6#&Zb+DzY!HRw(P3%>-YNK*XSSlO{t|#=YDFn_Py@?z=FKCgGp%X5`^sFTYyivG|zV?Ia|Gme04^-(rr+JEq#JyomoA3%|2$ z1-50wpSP#TbEP zeoMQC0)tY%m9|d#JE?-gs>ajd=7;k?Cv3YD0A$*G9LP{&s3Hlm(91$Iu>V+t?2 ztnR?c&q>XB0(G)?)b$H?shOAQb>MsVJ_{BPJ%icyU^K@0(@e>}V!*Ne?4*Q!sDEd; zJpBHH>k}^cx)lDo>b2DKMC5m^R0A^O%0??I$h8;`AteL?B_hd%B;h zzI_ZC#SirMf%wrdJvQ=Ez`gpuU{4a{5lpTKZe#yFE+%kKPu#oG>TR;9@*1Jmovwen zw`O{OmtUKlO*OG-3%+qyp4B!obPFeV(NMpe!!NG%fJX<0(pu{4!pY|}S*1)J?DlKZ z%-)Fa?P8er>FKrVr;FzTOiw9gWo5n1>6my`69-WO)K{o2x-{KKOCjyZwhKk=RuR`% z?VZToqST!gU-umDWY+$x5K*NdDMlAh{!ve)#{OB0j`l}f*F)+jjGAJqKr@Z29~S5=y#UgJ{vqwWbJ8$qkfeD)3(Ok1dJs3)@H`8 zPN9uUyqi|j&6V5D>tSy`^)vmhpAZ!&e)i0K8vZpZuhERp+uV|ms?f?ZrRycGI+qNF z&GLY+0U4Y0yL|{wv+4Z9UBBj5Ou)}Eh7{{{UL)Z|*0J_9kDqq4RNlMC-ft-Hx=|%K z*?OC|vqs7h!glzw0L|i@n~))@)(4{88N_U+SstGNQSOn|LpPP>_#CU@rtrzvt48Bi z5K+fsSDQC!H|{pI@T~{ncjD9K3EkSIm%=W?f)Sp{7~`1VzV=H`$P>W zwjV%=U?_uFu8~HadgsR?wpIg4V+7>D)e+_eAjYkVM3~8x?+6kp_&>{@V8v!FK(!>f z{Z}X7-bxO!Mu^DWlU5C9ZbSCj!oYG1PCo{esv}a z3lG9UFmM(KuFM{u9IrOv;2YP5jMuUfQlG?PTFORU%}Gk;TpEzOJv8bQ$EVSknIlcO z%+colEb+ZzOqOR-OCDe2$h_1jJdPSVYOUNx?ix%B z*Z&oZbEZiGD47ha!EN|OaX{bp+4Fu8b%IE7dXh8jRY*IJ#rrt?r<7ke?$qUP=6Sa= z1pAGDZP|IW8Qxb|MI}vor^kJV)2zX&pSyC=+#;p0Lw3B*#YWE6)x&Mtyp?2dPI|Mg zk2mDHY*i>SxXFzCfv?s<(|3=eLVjc^i-s}!h)7`oD6>#a#)M>8DVi`CTyA+iP4O)0 z2_g$XrQ#&-RbUITXZZcZD32!20c@xEl-=E_)kCX(Q3*l`?t#%!(qR3$1~($us<=c zJVYpvcx(AS)K}rEwA>tFr1X5@=@u92xAwcRq}mHpo~V^@i+tHpnywWWpG4My)Tkvw zXZjtLM4KJGuL>mLf0Ww3Mf$ZbHl1!B8R&8RZRQ()Mc zGh2Fy7n;9FB_T2uTFz&Ly~^G$)2?`YC^L(=I@@1#X)vvRxkg>;OePq&x<+OFPHL25 zG(s#6#Vww;%mKY`zD7B{?Oi+5hqE)WrC=@+P+7Tsiv141n3bjT9N#GV#z}i)s9lx@ z;685G62U!8!?9fbExE_T&-Hv?gm-m%`A96%(uQb$|14v;hku`^+9CC2Nco(oz!aHB zBDy~}U!C*l3HOlzhlrq&+LL%5{HGCYE#}6sEmBU|c9I4>Wbj78&Cw!Xw!4kF|KBv+ z6=PLA{P}sAA3eCPf9H3=hvp5O; z{%><-Y3aO6!;DkVrM96w?Vk&_>kJKXnm=O7Bj-au>CynA5aCI!X{G~@rh^HZjmi0; z7nUY1PAmsZLi}7^{QB!vi!!#%f5L^y3@F6Ul(flv4?hh1fWKWAWI4`iNM62c>Z1<) zI=-em#cZ~dj@ga1W%o$ z;zsLMW8|@dO~Sn0+@bZ0`%Q28QU`4WGhk4+;~FM^`6+c%eV6q0Aeo#|JDO*jw`Ltm z>B$TbFKAjzVkG5&YFKl4{sX>o8IEH97G96=lARrub@Gode!UTEQJjUl|*H1WVo#};B^G|xT^>gNF*XKGDJbTt%QGnp43`cOpcB0vB*Q14tG{Z;q zqH)&NZwkIid;Xe-?O0JJW1VcKpL{+vPtOD zkyvGrQ{&Nkd*Z8U#jYsjDzv04Q{x*+)!=BRrJQGqlS=K zV*=bQj%29)J>G|S(`4Mw+t(icB$2z!XVms}n3kS*-Zd!ktV{Sfo>i059&a_=8h-t@ zj;OZHM#r91CRCUsxc4?m2<`^?M@GYuo4!w9?EpebSC;2pEsx-`bcRx39`x3bjqUDl{}IhPn6c>Do!)*+u!qC$o9``~+ST2oTfIK_`d}Y5x!!a??#dt1?2AwQ51=Ly(#!65+4hz^GCK%<3TepN@#bQ+QQOn2 z+>(HVn@aB&+|?!~*kMdLt12E*N8_V7sTjN?16bk0y>TJ$-V>_w{)R_R8xgj~Z_4Jb zLxp*Rac6jr32p?do_PV!7JUBdhn`r^stnd%^gGcZvqnIm7BW8}WWN8EMXPN9Zsw*j z6;z-e=PY5(9=td)`_v*~l_`}aZl3hxdH^7{M@teV=-RQp#V$23Sx_Zd{46GN`Wkx{ zACkj!uC z;j5ewD`LOc$vTwSeorL5J}KmL=IDl4Tt<;QKj~ePyOfZe9x#^^c?(8I!8=6ePvs#p z#J1ibYRR8EY7?xkh8!qfq?ZTtpHgKZMv^^LRt+3q)VD`9csfEL5V}pWTS@M>IDm7W z?7e@0myL8xFHVL&T&jIT+*GpPbOQFm+7~@OVV@r1D>-m9mq5GA4MO_eMDNzE=zK`T8OM`REj8jpTf#myC`Yw#}pIsls#ROva?CeaP z#M$D5)*hM8>c-7@)Gt=m=E@d}s)EgpS4(+{ISZaB)sygB2)=~T1J+7B!|Gi@G19sK%v+r|sjxF;8g2M7E zVJ#ov9N#iJ9>#qTn*BTILokm|c{#L6Hc;Vl67pW^rH*W=RV-hw6svcM(9K;CxL6i? zaDNCIyckU6*n}cm0DzVW$(9^xJn3Bld_&1e%20YB5l#_M7pxS{%rwuSj%;Z7@KD=+ z&abD*4<9)$Zg*J;%Bqr~SO!G&$Q3XA9~#5lf2T0te%;N-Y@Az;8&|@~*TSmW2L<7@ zGqQ4fld3SX(=dNAN#I1NrP7*c@Qqcmy;|P7U`%&?0cVsHFnWcJ5Yp}1O=47T=uss` zxzTOs2YM7cn`T1_~r5Y)!u&eTeCh;@KrKDp7x%vDF8Ev7hD6 zJYMp-=OKg(C}GZ2r&_V4rEc zS{5hD*WQnAax#}UCg};YY5Z_9L4lF$$$nOA;oLOuqEt~#k7h&Wei$wJJ_mOyrq9+a zp4hUXLs6GEU#Fb1LHUiq-0f<3GTt3lHTQ5G$1P~9Rqy)W4>urXTJ=bUr!-5yE--$ z&mEV^33uhsF|H~?m$p_-iYXU&om*fk0Ma&jhu^7#iY2NpvJ%$(_AjgH&6(5eu1as9 zuWbHa^xHo|l}f6AaH>O}G~o`uRaG4v^y8lqc}&zZ(4^#?5LGg5YFrxdZewyGhi!-l z^QD4a=YXFS zcs^L@EB%a#Uu7{;DoJ4qTGcpVSLU3@0XhDvz_BX-y7Klyf>2;3m1zk zJmy?>PR--Y+rLwx^VOE1r(>zmA==BKhF9`L+!1_q3vzdpbpFiYbLIB=_hS3fV>bq< zh5bftfmMGurRy^M(6V6Dj4yTdP-QQH)ieOR%-vbs8XHde{GjOWpg`^id;cS!7U7Gm z1Y1_Ro^L-%BX9dtyRSq7U9UWZIipsBWOSSK^@S0i;^af#&Rb4s4{A~sY)hQl(FeZs zTs*tf%;$vj2HP1_)E!}rw9e!-iyyXQw@*r2v#&x%E5DGK{!m&30rZ=e`M+GXfy?SD z6UjYX<3enXqW^%#v7Z!LDwWtHbc)l3Qjm%ju6a zKRt4Xk}kFPwhdQqlkeZmyNGUlINmTUHl%s!!k%H+Y|^B-G0ekTQ((nK#J^zK9>b%U z+>ZMDn8gDJApUM*(e>bJIxdiRj+Vjaj_lwEKI$_`zmA6$GyylB-L`@*$f-Z2*ft;~ zQ$w(dygo6mN@<~X{4aEdE%|m5qA*2c0*uQ?nAX$T!QnSYC;zVQu2=~keK|~;K-+n$ z-qo%Tc7L%QxVfGoRG3YXu^u9${hrru?|t`b7`S~v2xdGBBR(zlgg}|I!BRtj z!970jBOdyj+sH<3%|e@lYnc6die4EU+8YuQ)7lSR?u^TiDz0D2w?T#ueD9qQ(xU7Z z)^;~%mVMMFF(s%-GQ1gLgrM*bU{*+1kEUM|y|_cX7ir6Lf2;3dZ_Usb9om2tt1E%F zTW#D~v(9C-)NN{I&z$0y4!TUL5q$xG`Vkr2jU0o(yyE@BByS)HEb^3GU)QYv+hLaj zk5DsFd16_b12Fah_Jcm|)GO1{EjwlVbGt<>n@q7PN5&6GufnOQ~EJG?>%jRfAg%t1L_0 zi^$`7T0AZj%in}{biZihn6{G`-K&oy0m&c!Z-L>zLi@<5`H`1X3kpV>_b{mu))@oh zeGNw*k<_Qt9A_pMhv1q$UX>iZ;P1>-YZ2K7c~_<+X$A(Ge&ye{s~<`Ix@M=VxYT%L z1o3;H*5L~=mrq)j=LB#h<4%M5N5Ki(nLphlAX>QNupX!9j6^qes3!iZA@BL@b*~v1 z(DHd&Jlk!X=eh_@GYc@E)>fDmbn&U&c_V#;}s?GpzIs z2qhmoAWyMaWN@`hqn^I-Uuf05OKo(gEIwjcwBnox+X1J*5~ireBJ< zPVDRt-UHz2hkg+i|7tSz1*P6`AfqiSN%Bs!OUpc8JIy8bICpL%n)B7;-62xcWDvF=i-y|9C|?-%p)Lxxvxw2xGdL~Aa>r@Mh|rEtI)0vbI2Zp}S8)7}u#dxLj5p!BjA>>}kgbEYTU?JU zEE8bQPX((=8AV%InNiOxN2P~4a~r^ zuiVY{`uf?}IuJKvCi4$8wyX> zhAXE0>bUQ?dcaQCU(N}4Q$;@|Z^^jT!|E|vuh+D9#c^LU^l(2e;sJBZfsDS3+p$_d z@Ap)YaJ5M)V19g;jWeFmrpxJsDI@4P7f5mB+hi7O9;qf1`^CQu9^MReja zt^LljN4?uIz&6lW!uSLDB`rX63tm-W<}G`d*>rlTv1N4a>rln`WJ-ybc}k;`vbRIQ z`d>nUrsJ4UHfJI08@)G5{968!%J1p0TVbJWg6zna(3%^`91xOjSGr%Kl!E~AlYw0q zZ8*L2^LrmOsvFa1qY}3>hc4@k;1?1xYrU)5u)?SB1mH_b&A2mYakc6gYkx!&v+pWq zET9dH1A^k4*^!CF7VX>`jJ}%GTsTTCP99rZ;ImvEvoD*SnF!K8R{Usk8H8MivPC}~ zgoBi&t|RfViB9!e8Ds7-Zqd_M1TN;&8N(6RZ5CAl>x1yQ{j*l7KMCYj<&W(?c9>S}x-Wo54->E^ z#U^EkbA$0HJ! zP)}!Jo-hM>Lm2=?4yC#Pb@WtF_2QJ#$cEswl&yllz{Bihn5b)m>1r9*punhSi2}l_ zxzd^`$5+gtY(KC`=r^L-RKWOIS!v=(SX_w@hQS+vI`f7zm2yUDFT5Jqb+R@}9kgwk zSJGCnT*Pgd@k6a_Xg9N{tF=90aKY?X8%N$Y=?1>fyHrh=L&t4T`RKC1IKa`$wI)>aqj7jm~r$}Bo6 zvf+!$;~anw!Eo#sn@qQjrqEtzTNyFG%}v(mXRsM}s6LllOq9-+Qs{}`Ipox(kWmbt z00F3}ZI$==qb2@CuaD#ttA-3pU2QG498NyWH}=Wp$jXC-3lc*bLGe?{sO{Fa@Q5JY zIt%Hj$EVrFM&#>kgYBv0P~!*Ff7JO^$x5Ha*@}9&w-1Fu&2DOH?Q4QQo05WwFTrk7 z`ww^ema>ysw_5i}D;HLhmaX6+9>t0R;Ng0}F9=NvvpwamT;4Qs8jWcr_;&L%RizWR zhhqBJ%*Or0$qthTZQC!@eF$tjDr$H>mj4tPPVD*~C^+1hySht2l$Hq1G`tX#AX9k&AaNSGV3Xo2BS0mBC2Eo@sVBcfsFA(zsZb5 zt><+0wZAzVh2A>vEX}7 z16$)Zo5kJc%9|@}F9y&?Ean}`x!mn>u*U|G>_tp@XUV+hR4nEs3^B%DEi_)I1*Qu& zAVsRnSHA`3)1QSrcj5P!hsCYPRmP-m@v%lV)Q~+BA@e`8ufY?gbFZqwi$-1)qZ5NDnR*|O>ND)kX`Xf^I!HPM_pgoD@&d!!rOk=y<*ZG-e-~Rj%2U5$%dFxB%|6W z5=43;ietgY96!-B463TNP<0cIzUZ;@(wM@as@FsT&l#W#{TiB0)T(WTCT3KaA29wK+$yiT@BU zsjb(_SKG6I3!%{!7x83K>D#TXAst38ATHK~O^m|`2uMJ*HX%k&0@gqcPlYrF;a+~` z2Y06jm8%x+8`t}^WUcfE{Z~&Bc&BJuE&Ylyf>M_5jJ9lh7SXWyqOFg}Keix$F>He! z$edo^x}5Q5DAWr6tj%AtAGkpLTh?{rHKrJo$-Gb>?1-Y@++dhGh&U+u2&cIGN8x6! ziwZK|p1f!HeXKbY7ve`TN?u-ksI)Les5JD~LJ8+Ai8&KQ!=VDU^}zu!4y4OX>3bm&*W za84Q-7RV##-#3nxwL&6-q=ZqY!=oj^6fzr%;yyYPqxnIzHPWxDdno%o8yEKxDR<(W zeHQQd(?7SFRsQm1Z-V+?@p@0g-ZFGI$VVdk`gc>HWDxEAx2(pT%p1{-?{^#zfb-X= zcb`Q+AQA3{Cpo!EBrzK#85{`q{bCWOYR`JzD3 zB0+@>_>S)P4cqW-hryvu>fbD-8ROAE#P*EbZyL6ncYRvMv-hk)RE_rgnaBCfbzF$} zMzc80dcs70uW4_ymuA;-CRGn08N7AVi#0L=`BPIG#6!sK&fvHCgIY{xRW%=O^n}U^?h`!ZV$AXF=BLO5~ zmgcA)AH9SXqLmU^UtR5DuNed`Ny>wp@r@eQ{|FIpX{Hy=1%G`wv;`<5cXXz`onFm2 z*~?^Sya}S&%ifIiRchZTo>=U8Kogg3o0cugb`t~@leLH0qKiDZHDpv4&&q2N4?ly? zil)tyd##?-+<$Bh%2+Z7FO^pp@A{gjuvpVbq(rM#m2!*RH)>5zO!$?_ay9(mq?|-% zFw@Q~fA+t`KMFJ|)oXjKgatk`SdV>J z>|iBz|Fb-89$V!IZeqr2R5c^Yf2rXS-w!?iLLX zPa^j7vD}djJY4wizs}Kj``z*fXV(EN)2`*ttSu?2lo|UEK?eumt@AEX-4$l~JxnJU z`VeC^RGQED)oeMNQO`8ga@mUOWq6Aj-vIVWn+Km+;qdl%4z|ZPe1jcXS}3akt&T+f z8DQDvjZ;~e3IAYAGLg+4K&B_Q5eMAJ}kn73ZK%XR*0Z|BaIy#-NR}>pr5A9 z7M^!(mj1+yEq*-2c7&h0=>Fg#glQW$E;*&3Z#;^$$-{>oCk;|g-Une?(fa*HX7SGY z%7j0SIuc`<|A#@<`Dy$m^C{S+cTxbXW(Z4|B~_s)M^~Ra%~es5YDr-9-KlSOW{BC% z1y5sG!clsjrBZvQc4(nxO3KfKMoGST6PZ42qx1tFAA(q%xy6N>wHGWJx~9ebMv;v) zN&YW@!T9)^wt=2Ep67{5V4UDm_j#;gz!)D{9ydTWZcasD8k>2fRDh#Tjte-xcbDjV z)5_V7G{KI_n|ErDHd@u^euQc@|5UG?{h|eQ2*5~{McMZ_eFntatH6_{k$p72q8AkJ zi6s5G`I+0rZzem7_^)oSL<-FiiYFg%cOkK&e~~hV`jyYyAV`(J?q3;`_|qNweKe-) z#~zlOk38TVfvdt_^hp441;W#df7h&&h+dyZT5h6D1Jf1{|4mDT=j9(ev+7xee^qpp zN6Gd@Nc(oyKpv-2Z68nf>iZ$+p2hv%r*@zoV&eArDl{-315W(W;PEk$vA)??kbU)Y zsWHoGOdMmoNG)D#u3U|9E^pi`rapP6W@Re_HVwBX0UKi8E1Hd0);;K;#r#L{EE@p zzf8}sU%upBp3=k-`{F#9o3da4vqdBqrqrD)oD03J_cw;=skze^+XqNwf%BkOrozM5 z6h(@wdp+`HPA%?A@t1waYl>re8XW zMpDY{X|22S+OcgQA>5i!Bk-gEdQWKKZRf|5p^RNQ8#sa@6`{mKl^#2sk?;RY*acdE^=DVA!GD}uc2-vf}BosU-Esd&NLU6Lhja*Dlz zU&UZrqpeiU8-5$w!)K?W$CxflCe1UG3y${-%A+p=a5WcCp0F1Xzs?l;_!IuBm$Er( zUbAl=mU@96Y)f?hM0T}I{TWF7F5eV0MQvm}l4n-`JsJbman8Gm^Py3H!6#x7q%m%D z(Y8UTTK2PPke~lM!Tw_-c>KZDRmGPldTt&BE!x$80yfesg7CyC@t+iRS$=8Tw|9pP z^}94=oR)0ZO-|Q)n{!M9;sG!8^|{g&dHRl9h7=H-w#J2M3HqePR&C(B*_o@ZCKr@p(B#r-uJT*uc1N((+wS(Zn_~CCcNlsS{1WmP=|#527k=_Q*J@#QZkt#m z8{;>~3@0wI>tp-0?B9R(&5q~ng@Y1mpchZT;|P?_p0meUTY7B$GVKt2t(w@kYnB~< zs5b~!0>gYs@S83^PB9_5rm!SuZwdB&mW(XTZd%;h2n zz5bRBpxfZ(v()=Zhw>bbUHAdbM`IoyVe=j8>dQ^`dW&ahmCzKkHJo!H*!*J*!)H1| ztfdJda;ksmDx|>~imF`&)$wVhb=B-$z2n{PtvxSf-$dgyJw{rnnz zhxTgD8uF~JJe*DI%~Wp+>eEI~SgTlb$bk*HA}H^@J!5a;T#_au;w&Zj@G6@`Ya+-# zoldB^4vJ|*r*O7D^_J96b!&5Mq^LR@4ic5Yxw}h7n&}5)FK`LLAa2Umiz}%JWMi5}^Sc1AZ+c_{dJ~gS0pw zQ}hIa*Z0iHrBJYT3{l~JP6~Mj-4Wx~xVJ|!aL5Hl+c3ktqeT(fcVcllh$ux8%^AFI zWnx%u^GWb%2*sKVAt-H$f$ocy`d*OVj=HuD3-^8b@tViTgME)-YDyKyd#zWttk|;8 zGxQ|d#!=G%2RPS*Q9Ooc#NpS|Kw&H z94{*ScV=Adj{4&B-qy|p1^>HL@wIWG%y)habBD5huj%X5X%4)!JgpN5c;fzKN;v!~ z1dw9fsQPp$r&h`WUKKakySO3 zvqg?`;L8REte76Lti_35xDYp++FwMYTiS4OAxj$@cDx;l$nKx+<@hftSHu%Ns_sm! z{zZ0I`-t&vH9bDwwRKv^1rMlj;htSvJo9A=VqA!dfs}A0U9LOe%ds_75gjUTJ{>^C zrAlVHo|0t0wr3cp{uAZl{>Am@vfInc3bYhBT2Kh@(vf$MnoUe&qQe8S6#vg}kQq#p zO;Dk_gUt?l8BAZ#dGJR);egw1E&BOH`R#Z+UhKvgbWxefA9WT0PUoSjB&^r#4Q{Jgh% zA8+@n1FRDT$tbsPaD%!UJ5TU{^PUfBw(blh;=9$qIxNT$eij^ox>VM84bLuNetyO+^ z`Xih|>sQ#$;O&k@4x4vFJfnQ9rb=^n5zu&#GO7B-_{sbc$u)5#4AY$xZew;13ejT zVh3MaiXSMDEqUf+vN|}UzG;d6ZTbiuEG-RqF8UNgY4fUsJL++qwMS>-M7VV~Th!xp zqsd4Q5O^MzZ=XmMZ=gOETlxFosXCl2VrXVi4o)&$gm;L7L6^U)u-Zl2S@a(9WoOBmI@qKi0w7Pt%LS471irH-Q$2l(PwGg- zIB9fHWrHEIX1jVXJv>5H+< z=l~5@P0-f4bZTM2&4Y!<3mVZlemvQ0Q_rR%y%Q$89j^EG?GG(pWfJb|`0mB#PJUV$0qcIJvyKw1t!$uwphLM@@Fp8T$|0Y_I zEEpqjKxJf9{Z=vKkej#$3*3}+y(NdLMNxci(Y}asTr4NG?c&6bZv6E3*En0R4juQa zU`*~c3xugBF%(ebjm0ZXR@c|pMxLGxJ+9KEz0^s}>*0!}9hakJ&$mo3dO9L6aZi*E z!8z!IN27TVB*XJp>milR1Q+*~tM{$@e3rJxe2uim7c^sUpjZ3}ixSiXq`!|`o~&^^ zxQau0s@TsQDwx7-*G%NpJ;k2X`-48BnWfdFhVSsa3`&4mSrZJZ$@$g4sGtAcd*h{x zQAnU}lFZUn(;;u;BxH&Yg50uQmh(ls6kll-sIG7k6HW@)f6K-yUzl`mHmoXDE))@ zRX6B*gcwm8B^`=AOL}+fAuuIf3L4@3AH9Xysxxd02%=Jzt4gCp`3pVYvAeoKMO{v3 zly6X@Z8|9sAQTP-raBM_TbGg}FEHU_U>w%ajmkS{Y6$q?c%b6nqiNC`bSos=T&X{oEgE7rTBc-x41uyW$6OuUl+hh9fV~;0iroXjh!0p) zOpZ7tm(Q@mHTQx%86=`Kl*z9Fh2&yC{#g7NO17j1<(Z^^6Dm~cKp`IewU-1jp+Tb} z{yT6JC*}j(2pE^LMGg$@2-;J!u3rZ}6A=nhTJ(QY!AV#Wq0~Xxyb1XXg&LV1(evuY zt^4@^>&2I|n=Qrxlq(!?T@b|);MCh)OV(BA0K9UzKV1bFH zMYd)0N6u^2j=$LK8=njUGhb=P4RAPg^C}ZyBrvO*20=V1=&3L{-S;XjeSKTOw^IP^ zuZVvwpw2g(Q16MBPZHJ%arR;XOE#E7&Zvp4HBCz&JZaDWH8Q%qy;{J;Qop;k>hk}EnRL0$g#33qV$7lbpH(VFy>W{}0$ z`}QG|7U90OAEt%i7-Gn?22mbTjH4T#$2_JNrOz21`J+1R)bUtyw7r)2Yi&ULf+i}P zLqbM(p6K78WimAZ4n$MsbeX`xP*w-1j5d796BIP|UbefF(f~9t@y~loXaE1kV5TDg z&*OARkI15H998M}pjLXb5uImMbAFz88~B(aHP3>jjZVwnoA@_!EwN@Z&A0U9 zv}-;s-}`H2i#LBTy#i-lcoc@N3%3^34RHp%7`;89S_zKtz#`ATb=i+@5pJX_E^mvg z$d7Scc~f-RxjF7Xj|hu$j!f%ab@zD8f{s_ii7@qosDN;A>wSe&Zi&652hL_X)snM+$eo_USF|%F!8}000oCDL`{ylAyWoZQ*o*eHgoe~&A&|N8~6d2xS^%}Z#WfU8~g7<=V17sITfTbQ#M-)=QL zbUB!R`#>L7xWUIZu?d>-o;J7buZn3-Oxjf_O?%6Xh&|K^Y1sT{JS6KqOiHb8?W)y^ zBe@nRBl>4;#PxB6)Z#q%#i@NKe-8(^-2Y8;&RJRt;=(6J*&FWkvdppo4B`CWib)+r zfrpU#tqzk!gmX(J-95@)_v{U=zIb_%*r(@EMPHg$MIPp+7v=IRBM~5y=5)03e`KVd zSXAO99=zD#oWc5OJQEHL44BG8ID=~{krga{Vtg$Lkk2U;|yy%^k-#&FFO&X}Z^tJ%AG+|h16}-ryD&U+P zdne#YGnQ{MBVQd9%>%J)tA3nmeSd6D8uu0nM(yxD-&uYCvVAg(sGu*^`Uea8)E2!# zJ8(hVC?=>V0+1`Pmw2o8vi(yMNI?hu{14GM-TY_jEcq00EEX4?_c9MV7tSaWXB}Wf zBQ_|2(4Qym{sf{6J9tmyKU9dl27Of$D*W0qU`d@x#NeF$N5ygqn5fe-Y9_LR=LqP# zF2b`W(h7S`E*1s82t1ZC!mg;1STt34}2iK(}@Cy)v zY#x$ja<-*%;=T;$Q=?kiIU$Z0k)F1ljguTA~RTF zqSb_u&`YuNmr8g^3`Ek&uPZI8ri<*?YQqZOg`Wr{vNoCVfzFFGAy#RD3r|po9jG;V z@-akNt4OYrdeShl-BT;J2uVMtikrL%R$zA+#%Bn8wS_)j4_a#_89y-&;56qek^OTP zJR#%>C-iz`RQ2KFL63URX@1hN(tSX4=E0ShggGBov(PDD4+fu+-*>Hd7~U_z7!{&W z<>vm2ElAoKnV8i{9X4}etD5+-_)YrJ2Wxmth*yJ6v&5#c$PwQ@0V+*my+@r{W-{Y; zM*!OeIdd8$X}GZePefUNP?9DEVgBseT1%_oC}0fG+?^VHn;vmNzQr$Pj{+D)Ou{O+ zW3qG`Hnfk+gdG=AS^e-GHlm7a_WR|jat?)JIO5eakB-B0TIV9kgwhF)^G%hFY~~qF z1^3bHoa00OB#)1BaPa0WV-`jjSn8Ww?rV)}_~^103aSyzk7U7FE+7$@);sk;nm_R8b4Fc-EFyM8+Bd2s zFelWekJ7Z)I8=F~sH!k^K2g8VuE11()hMnNJcrRY1|DP>=Xq}lAS-#ZPVdP@)xF`? z!9S7d&$Bl`E@dAqVT@{$8pF5*SubB+sK@;C_@_Dz9?tye44|pYht!Lroi;(Mo`5nh zhp4Yd0!O{t#N_`4l?H10f4i8|>BNmnT59CaNfr?2g#00W+P@y1da2SWfBs#@KGYm& zU{U&K*@hbFq0%&!4@K^Ef7mW!4Zg~<#2m+K>AH?n;n9)1z)-Vmn zLrsQ8vOJTehx)uN65k4R315%C!=D?6wE5q0!X+O(Gqy&PUL(yoj{PMSI`st5B?JHj z0|W~I5DXBkFc{T00pL@?7*+t#Ml`R^1pu!H78U>?7$8^xfM9@NlMFc}lYjzO9Qa=p zMO9V3IvW50FwFm=D9ZEv)!6_5fML)j1d{zX$}& zO4oHHD@M{ZEz5G6Y&A_of2{qj?)$#$x+sd0B#GmA!N8x5ttj{d#%~Zjo3bo_fQj4f zHX2xZx7%%6%A|Cc%VqIwOAdzv<@0bjEF1WC&U6TCrJ{#xYq)~@8!{L6vEBRLf6Wldp@;uic!RPLal$+zlWm)D(c5(>- z1qhZEw_tG#kp<}JFUZjlW4-r``y+K!{NXhDyJqcm&@bvxZm$A zB5@q^U6gdlUXx8%mIix!BuPRgERBC74(WgQMas?i;y76{>u$H3d{X0w%BKW?5eSwQ zn_%5;Hx?Ip$<|-sbka1ng`5yq$rb-Dzv_$3654c=b9gu$sA0?B*%o6#m+9Q^cVqf` zW=^M*lF7s2z?F8w-RG2>K)Frl{#}UIw_|@0D3IrYuWa|6;JU48~<6tLwV4eX)Nv*zfnG7jYct zd7l2V*=%OoS>#^Zwr$fiZQHUckugP+s{VIhsoZ>$eVN2yxrT^VmDmO>6oHq#8 zf?#`@(eSwM^?H@oK39Kt8o7{cHk;jUcRU_#Y5K?Iey9?XOh2|bo(B7c%Vs%$50>Nc zxZCZ%zrUs5x$J|}@BVjRsoZSI^3XvPMfywym=4?;Y&iU|_*=@}1_YNX`%=|)Egh^V zn9+&BGwzR{Kap~yD2fh;gL}!YEwIhyLMaOAnI&xv-LXJVhXa4}FDwM?hb3LZ`HlGB zeUWlo$`8w@1b`6;mKBF!NqD!7{pr z)0SaM`HX6=kH^E&lQQ~tx$nM6xh>`C4#AoXx`b1Z11r*lhQ^8Y*~7!(aJ${yo<9C@ z(=@%^ZpJln%65N%aU3fahhxTSRA7d-veUCSbKr(DqnAdW=lA=aGdb$+E0r51Yg|hx z-ABP9e3fNso1O=Aa4f_h+;P-@5x?j506f;?;~qIGu#%HCHXiUPjj?xMqul(H1(U%n z;aWIa&ftEP{%ziKI&xI|nbz3W^Re(LjS17TKEcKo#XB50ntV3s5)dcGGuLib|ZEShj5B?%=S<8Uh_btIBOn23m-t3ndu3rCI}#;h!ULpwz!ac zL+nAg)psEF?KeRerxCyUdJ+fH9vp~xWTxgj|Eq_pSk>Op1%A+L)hmHOLIH}(P&U7o z4rGn&H3ZV`qc`o14Vgxoz9>GqxY~Jc*J#Y>8$E9|AiFF3lO-!xpQZ~7(n0PumL4%t zw*MXr;=$hZkP3DmQcjji6D?B(&aV8|Bm+1HW?_0q{}4;??#kUmfe|P~N=i_&jRXk} zu$xhVRTjKedU}hTi{N&?nOCJ}LCa#0wge+SO}4=x7c9u!^aaWXoL*Z>Gwyu|BrP!E zKq@Ffl2|#xgcu6MwW^Lst_rJaA@gmJRPu4~nU`h`eXECGB~d7WR*~p;Q|?OfiSU&C zt&OMHON)=2Oo=)Vyu|ZuRwO-)lHoJQK17UZ*q!{jHnv<}JNaL~rNZ4g^om^l!m5;k z_RhHIaTU{9hd?Al+hjY;XdG*2VXFFwB)E68@i5v|gEFBAn;by0YZhh3xDrF&3xmr! zK^UIBbQLE)Twv2+_+%XRTvZDJpO!i?qq*Cu^&NnCFk6t=A=&3Qxm3r+hrea6Z=4B7 zo4Z-w^Evday_ahvs+u5O_0s?|@r$2ugZ2I5XKzlyLm_n15S|g^P!7kH>ekyx?aD-K z2(wrBSuCJ}_OQ6KM?9;57)}0DF^lY53 zBhh5i!Lbq50D<)_?@ zrlM9kf#Z)1q?i+5?~1eggX^;w2>8sIZ@%%}t7dKi?~L&~g=?|-v*WN5lY-QcilUJWSH%SCTThpm#G0Y)uAn!3C@`Bd#OwS3y@{0`DUROm~kOV6y2V#BTxZc43Mu*7*DrcA#Hb|}t3#z(`rg#0pm&VY!%89-4pOz;L+xc7njFk!V@73t*p%L16DM@AHxVRGF zuSz8>*@@U%+c*y5OqR7Jk~caj-Yat?_ukGG0(oYj+7R)34o2i>8EPh+u4aCZpYY?+ z4ic`fLD{>=7@SqQ-#RUqz~{T2PAS+gkeC0O@LSb4UrKKLtfTOke+}mgBR6C}q=$@c z%T2jA(bvfm2LQo?y7)FWO4DZGwxdg^y-Nnje@}X&Ex*FkkyqnT1D!45*v!_u`>pU8A5z${nvTZzQ}}yL%5I68 zO6eo+Vb|Z3N)d!1*Eug5*CD6J!IV&e`xCpl26k?pjr`<-I!L(#G6ikzg7L6NrsaSo zvm9Y9)g-gGd?H*a=TuIT@zwR)l%eLlCAmfKS_a6?Jr<66nphJ9RG z&QlWb?a;bNvBv%>a4S=)F|`Oxx~%=|*^hM)L+YZa_+w;35wy^6Pt^gXc-CQzwks_f zlLF;XFG$#Y88$4T8(s;uY2R}b9o-*?#j)j1?2=cUUti~cY?xFl``mp2beRhxRak4zThZ;8F;>)c?(8aPx$s>B>>=i156oZ6%ebqN@Qt1+k4 zYjGuTcxMd9h|lukwY9bZ3Pw}(B}<$ zQ^^woxp#jf;i;G+(CH*WqGFgLJJrVU@F66CFA!J7Q0Xh{PX|gtamJYOtuDZ3_FpW0 z-sbO5Yx~W57YdL76M3Vl{r4lP+;=w@8d~#r2&CI-*ve~jc~ zS8XvpIh^4Qr5`=(x~@9ANF=`)8mg-%pF9M6@)xBinDoT~x)dUeru_WhF^txVocQ6KXxW1Wk?MJBNpy1I$Dlyh@`5o2b5^`Vq&hwUBckOTVe5qJ4_UQr zRtFQ|hnfMT3Hsg{JWd>Y4URN-7r3;1o-E{gCKg3S@F~8Y`-y+UrWBveIUK`u!L$3C>? zA6gd&_3_#y`^^x0Ah>z(b%@LgnLj+N-m=hRgWLdib|U_yGJsyEU|h+H@1K{rgrwxW z?_G#}Uz~xf-2S`LhbAT_=5=x&24zzb>i*!_e0BF@)Noe5h)_`9cF7Bc+6Fvvb-zRmUx(B&hM0>F@Z1c>iVa^QoY&ei5JeS;rCxq01 zbFS&(P@*fJO^K=McvmvBh}(J8EI$RL99w|^!T)fCH3SbYPkK4kNTA~m10Qxkv=O@eXXMw?9Wr5B95Ckew1SqmJi8(ggW=*mh3JM}Kj~Tpcv#jM_~D>wvY~baW|? zlVCwdspd)YeWK*-M(tOM2ZpPRF$%Xx>TpOygA$OjPJB&0@Umoc5QU;Lxw~Y-yq0?b zQ-xV0PoRZDarxisp1AR5E4(B2IXtN*W3E;ne>3x#LQ_Url~O(~pUa&$$zPLUfI>6( zBPC9LDTKKO>6ZB}BY5(u>iDk5Dt7{0Umwxb^E7&O-9>5KO=2O}asJ9*eLOMd59s=? zuK~5&(+_iI{}~b%&2j{e{o*2ZO{t5!UjUhvc@n7@GN7wB{zosKRbE4?1VS48$1Lo@ zlZE+%z`OCQ!kT!z!>&lihIz;DbGh3*#)_BINu^Gg*b3j(DZEl zDN)5(5D=})YmDewGAMjwT7&QoC?x<2gC^E%@O=XW9F5U`)sQNt6HE%l*m-BDbZXPx zsEtp!r%%W~dN9sKcFfs}2Zkl&fkXdElPA<~J4|*S@Ir?;VuFc7wtHwv z*>yLjHgUP4Fpjz%P?THyD2<@17X1s{C6mXO3_7=lJti;%LP_E1)oB101v6kJgrbMO zUD1cA!S&`YLlX*l$L~=bx~CIoAhcC{}P?sXJ5hZ4?c`o#mki<9Ol8`KSI{ zXEr7Dd^BsShOF;PtOGZ#MHr<<<|uzmMn1UbETE!HYIhD|s?NAs-0Qkb72FsSFW$zd zxW_yGm3t-!^ZES<`29%Wt^onoaq7m?IGhNd#E>lyx|{fHccT+8aqA}oLbQ-eDh~lW z(ua6Y<+4qv9*%`Hp6w&5R5I@6cwp@Qb{K}CP%Akd@)(|{45g^>KdeuZ`-=}ux%Y)Et}x$|bnu1CW6 zx}ApcEsGi%fRsL-^Q`EfM))z__SYFPoTb_$Fm7*~|7kI%1X$^_=l@VrpgL(+eBa1A z8b!X!$LO$7MWLesZlgpIhe0yFguanfd5vk-Ou{|3o9R9bb8#oMhsmubV&fWe1-?goQVBCNiTIpl z1{}@dpO_SCYf#414Utv-aYT2T3fzZCFELUnSYx?Yi~BuZHuxJp(WObJcs=LD3A*C{u!Af9})&L{s`+!Ho*$kGmf_SMN9)vXYzRr~U3gZa0zsupzUB;N6 zEw`1{?+$i#%YMA$u)_$Ah-|%e5u;FPpsa!Bm}B+zt06~+y-$Oc1H18A^5QB0G9NsJ z(w*!uwhyEQY=`gdOM}SCp>A=%uNc~YbnLTb$hE&gK*KX1MUOaRHiFUs{N@VFIO1$TY*ly+s|&v1o4%O79GkPUa_^4#*9cdQLv8mU+kI zel}AJ|2sq7YpXhus^lKsf6|s#r8CF&8={9b-e@PGy%F$LVF^Z(BM+L8va+(4eOdWw zjvV5!12vp|vqR_?p!#%u7<3;euwhJjg+MTm-v{*7oom=I;3{EFMBn@3kP95UyU}x}`{2H(N?NR30G@P)+$3)w>GK~T4orBExs)4?o0m2TSE_|#6GU0_qp z`)1?Cn_c_RsI`n!%7hq$(N8nh2<0%>{~B={G-%?dwzf)pwq1B{Uv`Owg|~fVafO1# zx!Jh;0I&tQ096~7$7Z)=24f7~RXV!f6%ev0h5HU(fut>DI_XlEKrnM%8J>9;=aB?sqR#00sq(D>vC^bViz8 zgrmmV#Y40Y_&ffo+Dmr)D+ghow&bLEtd1Jcz(Y-uz{(YFzJNzH-Wd{YFk90>ac$(& zYsc5<2J3r+`au(7C0T)i4o5-WE zgAZ_u*{HT4Htx`gU%nEVev3PF+uZG7Tb5CoW$IxoPs?!dnFg-bdOYI@fL^)64?)oYz}s6aG?XT4EYYw#n4*UzJg$(syInvTM{axJmoUKXpXgU1?E#WWa{#vW>67YUGofWp*s}s~+ zmCp%=lzIE*l`?z;2u^XM52RV219Jzn@yX=MsjTq4_%wY$quXxKiAHq^d0fL?->++d zmW#I3mj{hNoAT2H6wS7dsAyNYDG`t=L-p}fd2ljkMjl0$%TmlH#0GV@S_V%v`ZpUl zsg+fCuH+R)2uengeXcJm!Hqx%l*$~O(#XUueY~UozoC~+seErZn@Y7Ro(M>P=E2n7 zhneFi5d6xcgT8Ik0Bn;e!Gh*7a59JPefN_$NyL}Mn?XS~G!wDgbO=+9)=KZ_#l%kb=xUVdH2(oOpI95do4pH)}6y$VckgQ8*3 zS%8s=`=d(eI4`=fp8S+@{G~i}Zrevw@N?vR*59(JqSyd$E-$KBEOexR!f7alm!cv) zG{K=^Wk~eVAD=<^V{X8Ww0)(SP`0aU(bv-v0skvaZW{_ftqWH$qZhtW0{{?)K&Jy zcP>M%0HnIXtE`MKPj*j7Q|a&o6{*^!a)ZGntX!U*eY-D{OfrPKmZp($+t~%#+_}nW zaTN{KnHXRaXY{>u1&zaL<@*UeW}iLd9}^=$QJ#Z zuAst=m@3KU%q4tIiOpwf(~|<@Fn4`YUKvleQ3YhzrQZkoa)iphj%8OD@H|p{DpL0# z#yXP#VBIy3V`zZ?nL}6S@y)zf=6dvzYp?#vT=nflK-2yJtMHrdYVmhG6c_raswTb9hEwmprN;qBWoZg&@aLn?Rf9vADCQfcy=2~v)PD5$g6c3Q6 za>C`|Dlbe8`u<+Wh>a}t-MK!;PX<58CGsSh2G@Z&|4cky`RSGbUx7Z3jy~TSdvme! zUm?sGSZpb+9^;agV8XL6d0%wncx$(28ThK|q=9R90jNJ*|3^_-D^H-oQ}2f7^xA`B zlo_-<2V7U(XGh}0Nl}Xhw+)H_9fD^~=;a9V4~ximDgA=>VVG0jV+H}8C9U&5VGgPb7hi&( z964!^UkM9UsGb$>{Pw*Hlf1O}SuUYI&MMAhw{R89PdZ*8MLxjCHzW9x}*(Nn}WXB7OCC;5sHI(jjy?7DQaU6CqSG1J(&eUHh z`)IS}>T$khBL@4ddaBn_$Yh5YQ>iosqMcv#slel+7wJxc)+$pw+9%QK(IrGahjQQ|KWyw5oGH3s z0%v;v_#~AN33WjAGDJ2=-I{{n62Aoc1-7KzfcD?t-4Yc~cHRIY;^ucdNbo_vW8DRR z@6Ikm!u3N=U}}oG)rdP0lXKAfREU!jBi0w8k^b=RGKifFWI*gxilDiOxy4T1^i4qU z3Ex9TrY--PcaJR}*^@-@Je{}Yx+bFOyJ$@gQanjlWWrhh#k@gH#b<(XYk3&Lh_H%2 z!*N(T_6d9M;P|rKd2^;yz$C!>=S%dx)Mg@0QDwk>&sT)i{H_cE)y>lD5~Am+{0d%0 z19rwD1IdotINh(gz*P#De(vis@XQ)pW{zlF)b63rq^SRK#n~tA>r|}<_btu}vSQgs zmduy2{KJ@r(y4_~X*-9@qX(UD>Gw-{#IkLWV49-rFd5`ux|5}+q6*abCyunc|7GQ9_|GSN9zUZWQk}Fx^NL+Uz1!``x6$;JFh z^YVv8?dK7`{hGHR$f&Op3;jdIxuF83`!qpSL96jnPMxT!rwyoNjgVVvWcy+&Mq< zt#RnLqaClm&v)O$7)(+OasuPNmV?_DGlXWFG& zNdVkuP8n{C*;!|VuX8LkOGKNFy&XyHa*)C>8!PTSu~6 zFL(UkQis`w(%Bk6pxHS4(9@{ant3-(^8?6SexPv=%OhLCoXv3(e{h+$A!>TQ?GbfE z0E>R?r&Keo3nkE;C^w@4+0@m;@~7Iho_lGw*Exf{W&V{sD~KH&@`hxQ z#3?cHV8uE}98V=(T>0OepFaxi(_A=o?PJzlgqZq{Uf7I{w?MrC*<3&s5Mm#6Eo z?ThuUsCt*J5SDS+7P3%1+WYR{OzVfdS<%i$!lu_p;sr;Q3^-fJP1L=M#OOEU9m+q5 zi5z%CiSWIfO+KjIE5m9irYw5a3uTf7FNxcWuu3uHe0z0H6-Yj!$8K5Ws079wS+25a>hC^!b@qU}}BAvcFsLa}-sXVje zx#o{XC+8HCsXq?ECf>_M7Pz9{xQ?^r#U;7>;LxV7$h2ucr9wJG4^R{ z2fpxVbqgG{xDjSBWDGyWG6G#KvO)WI*1Fy4M|;-y1`c@6_c&Ka^4<%%c!RA(F}UxX zCLPKxJUiBy-&f25r=J7t;lNnN#!G!Z{Nn0KH5OdqrBA_sKnI|uGTPpFcznq>w%_;l zMY>plPsSSN462s9j2FhK-FZ8Yg^~})metY3l4O8k*_1c;Kp?rY%87ifoz}LND2C3x z*|-R`awNK_Z}wO(gY5oLd(d%>FyU-DZ<~FY^RVsz5?!XE^Gv;8LZLnPColGk2gM)T3;zA( z{=yT4H-n?%V_5ie^{NgSx4pD&aInv1oP#H`O`ES=26#7LG=kocU=p-~W@Akz7FDfO zqL@Ad*GlL!i$qstT#3A#rVO6`%5LY7K}M-e{m-~-Ii+?OT$V;@p~lg%R|t3!m9>pR zl5nkS30c&1ti0#;?(OPl2$`I(=|PhnUAi))mG`-8FBPX9%sE!IL=!b#8fzXp&{Z&B zGPmCWv%RDCgIEwq0za`FAY+V?R}hq!r~MzyJb zaK%`BcPc0f`}zmY%-CCysm0C2gmMkU?`nL zqK0Gb_E_&ur6l?&u^=RPiWzS#E;W3ToRdRJIE;*C?Ok_S7V-?&&>n}qQU5P_h6L8s z3Mg8CSD^sza3yf~C;jU(kE=W9&#e-%#hozX1x@Ms-*!X~FQ%rFm#?EA&+PhVfD#v< zX1O|y9i1HYWBaM81V10WK0b%07sc`e&)a?7AGek%Hk5tZnew&9_)5srp{a`**C!)I zav1ncPI}AeCgusPE7<@cGvo{ zA)nW>pOh4tT``^To|6ZNaj|R5|4?0HxZTiVTn55bp%O=!#tBx3l8!Pkasji1Lr zx_;KfnK$K9D7A3SyL6zhWuGYXQ;h@B;IznVc+G2+AL>4dkiGJ}jNz-wO7_ouH@^O; z{SUJKE}2B`A@@VQb~$VB+9O}JxoG^*qU9MD-S1Tkf@4ZZZ5)AF4@Xu_%1`a$!B*zl z+Hb1zQd5#X^|anH;}SIvDuW@C=|b<&Qn=Y#T=~1VaT`a&r!U4k7a2WP#>GQi?!+3s z=BlJmvvhu+G=Gmqz*9=G=m}KXil|~R8jkKz%Qw?5WcOlA~WE zOK9X+xi827i9FspEeoFL9yNSh~Nwg+^M3E~-LJXWYs*?mm~-h*GWRJZfaa_nqCFO3oU9SCVw8f9tsY6A zv9|anjp#XRjfN`!cr+?G9X(w7t}CcS?ihIuMpGoE*=0qAUt@Y!-9+p2KNn?6GMonuC41D!jNIIB&&ZUV~4oYfP@9hB$j-qO_Un0?wcZhn5BNqk@D z%#u-u^s=Zhwe#(R&6QW7eY}JSIaujqi7XGLc0xqql`H{3k|#cc9M&LbnIiw;_hnO zb+@G3jj~o;g5Q+4#TwAs8LAuc?=_|bH?;9VaUbWfi++)gQ;aARC_c1vI0@I4hVuoa z>MJ`_Em|14+sq<7&XkX(67`Y!eKls~Hy-!@9{U(Y9UMPA%=tWP{(PN`I9?M?ic9>^ zVR`wtwoKLhYN{VKdK~apsQ+K{&d)x1I$C4R$d%988-JqsZPmu4)JRI$K3G(@3}IgA zPcPe0enu8=DuQPl@xu>J%lyb3|LiRdMpuZln#2l;PNOPpv?8=WW`diw86Pa1voFzzogaxc50?XyoP2|1Wk7hJ2j78H=nuH_7rraHg>^jS)`kD14 z0=M-5aChEOMZh;o{yBoqY}C~?0Ruef~FP(OwN~{j6qh3(wTV ze=hdm;-b-pZav40=KAssb7>d2SL-7FvnPJcPao3NK1@rF+<(668Eo&llfovU zar`R3&aiFS63=-tbMMhBh`+Gp&*DImxLkvUcre)^^Xh!_u2$nRh4!#TI3v}$!V;53 zCyN=FbElosz|Of}Jh&=c;ZxX1`7tJ7Gn#bW4%Cb$$ndjLocU#TB*7iuTaRkVjY(jz z%FS~Uy!jsknCD`dg+Ar4yiG>eYgV1+^(a?D4eZn^yt2Mk8IWmfydOqaIn1`~yEB%OLu=>s4BvMZ z)83QuYG3))3{|mJahM&u_gT`2M^7duv1-(?1cllLF0PM#lui_RQi+&?9>{AY3LS6s7y-&ls22jinEx&+carZsx0ap@VLoAQOgQhJS^j9OhIx z+p7q5r!Z?>?dOXlIcdxWlu+~>=+eO>R$)#i=;0rJNGvGrYkHiMsfk-RqYjyp7Xy00YFZy>@dVOJ)bL?1bZ9?DsUozodzABetAF{_MxiQ zH8i6}2BAT;r<09B&F;S3vPD`ZnR;*B-Q^)ic!HvD_K=*7ZAUIW@L4}Ue6ood4-r$Y z~IT*M;+u(Kh)%&c8gOj~Rr$P{w zHRl*;;5cH;aDL&_?9xaD38HYpJacktxay72D#uth6-tX6rj85a&RH1+HpENq z$%38!|LK8wu}7g(+hqoh2Q5jOB|#)@?UI11o)|Rip$(Fomyn8ge%?OklXvnEbHF*D zwzg78PIi)|zGd{m9C3e7(X%e&Em@Z>tU0M-bZUim5InD2gu zn?$=|xz{s9VmG0X`CE6K2Qlw8C^du6xKl0kHyE_lYdcsRf|g@)c?Dc+BZAgr>BWJO z`Vi&*#3D_CwzLDWCRT0k|IUPGFHgzX;!U@r4KxIVaFT!DbwQt{ru(nep7_A^C(+hbL+O?rflCl0)xDqW2Ab{(J+P4x{7Dp- z)%sA9eAVOhtLB+y-^_6JH&+QZ<-kMLH!t`C*TZr^Rc5(BDm-Pl{Q*SL-etvl@dPA6 zDt~bIkNF-&N`g7n+DRSlUpvQRs`d$;XIi#SMfQ`PUs2p!lmtOO27ZeljK?Yjg~GF6 z(^k7GfQrg6F?yR*aP{PWl=9x%jZIkqa&;*9Q}{rM(&gsuUmzzx2wq z{gGR;k2F|tAYuOq6yHdtg0%+VnLa5%C>zhJkKi?~vAto3ES-SzIMrJ^R`KJ#275pM z&ho2NP?|YlW=S*-GkTJ2Mgz*Hesx0oe>mqd&4Ze}OGo0JTQxH97ABrKywcONI_f^Z zdI*XUh@I|0{Do5Q>42K`aYe~|8*WM~nh*V$PeNO%eqAD=F%POY`@*xNew>@VvCf_ z`}WtFAvK?czNq^4u@|9(W}sk1KwC0h4JIq8N^zWfB#w@V{P*8%Lh*Hw`BOVd9`^_g zP%u@rVD|sMXL4sWVrqdXSmxzQXWh<5!oTZK;NLcO`kf_{yP%FX;i={ zA@jk!g|?8qMsPz?|2X;%h6{d^0{!KbGjm_1co*2viJzorsW0ZtmrjOk6NhKp z@J?GBdrQzJkexPojdFO4zuCZ1TVC;ufAKHi{Z6Nf#;95 z7AkqH_T0PkC<5-AW_P1b%hLoX}bjhw7N-IvX|NJNZU9% zCk=Brf9wP1_dz}!s+TQhnUSYSZu11oRMxbe+~^~#((fAWmQJAHohRl@3eBqLoe?3? zooyQSS67EKB|$w(W@aW66BGE0=*`VH!#g+3EVwFqP8>eijzOLb z9tUT7Xo)nn0#MX>HSInRidT{OasD?}uK1T?_H24K$ZH1h-Lz0GL~c0=)N_Xiofv|8 z@;sJbl1VB{ix#uZ!EIPb3|$Xc&wxU)CIJ0CtIne7oBN>Z$%cZYZJ#;U)ZxVF_%GNE zar+@$4jMA0pA+Cw4CQ0V2z|5kdvx!}Wg;&XKIW zhDqlw1@&P44%*>Y4}k7Wccl`Ni~x6&l31`eEU^H7g*3clI>gQqt&H|g2CG~0z8lHX zKJhFR=j)w8XD%6*bLutCa45yYXXeIUjQ(vUR<|s?eL_dOrz!Q75Ca%VT4e&CUClMh zb3Hc(J{U`Kr%2z9gWi8z)x_CJ>FOO*d^`+(%=IauZ~wA&i1vSecF z3etW7um1zo_6huA&EStK(0LOb-Bt!Bzrdm>6P|tn)$xZbm|+3J&ecQ3_%;7lriav| z-#5-zLK}_CE<#(#8stE_=>@d#*E>G!pay=E7aDO)p1&tKR4nLS1c?KBz(p`f^8wv)*X1lv8JY=%*I$3og1V6qz!lyh{v*pjbS-US8?-wAKGbXLdxlfh zYha`R)2REx$riCt`iY#)U6<)ruq(dHOu1?H@FfBcl9#vPT}ZBi@`uuF&eP4X5XRoc z8497Fl)%Ry%9ox`HFMSlKe}pS^`3!+QP;#<#j>37cSl>z_j*$T7BsUrT$EPZZIBJ6 zm@w`y*zKa^bPAkIT(iSX^lU#&5U$&(ILyi%v;?H89lOL?7U zV_FLGFxmdXq{WX@_{cP=+v*$FA{`r$4Nh}~GUnQ;Zp7;xRe;%5zf?JK&W%X6x?z!H0$?M7A_RX z><`=dOsZeijj-aB#8E=Zr{#RU+=nFW;XQLghotNJc<|J|o3nzq;jeiTYHU9FQpO^xGFo1>8tem~cdaz;rrf;@G~ z{;gO&GJop=xDW$R4UCIKX79B@xRSZ2+tjg7Qrfsq`&z5O8g1WixwF@Z_0_{K`CD$H z_&K4VFy#SxT%k7$DEddAvGllHI*xRT5{haB{HE6zj9k^D{FH@AND)iJhsIiOu*mddMcRFY4$@RzDTsWU@Aoo3+}?r{mH9ZCozS`(bp% zbPyQxSNw2>t_p|0E&UMa)Z;EzB7O8)$m%bJn%(=(SWYWz_Wm&g<%xZZi}%#R^`KK4hFRrLEva{-yE(5O##bPKrO`RC@9v4^Rwb4XozM5 z(Pj)iW;D^!xO$*|p0f`7Y;lzAwEh)X1~Yhh0#n6^4_6M%p#MANz#zQ8vefQ`GsthN zVQ*)LM=2hK+B>-z9X+ECG_|4aiL;Ogt3BO~8hb(1_qS(qaoYy@!}(P_Ykwt76}#oK zaTNaPG$4!|=Y!VNF@53Yh5u9FPP*=1J!r4TAd1n{9DeEA&bwaKl^T#Nrq5H9kHi|C_gk!`W}t zNIGUPE$XgQk{&zJCBV-*!4eXzj~L7hr(=gNf$F0Ecr^c@$DwDJuY*3qZhm`VpfWN> z%T24JY|3sg^$dRa*H@y}fd`qr_A%GQI|D4ZAYAvAkjzx)x*qEfra|KORi<&Yv;Sp2 zv*fJH<|JGYMFWu708^W%Ag*B%$0l0Em7vcqK0!Dx+7sAEAH2Wc4)*EE5R5^g+@9*% zwi|}rvymAY*;@KmPWVExh3o#%l7j{%C`}r`;>Qch>t@yi;iGyZrHoH_Gu0m`X*&kraN1+LT?Np;IlOiPIYJSZ$!y(Z;8xLAxC*( z7gykI8N&snaWGYR&UncQlU3DZbV&KXpOuj=Up%9`QvYS)^$Nk;@twXIOr5+?|8^t` zPr#PK$5Dw;D?e|cUg==k`foXsC?a?D&5EILp56pSk-%Fp(*`PgyN zF90wPlyp7(*tOX>PcdWIO2g)%%t^11Y`fAzxHerzp|%Jl(R9o&#hC$2|0c$qa=e}1 zIAFT1z!e|Hn9&gG=>Bv3#1#uGUYZZj!x51wBEm4CtM)DXD%akD3R1#?(pe2R9s~~vT31BC!4P0LHN4^C>Wa4+y7sa**LolETPpi) z?z4dnoOb?ia*cOF%)aJ{0w1SQD92iZc-B?n>oW{TzrYy#w{NqdEgCJfO}zb@tnD)Z zGgf=0%*0mdPT}>aqTE@fx~q{JkL}H{{=J*)Yn?r_qrm)95K?kATS$z-27z@KuKpwc z)(GM__$K{&YE&(0ae!1gB8$!T+`t}NJY8)JmGZUJZvND~q8i%pAida`VJf=2X30%7 z&N$cREdqX>3{oV+{!}Sb#9)QZJU^jKQsFcC2-LqUr$i^gh3ho+em+Q0H8CCP^}}Yv zC%z4d?5XjrS%>}HPP_Br0F?mY$G;n^hoo_a4;n~h6bOqhBo6dZ`8L)+p?`RHWfwUY z2^Yfaq|5IFt-^I4Z}>6A;O*~5Y^yz^P6MTw`}_O->)Dv`g%X-jWhc!k^}oU%veTb1 zmRrEx{&knL>+5R_nxs|?{qFtwyu{zABUN6o^OQUx&mGOE7UAF z9mEl-Ara&iB%nEbs_d-n1?wFDGlV(gI3fH_EE4aG`xo}-Z_2x^uujO#hnM2Y!TwZ8S3=~cWvt_+B-OjQ_mT?u*gY&fbCnmJtXc?~rJZnz_z z`sCQum>_1~3HK6%3_J-M!4Pb)Azz ziULe`iG+q{#!U$VOdvRRPLkL7^NLvYzt6j1WDa)^)z^>=%3X)y3wAc#G_%cS`5{H0FlA%9L#=5K10*pB zff^FVq!SQKLi((%tarkQKxdDc1oR7ZN5P<=2YtkJ?j)d<{^!BHKX*=i znW_0eD`74nrq3%upyxBtnjBqFkmjDCzNR4P*)vZXa0xAl4eUouH%S7zn*qfqwIcw{ ze7GezJ-Sn#6w99~DY)XcCnpYB-*YoS4#N=--uvmx>jPssA$Tn*)i3-%iaLf};ediq zYHF~Apc?T`U;XOo-9G!Nz&4pPrk0VEFsabb3NKXa9(}?Cg>WAhNZ&7IU0%fnF}?DZ z2HVhqOnE&YGkvte0sS?tu9O7!@XXnB;fibs7Zd_pUWervfP#Yd0)tpZNI`caIAc^o zfk%U#N4fcF{_R)34~iw|_5ua*h8Y*Ar4el4f|^|Z=$ruC3wo+dN(TZ-;3eS5>?Rya zlOnF1coFGE41F$H7!k;Xh)@Ivx;C?GE~#(*IpVDjEYOXquWC1*iy!?2GO=hu`0aqR z)s(#Z&|7BHXH(u2nhcvg@g--;!0UcgU~9*p)BQ;Eoi4%dk$2R33YTgY#wY8t&rM!z z0|Z(Q`=-!kMh|bCml-iYCc%8#j7KnT38i>6h%9UE@`G463ece^?rBX41C3JWC8tl; z2-d&ZXwwItRs=@Zyl3ftL>5|Xa|>d6_Jd_gW&}0%CauUP>y12m2)Wax?lt)s^;pXibMTr(wZNN|cPzOO1>4@p{H`OQAa;eOR^XDR;RW z;+fi}Px~UgHG0f6L4zuK-MiUnT%>LJAl_|fYVqJy1Y*m_mEj){z^xjOIY0L|j(&-R zbw3h;fi%gWAZ;#Im%d5?3*;(@eq`uv zGUec0p7=tC9W!4S`(&YO!RYurwR;H&^Fs8ibSBWZ(9g2qu?`|pxxDwkBw{9?qp>pR zS{Ej#M#BjaiZM>sEtA#UXhZEg?@o>63V-mm<#CO2iEH3qH~HVXHgh@5Wi4?*f7C|# zma4|PLwRAf5aU$0pch6~75e*0-;ZTvF$sZpS8`}R0UOi>ql(8ai|b& z^HQBRvEg3+Kbj}!9FGSw@RYR3x@(vo#aD)M_5GPU_oq{OwI&g>4jfHe2SgGSl=`ha zL`P@LE2ZpUdU|@p)i&+B*<3J!kuo~|?BK;6$}9}sc6?y54PT31Vo0ILsEtjQ^*AmC z;wk#cvF;9WJkueVJYH`y!0`3Yu?}=$d>-G~o$!}F{Rll?CRY#$Z&hd!U0bpH&K>dH z#UX9eT`GK*I(SnQ`N^~7swR?+YI@tvT15`IpPHAOk^7YEePCiM2d5!oJK56l;WE=` zQ7Z?|8pn$XH?{mqSp3Id;VTWBAduDHH23@U&9;megB0D)Qkgw>P3Z|YrbW@Ud3^B* zSt13feBhUG9+R_4X?_PJObwDtuWkM2obN5wiw)Z7t!9)KgHYICDe}Uf;Z?id;)g*@ zppKA5Jz`s1)fuxzxHw}%BjG)S^4FxdI!bGTU4;#f4PfaC-mPrC$;g80$dnU}DXJzl zFi-u;rQ2r%ydhPrlGg?7=c+`^K&s!x6V?t`tnXcslh?XhU(aC9+BCh78)}~)3yiqU z(Wpj}h2G@LhHZe(jzVa_Pe>>C3+C(9^O;d(J7t?=P<27Sg|RRozhLQ z`6wmARP)aianz)pX3qHs#pfOLgYF?ic z+nE~u^RzKUS1ZdcG1)e923pAKmy@hqYc zi!&p^++|diuWT<~gfs{4bw&+lTA^atRy1w%w@~ z`Hp5WYFbEcp_$CrycYpk*0mvtC@6=niHV83=JeDy?HBKCg#O^mH&iws->L<}XFJI+ zTi*@gWIcnDl|E1+EcqoFo?P=?O76}#C$<`9I%a-_lX$xHv+psL-#09Y`75%UX!9n& z+c;%@E>oV`u;Uj0wZC8Y04)a4r}%)Aj7DnA?7UsxW|WTMLmc!m<+wy=0=T(@l{rAP+iZVJKu zL4*z1B0YmMd9l!)-HZ|&gv_7AKzk(kq*wAb4`t39sfarr?vg5K9@2ScxZeQ<)tFKw zJeE;GT>Zk<^dw2TlMlA!FevuM#uRYJnq1gbL{!mW`0f8 zu8MIT_=71<%|J}>iN9R3yck45yo^`%Nz6J1Q+zCH9m2Eeb2Idl1XPohKg2jt>o1pW zULY2eFCt9=0!b}dOgVQf_qi0T&aWRyWRIYhMrB4I6QAGXLZ28RH(WO(jn!v9JJTZw zAEzc^nvXr#s&+%oRx+OyV%8wO%FT047s2?w(HVy(KxmA>4Nw40?lr2}1SZ7dk6`MK znHLj%43HBdN8*?5;ssyI%3v}cc{Tp$C%(kw0ufzII@<&r0;?jB(3zzJFSjY2Lwld} zLO&$z1wn~hPb%j8V7bG;Ep|d=2!X-y&WcL{Ugvdj!m#n)k@wa0<@As>=v!5*n|;hy z0Jwe~i+w|u`~z;E#v^wwO4bc*-&=kJ+kSA_eqZ>L$wfPc)EP2C#5`DA;b^#1aS|XL z8r}T}EGoigo7Uhs-%$BUs5j(WTLWmz8#BcuS1l5gPoFQ#LYb?(@In>=nYg?*)}cKK zvOz`&(zNCOF>!8L?0F;ixd3r{b*`}E)3WGEOQA+1-sK(1E(dZsf{Mvwk21G#bad(+ zzWZd6#*IfakZW33R_!)8CTn~g8D58gz6G|vsY%>*!OBGbP8voY`^!zR`X@QQX+r&c z_TEgH3$y}lbyF$X>vg6hA1@{J`q38;|2)(q5wk#r3pynCDNYa~yN@_}-MN;@k1-zC z?M%a@3O{$<`tzXCj0dy=TH@F5a(~wNtSIAtvgShq#uYmy>qScgB#hy_PDX_kbQs{B zZYm1l47FGY3i7HCuKp8AE}|N5RIT^e=YTR431a%@r%R0SX*YVfX3|a&cACV8!_oOoYvhPFj`%{=Z32!N1Fq5bfnzaZE8 zvNF5o?$mUHfPes1jcppCC(mc*2-Z<`d(;eK^v8kAfYYKp^=#P=Ny<;(ynjTzl!?D` z$MrDbDfvr8Djx`R#L_uX>ma)DbA4vM0g8G@3+^7^>{YuGlmu?H+WMIY0`TRX}dRIp(gA{uT+Bz$FynB(JZT$jkBEtFdLy_iE#D`ancB~K& z$7te@u)hV-F6C|wSs>b8dB5oQJIv^9HL-%ac#)T;5SKuGb z=uuVqyN||2hOquVe!c&UjZ4+My{KXr<-&xODJJ#U`o3KYPHKERIsry6JS4$g>AP!O zv-R3)d*^S}ZY_AdF`_-rjQ&itL@a8(sWmoB`<)K$besreo5H&8r8wm2NL|xSE;)?NfKM=nnlbfFY=7Oh+mg+phihxZm2jzs z6pg}8u`=>3u`WzL2m$mHl&|r0e;%CiWNh%cJPW0EIpB8iP$eL5D*YOpLv0!Yr*baC zWc0^S^|3_(9xm@vm)O3108Q+kuLbJ_A@V-=U}>O>(Y)ACWCkL~a%&Q+$*a_s~xaR+5+c zGw1n&fw~sL{Q(@uvGbI1b8JGSvMeG>DY;t}6e!tJO{E>CPUflD_q@59+d!Xp`=y46 zf?|HLY#u_0!=k3}u4acV1GQ>RiLz}9y!c3%|J}4lY~P2?F8>6aZyKv?b%bLscNMq* zD97&DWOxIYZ21-b$WFZDr7$?Dq)b3gz(}-%s(ZDp?8oah*XGs$r++yV0KzO~3+j*y zsJf7}Ds8a4Y#Mh~_shBFOnTlk+xUm7RD}fch{Cjn1ENbZ1?RPce@I@%Oqvix1lAY% ztR+{76Bm&E!*qZvy0Ry6%C)cFaq{FdnFq9(+T848&Z{*2r}Yal-ML@t;I))NCMqhO zdEZO-Xha}&^}X>rypTXuW1-3sRj^H3RNyx1bu)?WRulidu!jq9an;C{D(TGER)YA5 zFYMv*9k#56`iLBgv^E7$pa81}^v*)`E1t|hUPzd^U52}*2Wu35qdI`j9^b5uZOTfU z(dy6;KvE~Bn2w&5lC>Goe1shLuNWVjT&X|ZkZLritXus=6fu78KgBGZzu=Ak&55&S z)y4ohy_?kY@fAbQ<3N}JTolY9loR+CDUlx=@sxG$DbWHit;2@v4!J;9L$wFaRD^6 zLPe5bCS!zf9vvE?_$0mN0+j{@0n7oaiuyFj%76!MAr7R(uZyW~3mpx+$qx)uF{vg| z?`V2?Mz*DZL~5e9WSJq%+||?GO&G`#;K^i_YX%os8F2{bZ~yr;y>y~@E#;SIL_4U! z{qE~PJuBEh_^@rnf3QhHFSr=}0C~;^1=AxQnICjjruZ++y+!Boz2NF@<6u~OI4`;ugKc&Puu-7{cd(*u8jo9830VCD01T3cKPc`+H_;}< z8kTO`6&u0o1T2SGzhq`zwU~ja07>wf=n>3d+)Ljb(&ut@b!9|{AU?p8 z&mO7y5Ii!X@%Zi!Y%5=c%t)Bo-TR4R5VvNd#N?;T@J93o)uSiNI2iL|7s2m5#4YBY zs)t888rxpbJ`7)3*}(s@TGrS*KGOf-iuLkoF2`PimQ(oQbNmCdBd~s8{n^F{25WFC zGJ>u7@+3qsz%Th4_eNv{;U;H8{-B@ph@XeG(E~b>4@P$t{Rq<7?zl0;K?)yUj5auy zNL*S@8glrPtrA2o55fb@W>-$B!BrCIV&FjEu^n(4RZmYNr02~zeYoU$f354fn|Y=c zYOfhxRNv}?pjbL#Fu@!HCdyYYB$oZ~^Jk>#meW!A=O*K7b8m#`h+A6G*Uxb^?5mH+ z0As!x#u`apJ~LC@eKWxFgte9L^2#<12~({;N+$5hn)Yb($at~MaTz57!OAom<>bP^ zkNIlcZ4L%1Q?3?y917N-Zp|lt$tskO$u9{+j>lu7W&>M&YURyx(PbhEJ!8{|Mc~%@yPfGd~&O%O>g&6Z_H)c!fMy73dHKJA2wz zl?$h;uuU6e>@dov>a{Q?rjkp!>@N?lN3j(e=8WmwL;Qa9NwCrU*z3}_O>s6n;?!Sm zzG44zY430&?TeZE@}BNR!##NKPJ&j}Jx?3+uzUJ7ic zeU@$&%7PcV^Z0g9MZv#*zPLCuoKixkwF&6AYU$`Gsd~$0%Y>q(2Ez0VkoAu0#L0vF z1;?&#hz+AxS#XmI@LU6wVsy~NsWFP&@M2S6C>upPiWbiI=eTmU`)^wBhY!Hd-Lap_ z6MnazB|~91Zwn$dO4F$ApL%*%64N12Oh$+81(Rh;qE8S`g~jkH|A_v&Pram}PEEBb z3s1znw>ylh8yxxf{f{0S7@94-eI^_mb&QCrQJ|KNZ^MtYhG@~i4Ahp*U>}WX!CKy^ zzicn=;i;x8QFDAUtsJH}G%omKlU9VPO3D{FiiQTxG8vuIB*e}a8UVpkM~7C4T@(#d zZH74^@A&3SrsE{XUmpFImJ~W_}G6r!=5|u=*&X;2~A2 zO#-B0OGMIokEKvpt{f}#hJx}R{lO9&7QNa8!I891v<_KJo5|f1;d=GQE zPaobE#fhoW6?awz>-pQ*O|-tOiyGI}yE?4|jBN@*xbeA1(&99wJAOsMVv(=EQh%r- zW|4_wZ>lH8vKsFyB5$<+ksiEiOS&`PjN;)Z$U2XAv1t~j192M|7%0a=SxOxTONC1= z4<&soPVp2lU)7yXsC{m^hf|1XGyaGVR`09}B9pLAloe>Wo^j>`e~Ox@Ombylrr=!Z>FMTbN&EX+>GL)2QzC< zGwo+`x%#*FSH%s#7~a*d0T?kmGqLmg4g+kqVPS3aV06hiU*qE4s~jRsH?B{jm`_)1 z;yUX$StIVi-mmue=Dlm{-6{A2HkR^x@`Dh6U*0#v@OaX{4-3hwX{nmfv5^~V;#c;D zjO(;l?E>uRzUR8|p>WnPdu&pj=@DhikV_oy%{^URdzclfS?wyKzi)rr{o?GupR234 zQorEbNi+zjftj9`Kesp6>Ml1xLh_IZDkpLOv)fCbmov@b%*xKY!mD+|=K8-72d+w< zKPe)!sdF-pXtUJo!mTc4-(|Kq&Lf9QR(A&op9=CrWi-Y0LNp#rwrm&_ zXGDq5aHC-0)i)PL2kxZjC_KXqQsBMJwYe-FRcFS)5!cSyHO&FAOBOS1jbH%fbv7Q*S`)>kPA-wt|^z`yNutWXc=k~z(1OS|)+Kmy_i4PZxXNG83jb6#Y zxm$$N!i*W61zTw04C-fzH?AVdw+a^l3}0!?E^&|h0WT?tovjUL{$~6jcyQtw%F5Iy zD0}wRuqo2qSgB#5$jPmBaEI`EW4gcQED6R?-F{Pr5AXf8J>~GWeoxces^VMmA3Y4f zu<~CA07>g8V}VlJhnFJq~fLHzHK|>0%K*cmx&R1Gw%Q6R1W<_(6wKMpK4&tR;Rzx zudSq7{Cz%As`EGNliJ#zrt7W=kT+4E{-GzC=Iv6i4o;4Fzp?mfApbHZHYM$PnDW=O zF>lMFf2H&wng=?9d86m#5QC`r>)w7RPY7DAwEp>P2%fDvkD6&XCOtkJIq=cpMU{5Ffxth?rf+I)BSf+Y6X`bWr$W;bHXl4VyDLW4Oimd`#4kyH_X7h#PD`N z1ro7ds|glxO}v6@K9$ceBIU&HR-mYj?l8dI-D0-I<+8av_Cc}5|do}rG zGY=x3i~73`KDEJnu|Pf{WytJ1B^7w`<@_V$CjAY{Yn$)Oy^2P~!DnaeW?2{ys8bvC z!_?f_hG1yD*b-FFQxT{Lq2rC$g{jviB7{FwJpTSu3=crU^9IDYyQBF!Gd9@NNzjgrb?-;JX20!;M90 zTbIV?k8=W}tJ0~t5Pb{5Vl~RAJM|?V0~>KNBS~I7k;#oO`+2)^cj~HM(kgZK*>C#j z7+X-<*ci@w>A33D=-y{bw0GlpKsCk#2fsD16*=3NMQCV(nEm~SYw`kt*;wwi4*{Csz& z)bHfNsgjcc`chx!CwD?(;ens+VG3+^%4xiRh2zrJ>Ss!@@N!*PnX6r zg*QB%O0)6^^G=^)Q&p1}+x)i_hXP$4dYeDy-EG4Ev3fxDYWymAqpObx11}A{_G+`@ zC(+gm?pXQXwAFqm@1k&$tB_C;*2RFcysY-%*2(oZatCogook#s?3CHN_hjTTCdXrMy3O~xacaB$ zJddW}HPZQqD2gwl7F<|`EVQb8In&{;Sgm=V`<`3rKq`TKZ0P35{A>FZjDdds_N!sV z&L^QERp03bN9eTU{A2dRj^rFn$BE z0^7NU{cL$e$zEE~<8-fi#hE&H?`Xt0w;1G2m}WaBmE4IMykrD~-P@^$H=(YGKnQ*IYbr6|lT%cvp(ZBkjkOwC8cc>0Kz}YD8YBEK4k; zFZ4_r0~U;E))vSP9e5m;ll)0G#jr(hn8M@msWVa|GH9?Nd(gr>+x9Lx{+L=t zdWQO7X`qPcGI6+y(dC)KJYrxTKeE_y_pzw~Qj3LQv-kY9dzi)dLXQv0tvHyN3yTS3f?H3YWuSLCV5-f?cnXqJtch1hI5u-{e)^Zwb zCis)I92yncYz;4GirvqaLwlC~fvEj_(uAZe`8epT~co9pJwcEV7PpWC3`ZO3AY3X^$@UZ!?(l;T<9uiqw>{(Hj2<EqUTe{e z1Gz|XwCTB`1Laa{vL@rwo5nQ&%s4)qjf-32|3`QsY(tfjQ7~oM+ps?^Pi!=RLpSC* z_m_*Lwmo~!q4x8z|M5r;<*sp?er0~QMi1-su16|~TTaOMc)-v7slglqw zrq+jEx-&#b>z-h&Rj023Q>fz%ooR!f$f=g&6r9YDSQgmAyJSm7iWHshr+pb8o~B}_d31az$#=Yv>jEI3Dy*JA)*=(A_8#~lM!$l z>aQLAtToI}3k-kkTLnhz_A!Y0fdULT=sw4ys)p`|FcB{9y;Oe+nC`orLS~({h2hGV zBIXKoi=|!#fHU!1^50Id_+o_WzvoBD-%)#Xn(>dp2=m6gx z0OmfS!Hz9CVIB}8-5*59WDDqD`BJSVlOoTJ`oU<2-}-ONRaQFT%iQ|q)}Ac>hhJpb z!$N$rs+S6E=>HtGf9cFVSb}+M0A!*xN#|h&F;Mb&ct6msm|jN|qHto#)HgCRvZ4Ij zUFxV@wj5EGmjY}pu*2w~h_+vg;cb*_5XLbJli2tle;asvbtST}eDs>4B^z_%3()yp zP~!-qdP(0)-EyJRQKn zdSqXfJzpGpcCew@Nj0R+uWGItaF{bPh=UkPY1ELbJN!U^Hlo%&$XacqDr^kje5tZz zRA||bu4Hg~Dfvw>WuEka``72uL79;}r;64|4Km^Y!hnCoT6eYN7o)d%g?tfsi!@Hl ztezB!cRzFj^i%Cu)(7KMu|LGo&H>sxba^4oJfkxqH^#%e_kilhFRBg6YoV7SJe)Pc_rK6pq<>#y#mj0$H=R%Vcv0+{RR#(wzLrF+db~;5 zR4QygNJ@&z`!bi{#3zVY-k1u4oZ8tpPkIEj8COr2!{03y5&BN~uu@Qg({r1Cc-<=m zxR-|gop(>poy4^Iu|}y$0m~2MNFC=H)4sUn3^?Szy?lG01wNCA`q-3a34`12+aBgCUT&WpB}$`&J(Kv1G%(NEJ^? zDsq>LKJN*6XS;klF7*xxLlHXgfpMze$qXO3mRpGCcOfI6HR-%YT~7OG0Eq%Ri6ZMV zoDk;F%f_KK8;dyPcjR}M6RxSS^Y67h4|dDJ-JmzqsZor6yj%TelD81fF7Tz4SVqr> zN1ad4YEX;YTRfro4-}p>WBK-*>pf>3s3+d_ZmYa95fV5?Tg^8#1Ppa57xjbuTCS*m zntM2P^k!55aA6k3I zPDnJeQM`~(#e(l#?Y zovU!yly9DoLY}D+-njv08B?nqb{&U?xkBdt-yW`*UofV;n&^Sq&sKRW7nKP-j%FiA zBqs6)BpZfBy@Qo|;8ugwnvbfn|0HL+j&|VHv|jZ%1f4JW6|+{tSuCNgrtTBWGh$=O zf|$k+rds-^m(YtSL5mjA|9eXDrrQqpl`!txv?GSx{w>*W&w<;;o}bv1gtj+3E34qj z@{pssB%vE2x;3jTDQeX-PeE*Ia^QCzQx_OXyHUJV`%!D}$gl4>zw;^(8Gfuw8Him!Y8YUKULJYT5mvO zDSSe7*sD3fvA=|EgTu#MlObD*^)s{3VxJ2Q4;oq2W~D2%Quy;BH~L9YcaVEZHk>?h z{-L#jXUk%N_&J61oM1W^vG_~C@BF%>H#V*FcJx05!oql--wt)2N@4&6&^|rsoNz#a z)e9eskC;KDeG$p?5QYtthgcamjl>B@wFSm^^nZ8FKJFX0iIB3&9EhD;vFP5tDlbXz zo}<~?c@;)=PnM->m?ePWiza_PrIz^{$lc1t+OXb^Ula0V6iSqOjIkYPp+33%E40#% zVWsD%j9q{Izf={K3NDLf49b#Wy@qo|#(Z8SMm+)B$>oSlyc3#=pY?Vd?nxSIi!XjT zR1&uqZgT~7bcgAc|J6iS5;%DY&LnDOZPe;i8nbxF0lLGfso%8K!2`x1@w&t{aC<*$ zXS_jZ|2S#qJzt#&B+0Sc^mdqIGjqYL~S5*PuNPeYjY47xDhnmDmC(QRoU%XTceC_h93po?Brm zk!no_o@jR)R3OqvKF#d$yky}p`@;ka6Y8@+(TRQ|m;`a9evKtkm5D^<6te4{30OTM z*|0I{nE!s2Zh9iDSgIo&ijQ{ut0tu$vUx8ViTJ%KO#hq_(Xm`u)MS(yXUvBNs{N54 zo}8WFlp6-`j0ha1h-e#zlsqkmP$VyIn=8)XvcLpYfvfC#TSiGxXG9=P#fMI0CBanKP0PW_Y zId?A93KZ^t9;b(nqM3|5`~aMyObFmziyBxDrux1H*f*cOBb^d-&s^?NhEAvZhKD_l$#0r<{D~W>;MEphKDD

GI6`cQsc#Jx*c0)Jpk8;CxZLe4J;y}y5#+g($SN|z3 zK*oIjrgIV(_X0686z*E=;kfU>Zg$f|B3x3Y}v_n-cW3uj?#y;XAV9a1OojPZD4}u*TUa4cpMH{%J>J&SCwvf;t-NB#HIyWcYF3r!ajKPH=bD(t}h0ap6+j*bpDq3rql{R}Ein(|SlzsUAy{ zN%A|#@4qL7Al}L@zMkOvWt)odYfUeGd#BEnV1zvQltCyHl*3tIfVaOw3wd!K<74dK zFA;;dy`hB{KIdj9BcQq-re$e#VJa2uWZtRxJ|R+Xl++krRy;2PX%L-j&B~!L(uIG;)jbNvzlg}Ef>3KS7_;(jgeTegCh z3_n-k++}5`MR;OWk*ydp(i%S6&SBVjq zqqd?S@77dmJ_ic5!*^-=g{KRw;rOhwtT#J>B(^(Qm#5Oer<(qJXMF%OX-( zLhHLd=;F@2gC_wKc1;+x~6!KxnYVoe*ad zQCg<hcMnfIAvP;ZtC{RC6ui=w5lr6xmgImQ{FptNA%BENr# z5PkcuXdzJ>gbZ0;Ugvn z+is@Z(hC3{ATee%PxW_UVN2~T%q=Ke0j_c|?E&G{{!IO+1`zMh#+Rkb6ul39T_XmO z6!fa9NMqjKI~bx!zI+Qfn(S8}_H7V(J3ho<4W`Ak2cb!`V6;C)73i6HGPUw$J5bw> z7u7XDZYEe?H7_5a>Kn?+ifqRr4hh{GZ|t1X9i}LA$^^D)NP>M01D5@a$G?b*N91WT zT58G!nBxZh=jI9d)4iu1GrtNe8vSkTk9xzTgX&*xq3??$Q#}2&KeezzcYsJpkN!q! zVe(H}5age)4#>Q|ktG~S8zZiSE4((-w*a^7-cJhxIpdNdn|PG_WkvuBKIrLtg2++m z4naLG=&UBvlvWAH5f_ASeZO;V;1QW>yrn^d?`+w1Iw&Z+Pny6!3j;{_85KuiyXXg@ z`^)&CE7K*bDZmysTp2>yA#dKv4%Rv_DPN531A@GfO-I>^`F+I8$WY*AT%CE#psM_2 zSWYh&SO0x$b-&Xtt;m*fyH5o2agD6|QH%u=X7nMRtF+ASpW>#aN-)BF0+^X~Y>?4h^L_XI>x2sml<`XyP4ScEGG3Qhf{Sl(=EDE)pBZB2DwdO2lic+O^3G*!^!t;0bz! z+MDfl2|xoXrfc|btKLguVIFeX{co?`rN+pvWkx0w2Cx~zPyQQawiQwX==+VUzba_X zXcyX|zTT@xP=gNZ&RI)#FZM~DEp^oxX?Ff?eBF>q*rHl)lphrM6p+y-xX73xY7SC= z|Ca(+q4*;>CM%7yT#M(-wmo4hTP}9G|WNRi)(NFt2+~ksT>Ji1E%$Fx~KZ zc)@Aa86jQ>ssL1OiqN-#P=HF-+jVyamLLb203wW28i62UDG|3u4bW@3Fm1KRqLF-MZd7~8aC)pDJ+|4jilWeo$uKmzMPb}v{ z&(^m4UNF^TAy-+6!OQ)|!AV8ir$>@@80An}Ew#=A{Pb)b(AZt=n!lGN|2@dr9l=+K zSn;aWql}EDXiox8R{lxFCvB2IO23nu9=kZI^xlIY;BEL*ckmXjcu_Tl!J3U6o6nd> zfrEBhJ1wBOdI6YJ2_S3TT3T%g{@d5=^Z%_tWu{WnfBNIFbz`OFzjtcX)hdeNEu;a3 z9~O&#dj8&3oS}LYg`kd`Ysf6(Zvtk=RAfyZT4<95DSCIVU7lcNFyq~V_VHZmIy;wH zJn#vT{Y$x=kuSh=BvY}f{2;293<&||O(+tO_lz5p!Bj_SOv)%_VaSBch@+=d)VhsD*7^!I)+NwV|6U=@mAB{p ze`P&_*Y==<_cHcCGtd?AD~h-}SiEA_Kw`Mnx%wcS=I;pYNJi6-X|v~_3l9T z4p4R9mq*vuf`vp~wiAftxDl9hfNhmh`S^ocN9QMHy5JShw~EzFKhMJAGfq}e8qbknOwrbzCS@XVz40GR+XNxGLE{)`O#u~DS-l2lS3mLF7CZuk!gwu=HUU%<*p8<$dey7yRija@n1s z)A3=@=`qDsyS&5--xgZ6#7Ss?3=4Gn=<5f~oUjwIT5!wq0Wk185iVKnIX9qOrmP|I zN9ATHtLb?Wf?h;-ts^pyQK*q2BY{L^cm(tG#7o7R`9++_ryE)~jbZ#hNUHiobw|12h35K`mYMS-E`NETcT8R>#~&j85M3LEAQXjvrw;9Xaxu0Lzr9@sOSR@( zrjB?@KA041{%TVEPVmWVq8K#!G5A2K~6E&4pKc8uXDhJrp^^6s6KmuU{N}=Q^W~JhBxNa9+IScfQ5;I8cUF~kO zavdOvyuXBIlgEVB*0tf60|?f>FSd-e-$@=k4q{)OFDct`mm>eK&yadU!2lWC zXOV@O*yf620Yn+PDvEi?kN-92IY}bdtv>)4E{B?+q%98CEfJ%nMQp`q z5&C)oRry$nw?_1yWa%9)^A~?Vi|r$}GhUW1@GZ+HRwBZW-}BHl2O!~Paa2hdNe!CR z>D8uBvS%f`jP^_iFeYU!w1@EFeiOV{RE1?{GpfDYmK;tGAcG-G17G#<3m;{!K*4`6 zA5DETNMA4{rx>OzrvK6*mZvQ&+cs@ZUBG<@^oR=|q=*Ob^LNSbR!GchT3&w3jj-2sG9C`7RK={QwWg zi}0mfm!RlA{H-4}G>DA~_T#+u^TKZz{zn?uUCI9Qmvvybzd$iN<8?8Y>HyGCHYXdg zqK~S&yt;Z7Ur<&C6zP6%UA<(}fA`&m%Rnn0;{%K=R z1LToQ1YFHKt*FpxGr4yHd%n<6X%i7o86UXev(!-eBoWZc1FF+Abzy3A8y-HiYbt*F z=!akFxhoNQkGyv?5O~jUgA02B;o-+aGLfkJXAYlgmkdz>U-)adySioZ%faePE_a8^ z%f@?+N(s~%I0}fLD-?ey?t1cv?Ysyq@u5*kiw`^daJ)=G_ZPS}dAaG^rWPlYJ(4#r74kd5DKt2tm9|_&Ml0PF#MfDHDYY&U= ztXHv486plg(+>9}AnSgn?r}r-MMq~5-pHl;-Q^04(LllqAlh#lDFcfApL!c23sr*a zZh_Yc`&cpooz}X}kNb2C%icuo=uX}o)ZM)~IVoJ|{)GpD0_`tazWx3MwrOa@hBk8J zI`BR-2YS?NK>UFdyFSi)(@F*P$v=%Vgx*q_1v*cG-WAkQubsVthoF?fx&)j#a=&xi zouf@<;wu<^#R|{^Cwta$KKqZzpwr~tY;VJ*-h3^wW4(BNZneIDdj9na#HK%=lS}e* z4874+tZrM&uS&((;cz^)RB3}??|!7>1Skpb^+R$m+1z_-PzQL~g?4G7p@UsZ<8ps8 zkB3$&KRv(~WRozqdTPFOdgOh$)L!yi#I5uE^7Mb5t7GT32f9%Th2o{VyuM6f?0a24 zb${eP0JSwhL~wnM4V%xzK9;zK|65WKR`(S%mujt1Dd_jNisy*1P6~B@^^f&9?5;X9 z+VzfT@`^3d!h0VI=aVyK<7hPFxqymLD@^aScKFwe0TOs>?`tZnS9p8Nm4 zTyog9H~@sH(4=<&A4=9q4zBp~d{j_bwiBCcqOK&!^EYcaHwD{=mLE=B%Jx!HQEu zOf)s-jLqOAF9Mz6JgbS}K|e{0>oscuIS{z%E8}J2eq;EPa8D-ee)lbb>ib1#WT@{w R;6DX`RFz&UR=qF{{y+Zv?8^WE diff --git a/tests_zemu/snapshots/st-not-using-ledger-rnd-for-tx/00005.png b/tests_zemu/snapshots/st-not-using-ledger-rnd-for-tx/00005.png index 175022eaa3513ceb448c548d472a8cce0eb93302..d86c37dd71d8fc66f50a22a8ba706da15e8d352a 100644 GIT binary patch delta 18559 zcmYg&2UJr{v~^I5ihxRo04g9YfYLjPQbQ4t-la(iy|*YJNS79*1*P}Us}KRHk=_kW zLPvTpf&cow_tyGnu~t@+%e`~w&Yan2?|rhCLr{}V@R`-{^@Z}Q7jJwrwlcBFB~qhh z>(XBPWo1e^2$+6GBS4Yuei8RzrzL>UHDNSy94%^lWU8 z)Ks*T&p9yyg9o=jpgH9A$p#?^^qxQQ*~>)uAWdmpTpWk&ebBChPqBHt;frbzXw(O3 z{-OW`67)?lSFSz3x(XV2NdQ7e+uouXy927YRYLmTE7j(m|6U*R{Ld@I;r4&;#Y+C? zIO1zwW*on6iFmoycJ}jMgAt9z#l6o~eXkO}e6X@0-J~s{hJzNCA$AsAEM3+n*hg^C z`%Va?^g98lv|rHx0rmW*HxAL)2fb%+4xOK$r|Y-@D(!9$+1AP(QYHjJF#AFJLlDpp zmC{AAJN>|SZH7?yuLi(L3|#jFg-AgakWDB4o4_}ao(;y+e|HAmi{?%E1{@;qGxCUP z2*LsS5rFjmMGKxM0Pc3I!Dz&}q%V^H;x*_8i$(8?lh&Og zj>0(fPuGlmJ8-wjq*~PX&89k7GBW>at!B4xUkTMje24hAv0Xo%0R?kB<9y+W)Bvj z((J6Dcew^a;T_+0{N+=61GH5|CM2aDu0$0zUlp4mmd(=$PCFrg#hT`KdUqd5zN^P( zsuvU&KZ$M}danuY?(<;Yd`Py70>(B4v+N_qjptW+|BLE~z6keZN9Y)=IQz@okn;U< zcST`!7fxpEL$OJ*O68NOms%9+F?DunJtNkbgBkZrf0?m(A=8B5WhGczzK7@U{*1d~ zwgeRuUnNhHi;Ew-+F^CiEoxy7j;YECpT%FgnLCb4A#1f3J>NY>(Q=9o@ppZ2F$qza zP5eT{4d)7_Cwd>k(J1`W_51uzUdRo+0A0nVgk@YbmDSdY8s#lbsyta2?{PRGEQ$RV z2@ePi5nod;xdl5gwp_(chd)QZl07dR|8=ZkpKMJZ(=3VP?4G4Myg~0N2zqazUjfc1 zA*;N=z8bR-xMe;Iy$cNeS&pD zYKd&$+W6VIk7E{Dlu7KqL(D-ET3|I4`)ovT?%JliofUM&Kq?u#;%iDpRR7%V-NVk_gMcJMdCga* zIaaoN%)(2#<%M^*DB85B?IabH#6D7$NfIpm;-dU)o$4BtcnHl$5Wc(W2Z7#NkV4xH zf0XR5JZ~4Jqc(6y-n?XkBfS%_EgC75x(4M93;m!=S6wOy2&7K~mLo`fal;sn^w<~t za+68(K0brucw-5)D-aZ6K7610@Wih`e7E;VlZqW!9*qS7hk^VWf`_t9t9~sb;+Co= zlU)^wEH7$gUuh<>DW~OQkn`1EmlA@cg#V%fb=HD-aXU)M05Si8m4YNX`(2EpF&{1N zOu`o_%S_>|kELe`VRx3whdWLy2EgHyp0Hnr|E8<;(^CviRG{Gb4}4I4;L*ti-eHvH znCJVflV30271c?RoN~gBAs25A{d=-TU)2YDvH{`t}n^gC6*G zgCJz}DBn)vG~P7sJrVR-=@;v)Z19yzcN=q@qMb0C^4q&SM&y}rKNCdWgFkydLSe~A zT~9ud$^?^pm2EbaJIK64e7V##kqlyWze70Y$xCXFo;Tx5X)5PWiPEY-saO;S=TT){ zCh(soVYj-5H_U9N?;eUQG!*L-C`d0Z#P&TqxL?YkoUk^pD!wSV71i`Vqtg(jR9Dqh zZkEvgkO=CP0*}l-y*jaMT?lE=oOa}#-bjL8Hfy>v$A!PVgT@m&46x?XFm@*pJG%g* zt6+mTV^I|0NoU?8Lsey`j=;-KB<1_QQ`qk)mR7Yzd(81~z`ZOu6 zCl}H2Lz#!(28gby$ZWAp^#IwyZ!R=z%+luIZeJvP6t-`ZmKKryiDkBK>&Pz;Ju0;9 zmVS9F=-xF9V!<8Ym%eYK!iYz*-Bvz6@&f|F&V|(Ax}=o&)xnu6T#Q>8TW2g&`d5(j zRqw+=y9B(tGopYgxyIE|h(HBh1H*bU;j@!KW--~EgYK4RYaeGkXMwA**o}_c1+7WH9JA(jZ`W#V`W1 zpcOILO7hKts1BI~9MR>AM6dAXnJ2Px@Xuw6U80v(vxX?t@M%HZS*rcjsVIt;u%I_hL$`Iv84hb?={xX+=aIa0nkl{gx9Xj(bT z+L@WPJornIj*RfO|5JJO$+}r5j-3n^^yLD!)N@wi6N2-g4pxsXdnQ>h+IzqRU#E^3 z0gfqpz<_cRVN{Hf$W(XqQ7JASx#`9{{Yj8GS9V5lLBd#U(^rzbqV%H|x)1 zRFB>A!iDD9`CYsSQeTw{{@e*K{~q6sYnz^wrf2{c=Dac~!z{}QsvO`}k+pAo?p68o zZ7rS=J#Kk?AcfjI_i7&ZR4bE+wKQta?d+!h>($I<6Yr)&KlD1GU#tBD9M=tC0rWgI z>basqG|`$k!4_xJJ0@pE7NpP`pX4pSM{etz@`E=&xPm3`O!DeiMQ*}1QuM6tcH@M~ z7!8K7>EIbpT2zOCH$@Zw{-+(dXU0keu-qOmZr_%v*BhugwKnqn$psAx`k>@H&J!Up z?@U>$RMHVCo5`2&#y9>&T@H1*Pn_q!8MJoCzttu7h(7qpM@oM`CN?-W zavzUZGowCXoe5q({Q{>n{$n+0tSfLOiK&trq}GN;OxV_a`~uOBk_xU6-%DIgde*}k z7kYaSGnjt0ah6cpbU+$fQdssi_qiA$hUqn$+aZNFY523Zs-KFlC)L8jQt8#i@dci= zMFE{97}h!amrXf|pSq3ux7buXTkllS^9b;r%9sF6ioGDT`xbn7wX9Hm%+my6Z890x z9a3U9DkP;xM+3wDe&S`P-Y2r5c$cpWh-lHeMGyATmfdDE>r0|e?n=k>BEsqt%8V-L z4M94q01t3?7rmBBSQ)7C2ghAPMOl6i$3h|llM3?io0EDuhVqMnHL#1bvqtO|4TMTO z%s%~RG*0ZS4es+2xf*Hv65Q>UoT0i)N%M(s|I_AC)3oCf$V-!I%sMB))5Kd0oHRap z)%%4~R#aYo_!J#!*bljP7FfmgY4GkT18Q#1*jJg}uilOxO`i1^4FAk~=pyDQ!icUx z{U|n(JF9e)?a_z!DED!EjOF{L+EMrulQi|qoU2W$91i|ThxqGdZIEyKIw*+AiL7pQ zAmaLBo)772Wzu`}>&9LwTS&;Z6N@?SbH?R8hSBveFDsH0a1U%Pf=inIwp_{8ht=HODyEOFiVApS_XY2R?LRX)4r{wXa<#_Nd2@&+?*(X!hS z8E3b0coJ_+s=G-uCVxNMbAP@~TxCwrh<$8*B>*RJl8pV^;NF)uK-2@Ln|&SlnSeu# zV!)QS?XhShXXK)om%lR)o3b3wU*+#sycxThaaYOdn)8G~HMZ=!$If46!6B~uff}bX z{l1~U;$Oxt=V|i##-DmpXbluqw)At|6Mt-xxYD{~_SiO7<74Sy(^ZwZ>s=AEckn0m z`FZ+q`F}Hnwtv|z)zM}&frwn@m{p_4&#t6TZ8T$W_23NR{5kP`T^e_IXfm%hF$;Hx z`n}RT=0ER3qiP0w_b^UT#unU?k_qBOk6CNz$+vHh9=Z5jVg!a!eZh;J$l*b5b^KMo z&B5Nk_J>Xz-a^!L`n4JS>X1IQd49(ij?{j{;Ox@yM9@hVvi`{tEVFu2!1e`KBmH~j zh$9gO7EZ}I>eAH7nq^p#YL9p8T5(<$T$AAl3foLDzUh20caGG12o{O8w0xUeDD6Hp zOS5H8eNM9_$M>U-`s?j`wM^%w@;d}ieq#?btzi6oYw9*wI!f*vnt&ZGwzYW zx%6h*s87f(4|eaDipPCEcpFmf(^ql`yxD_#9L)TYmnwL^M5Z#;jr(@^4GGbYf1(_D zv!x?daHN9z>w^NVJeIid0Bh9m4rhxtE!F<1U`uMbw0wEZp|n?L&Hk9sw%X9XA^tPM z%9r=93rWT@e|u_p8#U`}fMIOe9=49~w-Ha|V0d|_N^i~m`sDkKVLX8^wn*>x zM7DvegLppiy7lPP!$1v(ZXfwrxIVd< zm+Zr|%|8_mVw?j3gs6h_&&}SS%xu*^&{3f9mzTLLd8ErKyElXzA?7GV0sq2P$$iqfGBp7Upd24X8*R1gd6cR!bLels1T}OU8BJZH1hu*hnnnFRBB1z-&zQ{Pk!Ha<(?KghVt~*p6 zS5KLF{FcyGc@$$*_H6u$dv2hN00eUU3cUruYYzAyluy$M0Em;NUTKS;yHM?4B3B)^ z*jUtz1Y%};p>YLv40BrmG*Wb|DS1OBUlTI56wZALb`%v%e>8G}uQ^!rNXw6>UJ>(cvee%sYj`t&}_fQJH~mB_-dL4koSOG7L2r~M{!_LrAthWFFhlqWqW zH@DqLM=^EhRVH#L zABg4!n?l`6j9bheQY4MVaqH(mIVqG)xCdn0aeE7TMHzP<%~xGjE!~#D9B&I`b)mK% z^mRZsnkHn&_P;W*kT$}ML|)R=2O{79-AuMFVrgr)v6(;7SflH^{kb;l2$MKWMFsaJ z{uyZ^S0!ga3f9&%_5$)-0{~%T>r5tx`Bf-Bq7-B~tT$Y}OuA_h{Xf)4lV0`P(nUG+ z2B8NJX3)+`g2FR0T#`+~>h_%BSbdh+L`fKSpOBNf$~EBwse!l*;@fWxin8K9+YlA; zJ^SzIO^Gw()Xm=DS_N4A&_y;aJU*X`BRwcC8{n}F+8qiM0V1HB&M(y+Un$Rny^+ab z^}WA(r1gDrQ)pdkECh2nM^F1W^NyVq!RPHU4cn-o(vaH`OZK8-COz})DiK28nM~wx zc41u{Dy(LTX?T^CA$|TBL5G0xy{=_ZgB8pKd(yJGlu{T}U)CgEP~aF&n0923+42&! zm(KglKTXaapuV+?u$Ek|;Ec@Xbj$&V=uDzVT0@tKHuroQ(5dIo2KJM&rQaZ!nKHk2 z{RiQmEEHT>(9UI6{gA}bDl!d9NO!lvFoYhRLrx9A*cEhsr&N45@AXDl8yFzo+_yI1WFaAM z_ism7`!>%~Md>vb-~D+PIbHS;ore^EOHD@wG2mSbHEmKm3&XUdHVqLEK0aPzO{&Va zELj)HYe*8spd}#;;vyU&%_OspnLK*41*dxz9;etX-AUnP z6J}O>%2JLo(|X_Kn|iW%9rePRLEAsw7^%(iH>Syh$qcJ&9(40O=%Y40rLuFkMo!`0 zEk)bE>|}QkIXrBmrDjK2?9r+wvf^a9#-1DzpJQ}eW$Ml8dAaO->9g3e3RZ3U;**8E zTF;LBc%V9P^dIrs6aU)>DmL2nRvdc2ZL2EGUCSNG`!2n#;rgv^(x3jGuIc5SH;m@j zhvS1}-$lB|S_vPmKagRLtAfPnCEtH$=@meT;jG;caSkY)Te_7exxlZ#Ph8wz6%b9W zYS;V5qK98~m_HC=6Z5-W1?CVVU>I)Bo6O8A*w4cSZx#u0GRzBn0=+X~E{q2#Q7PsV zmQ%%+L3Y=A3-2uB2X;WfztVE0)_kxczUK7OKHRO>tin-L?9MBO*B5xC*$3AO-z0No z{#U-G5x5`(hlzAvcLcJ((;>=(u`WgjGvP#8s^hSudZ4o6nijDHjHZ=xJ+U~uGh<+q zB>}vvgfw6ALkYRY-Fg^wU|vDv#F`29j*QzkoVTjMHuyrzWHP-!?5foiMH;K&t)Jj>S@&Un4M-q}!%sW!lS@(BrwX_Vlv{QYK ztjB!Gi>7ki2{ONEq{FkqCogj_A()-k2>$&erVFh!4CD_0;W)#pTz7cfp%bd%%Sg%_ zwxD(&VJ&xibbn>b%i&Ox6{92)tr^b}r?~%gu_vw@w`5;2zXMQ#$woRlmg#GpOW_lE zVW!%@9>Aq6;a!y^Vkd!vJ3^6HN)RZI1(@h z&O3{wZ+Vq;|Jwe@|42=np+IRgsdQFIEh^hbirE*5Ar^n(KqVTLO8Q{B(AN;-+kt|# zLEm<#=>h*)Z=}0~-C8*%Z-M0{1Ee!ieb=Io)ILK}zFh;ilInl;RMhH<77NM0F1eLx>M;~y(!Uo0k6mQi$B7jjj!tvC#CnUB$w+t4f`Ib zKp|ZEeeF>vll(Z9`^(OaO+BBCpT9&QCS6`#|8_-vG|K6SUHGoL7VL@+p_Lj=`*tF$ zXDouNgT<6J?Of>fP758VX!5L|+Am4-lno@9$caC-GcueO>OX@A$Yc#Vpju`eMOgl8 zQZt3sTGUBdT(~H>^7y<{eb#@i?nb;<-XL9dr~+!u*^o&NegOL3{>SBOef6vp%vFWe z`_0>~$3|6KxWnQ{t9Ji79>Rb4?_%vyS=Er7{k&8ryybx9%bHN1=>q7I_nggkFJE*( z4m`wPb9jsz&x_ZV8a+<vET;ZZ!*(v9A-B-7r zJ)!u;wqg^)S!gM`(69GF9*}s@FDW45K!lM#5g3$b!1PK-RchC^R zM&8zLY;?^^Qnw-rIvi*HEh)@ZzO_cwjtY^ubnnTD76tn=s~2m?Z9kkrQQew$hP>u3 zlH1Kax#0H1*Tjke&Qbk6@01iEblX<-X(`li6-yGLPWnii@uSB}EL4ziXJ%eK=46}h zV*yLjpR?n&TP)c-LO)_AzNx@N(gz#x@*WsW0pXKLL^sZY5s@Fm2|(|I{*o6|ZE4ze zSzX*g`YD)Bv4L(Q($c-xtn!)wFPQUwqzPPa+ho&C<>0_w53g$8873zB^tfUY^A|o} z@oFN5XX(!?K)W{tLv}z-p^4@+Ez*`rlNVO#E>E^9jN}BJt$9^#t{jOVf4*`g4 zORi||k!NdH&t#`NGwf+oB3c8h0e0HcM3KO5uwl9g88yQ@QvG9D)90{DZ^qFnhBqPW zJ&XeNy!wFru2ZYjr!BfeA+@8jX>@qqi0TWr+OTv^oO6-J{<01V6W!Py+c5P5lxQ? zdVlO+h23(LAFJD%oJ_eepLHoJwjVPvZJv$Q*c#3G?I@D-%T{Bq5IQA9mYi~-|J--Q z5YQUt0Ps1(TwE*x&s5(YrMY^D?39e@`15d6A`{Na!XQ7q?vZ_UV_pH}{B#=gWV|0h zkIn$(9LvgUBe@D}p6wIl3L?vCwW|7>opr#;>iX4c(i6a@XZ;KF1r*CNX0IAKMg}fl zt4pW4&bZ+?+``?S!Vs4qBkh_jKkJMU-#iiTux5R~6)m~c`gbnByU}tQj65~;- zu)71pr{M|kQLDrK@=1qLp}_f7-*R~WJGsb<%h;*}+Xl(6NCEto!FLG&TH-jXyX;u` z?3Wvi!^n%X!*z9*8#SQwCmHI}w`7yZz4FWo@2=BY8-}42G?P{vT}Q&AdPMSAv40lU zUm){V6=;G-zS$J+zg`>_n%y}`dWw9RlH7L7oA?BN5r|w33F(<3JglDml+7uY@G;K7 zu(!QR4YWQ=a{egu!Swxw`eiW#)8AWNmSRkHK0*zb#DS_LopUy^&G=VSDaBA^m$4V-t3`s4Gn z6Qba~d8-u_#ERn4-M18EZ6IcDMzxn)1rOYp;uku2vc#P+fan-Y=@B8MX8q!{o-=j= zCgrZ*a((F|HDitAtA1tTE46oGN8<{T=jyd9h{yXZ8sTG}Tdew30ZMm>iJ~Y=Yfu2c**vSeZ)1+2 zg&6dC1nmISH2JB{Zwr%2PZJEkJwD`@EQxpAlDLQ3#9s)euL=;m_J`xwo1Zjr|nb5=7D};oOutDFp!;IX`0XhcDU^ZYOS;v`t-S4z>q(dQOU6 z?en(6GyIml>NyQ!>mCueKhZZx(h=QHuxs<)ZQdU-l+#`GcZ;4Qi`w*7eg!Rf= zqN0jz)F-X?PHiLIgwzMedp=6jhBFin|G=rMQ@URYRP-J3Z^8Xk!5jft-7~}KEqE5C zN}~jKd<}C0%;;MFftzpW2biX=Ju_;B)JUK{12#SO0x9=-yfVC>GaLj&5x& zRM*w1{aY2uP6UmlLR*q_dD_aT-hy+Eu9$Ted`!3-mMzTkw_X?loJ&}PUK9B%G-KpH zkQyLtZLs3Ym)t|6G3ogicR=24e-y}{lK)%R8~TLwosQ0k@6fYxK6K7@TwYn8OFlqf zbM8D{cCC9>idn9jbpjv_Y9|=$_}y*qfO9sUo!#sUdHtpLRA~o6*&=+-seW=(N0Y}Z z%wx2!Y;nI{MGpV9@naQaREWJqP;E4u6HwfctNSLBzo!6fCM(rnqO*Qs%4ZBv7K5dl zB1b8zl!_v~b`s7ii`hVa3Bfqt{(PL-TpMf6tKps1+N(dCCqEDmsPZlZy&J-1#bt&s ztS!GDD;sfXRvM$=dQL5|bYiC&Y4s09_}R|-9P`d~|3N*CshBA6;Tdbqtkbef^0RnL zmTwIMn?~~F?!>q~IZ`SY6nvcGqP$8S`BR%O1;4>R&7K6{@bZUM53oW|@)PdzXCW5p`QllF zZVT>)oGiI8>o+{!Fo1|LZU>b6TBA(IdhFo8rh)yDcUg>Wwc4>XUAI5V$aDmD{}Uh! zXygL6NRAe+GoczyNu!uxXvjntxlEuzo8d@%f_go?S#^Zm~x2$9#MRhpBK+)C+3*d(8K zNqT3+Sb@BPGR`~J+ElZOa5>Jb+4v+eOjWLD@OQcxRNw2q6YjdNqGN4~nKMiOK=AFa z->I;R;m#B&sN!cLB8Q~1VtB(VK0f{Vm(W{>Vb9Br4y6;Zl)S(P*M7%}G#V$uUZ;lE z{;4k#=WL#@=0aVk9Wkq~z3M7)jVQGP83M zdC-~*+zgyEhmwT1c@kIPOXH3CRQq0u+#6iX?Ar4IboHjH z0y{%QUdLvzVuPuS-%(gkaV>U>N@E3JKBzt>%5qY}WqL?`V+wP!LROz-Os=e7PJ1$S zY6O1P4l{)Ay7NN08Geq8rPlU&-22! zXXL`R0%jzGOw+npSsiP=lXZ{{mMmId)s)$qLO#{Ej9L;0(gm!_jc$=<=U}PWM*>@{ zs&prI(f@Snll&U~HZK`TCXMTju@)wo7^gAy84dO8^aImiVIO!vrQ7o!#&#ICq2&Bz zNSUO|UDUK^0oj>zOnQCfvkik$LD>IZg|DtIX8PvvS&Rye(9P|f*rkm$P60HjMk}Kf z`l2?;y4OSwzp?I-K+@&f9eIH^nFM6vaGZ=?&Ub)ZM>R;FqYpZ&`v z&s`NR43F92$sJWcu6;pP%ABr>D-ElTzVT(<|8g^(_l)FE zBJJfMkLA+J9f#a4?_EA8GLy;Pj<%!0sK31D(GIPT_I>E^s`1&Jr|G{)R$K3-hE+k5 zMHAR=Z#vJP?0jDEHs2bR{?TsIo^Pk*JtDNceKXTs9WMLZ2CzX`l45M22YWL@IE>55 zE7|XY=i;)NS0b@JF1r9BS;MuyYS|`U0Jx*V`-+58<6CzOY+)P^spZ?U6>L9GE#^82 z;J;X>K3f*R51)#*o9Hd~=!dBb_*Bx6SigF z-ct&Ihhgi4^JC_f64(wcb#!1@FB3&HCzE?C13p8vRLW5OC!^xirt-w`1zwxVl&uGD z!r7JjmbK{t?T^vo*k_oo`zoo#fx1xp@R7}D%nUsSIA~vC_11H>x_cZRG!4a?dc*ql zj)KvN^Pe=x;`6#SPQ<&WeJHNQ#3J%%p7O@Q9o{gqv&%G)SXuuTb1Nq9x=FCEj=M)k z-?=|rHR-JSRB!)eJr98TGfwqgtpEwsJnJMEdfBP%5sIw_587BU95RZjOW3}?YMph8 zS&c@j7u*iiBF_$3E95VoiYA{Lgnlb7?zh3kc3;Qz_(;VNUFlYr4i&|BrHj)?Wo5uO zvVhTuakB6<=_XzXcC0sQakT3Kd>H_-kJHHuV^eM~4_-YmD3Y@JIy}#l87c8G83OUM zc=Om30I6j{W0i>~TDeKk{g>YYUM2-k$j*wCs2QStk&~W4>Lf<%3dRl))Enp^ojWb9}Znuqi#R$Eq=>sgXN{)}$pn+8F2}mbbjLAx_K10#}8DtGgI2?!lVG?MWNn zHi1@~vpXcv58N}$Zklu9d&%y9xM8L{(p&^*-Uj5`9^53O{&x_iedKU&K}#d1F+blB zfsYbrF{d6Rxuuu|EsLYqA{J@<`j!U`jq^9~$<}rP^s&R!AB&I4lW0DFl zaK0S<0D>)|q`HiEdiHan--SwI)(>eRmS-+5mP@g33z7~lxG@P)4*Qo=ex<@|PJ$754Y0)3 zkE0wIw&PF5wBupAb>d3AocKV$C>@EmwTt-SJLuN0&O!iW=db}Z>W(1pX~jijB}(yhj@@9Gi|AeCRL|vK%?#leCexBmJ=fMK(k7vUZwy>kPM{v$U zgo{G~?bpgeYa5xaIn_6JpvqNGJJ_0by6$Zp)Daqf{w==Rt4n8a)N zC)}wTf`!i%HnYo9Cm!(q-g3ZkJLNnOt(iY#opZw{DZSBG^Hog3wC?VUg#w|9JdKWOm1&=bk>zv%is@?8mzKh{dr1X5R1)i|L@Q zfI0b!+;Z$jiI4$ovvZB&>dgk9y2_h#Z>&5Pw+%0t308+@;PiZg--B)Xg>8@MOIp?-ZrO{oz-gKdBLe<^wKY zwTm%#<|9uSutOf1#WHK_=tSBK-x0ub3C8oP80Z##C+}Vob$-J?3CCl{)LKgcUzhM^ zfDB`@-+e@}NY&4zL&fXX!}{O*pZg2NVyCfT^F=~2^TEkrMHruLDN&Pu`rOC}OVT{k z=DlQ!l-2>$h<=(l8A~lHB2igi^U#8VX1C<0eodPM;?MpHs%5p|_6kGCnH*NX-=8&5 zg)@ctpK`OWoBsJa1xa?Za|L&Y#O6@$D?xN%Ne^h9oVG>_J9 zn2~S*D)Es3HPxOJGe!ESHn@94&?o6X;Anm~QAOYhyfu7)T`A#bUBDuH@bc@twtidF z_GXXU5!sx8U82%oW7Ey4KHa}Yi-m{D|K)m~2y0m$LskW}TKFkn-|8jUFTK6SJTRmac zNfCETK;1xQFx73bPtDnCtJ`&ZB524@>Y54fH@7wh{&?csy%~sI{dsx0Z!q39?3-9G z8-7yMfet&_cyM(imwx|u5@`40y*Y2!(M!K%nR`2eZwP*%{scCMwmmZWTLlR*C#Vps zs6cRF1i}vpK;{A!6;B?w*qqYto0|p@$4FCH)P9g1xM&gvstRuWFH0Nrtw556mqT=l z>3a;d`}-e^e4;$!$)pVU z?qOJ`dZXn9Vh|ie(B{XyZza9_FalsXIPkSFtPq)q4d^*Zb*M)6rUY{wAc3;%r*I6d ztuo&PWn1$?dX)@u51+IZ=%@#J zzL^9G$YcVQ1{!v0S`4}piA?Vo3|tVOvEN+lpmkch_$4FX$B3Xe#hMG*Suf9%(z^!$ zC6Yq%Y|WMnJD`wj*VbkrM^gIk3m@T+9zf_p+)Q)O{yYoD6W2LWQ53cA0PM!p+%OJ6 zOoLL3@x+}m8d90+i4b8Ccmh+mtI4E*x`a~d&}au!9|qkB6i&3r6T zqjkLACyq{ef{BSQL@42{ZDPbI!c{aZ2m};Hz^J3Z8C7JFaSRY!&&>-Yp1UWI3b_rU zGnjLIvvbHrOohh~lkR-Ihv(6Ed$P?mF`-Q0ncFQ})Jd@<-gYiuCCpI-y3_^e$l0(( z>P{hv4x3xEKkD=B&dJ+_K1s$WRzFnSLrrc91`302eWWIef~!6d`I33E62gxI=^mnr_Q_YmI-nuz7eTS+ zEk+0eA5mR{OUUY-7{6EWQFB3Og5qd>9&&>&5@9uWK)qW%pnNiEweJ{L?YpF?31qu6 z|Fzr@{=yrGdp8zrsM`|e^sOwoW~HzA{SE1*znqFp2!HJO<06r{f{NICp;F8%P2RRx zk@!KBmRFPx%MrKkVZt%_^Imwz2cuTa9Y-cnEIYICX4637`@ccsCwQ-Boe@^O`{MhF zouUunKF1edJZ9B-PboRDkRCn+Ju7YK**IJ`{&iauUVlgVjzNeu#`aTd!X z@9)Fj4nwmlqd<&4;^hQ^fEpZ!+lU#yC$W}zV(UjpR_+rObLrAnle-S#xCA7(+`MVm z3R4rOApc(-Ph z6SF_p15={df{N-Zp%gt+h;p+r;U6K=9}c&bD?lJP81VD||Cw~6+6^r@>$|iSG74KK z?1bwLRuDSkS~s%3xVU_C?Q6JLY&GOSTyQZ{JX76d(u9xp92KY9V=PJjF*ci1`2nuC z2!^dv85tfu2R1|&s04U62WO>(c34D>@?6HMFHq+*`n=)?3aII^#~ugBD9WyK7uc!T zx&z_LbM}vmIq9;_>pO{S;+zC;6YopV!!-)D=TEF2LN11CzuhFHE_=rOOapKyt<7IO zOk8c`O$r_BD=Y?5>c3p6Ac3l<2}D8CP;$U-rC~ycm(;-VyMhl0@+>Vb+VTHNf!N;v z;u+*)Gg3&5VcNLemGbVWtn`ikVvxU?Ewn36CK<2>QzPX&$lQG(T*EMz#2-4vl zFEmXzvg%-)mTd(0IH896Qu#RK{ey6c1fT%u1LEKC2{G_)kzOxp-aRynb$R+wImDGl z;{&1VKoX}xe9{}Nv@7^linReE?=l{l$S=tVce(4&sGP6_X!u{73+}&quyFA8EVGR> zvQR^m+w2v>T1ThlTRI(x6mW`cod9)Oy|_>_m%y<0S=vk=)ZdFE(fIQ>M0I(2oD1q@#ahIK8B9fM!a0)+yJ z8N5gzrojRqFJf3_yj|CI=0p9uLeQxikXH=MW)~ML8UL8n?iRi z)lR*Mt0973i3V@YISCfbj|}7l8m1@!;FOqYZEP)v#$5ltivW6S{bzaNXJP7#@DrLn zC&RlxjP}^-iK}FCLxNWq07aw=P9x)6Y6}TD2t2SQX8$|3-5RrE5kqw9MnqyRjqq^z z`oSfAXL0ISm27az18=*H5YTblg9r$6eyd%K9~BPu8&whS;JgX{@R2A=w}u`yampP-R357lt2cK%u*+O6VKdLcQli5sN$+k=S|mJQh(yBK{fctv5}@bhH1 zqGE1)>=n{rXc-F&5wJrrUt`m52HS_763bG-wXYB(cT-|HixfMbCjZIsO7)Cl0Vrw@lUjtW`P&r z6w2pvNptyYT!U|PE0=sE(FUremV120pZVmPRn3-?8fa2kvGtYn@lHRBO*uoc+<0hA zQ&+*J^>)QuN6CyhCwpaUS}{k>GGLqSLdl@@M93$g58*A~*v(J@BJ7TIBEvW_E)+qe zFm>h`!zJE5j1c9(*A(x~Zj*o84Tel8wXQm8*L;3o$LQ~A2-2s$h2ZbTJyRPMok4#b zyOa51msa2PE-46vAfich20~PrXI$|P06cD`Sx;+qH~oq}t8L?gWPVI!>n%(q3mG`| zJ0iHG?yI^qCBZ7>A7qIMuFw+ek+WEh2(`@b>}2exkdQ1~T=*w%>;sY?Nz2l|dP_6L z02dyhTyb7-8AV18s*W`8{jI#pnq*y+k>Dc5oW*iL8iK(BI5iRus12Cq?7}JBo=<%e zT1pJ`YadVpvb9K)`O7po-nD%(qq_`3ALz`c6>k1^6<&)Tq#%E9<=eJ+o|0b_bOgBH z7+3wCp`SK@n*?n7179}KXR&}mz3sv56z=sgJw56}qi=&?F0ED$iS^i+4(^uruY#?n zfgpGyFb{dM;Ct>WJ;T( z72u&N*yF?iCXcl1a(_Xqj4vgsgm516Z{oeTN@h|_CUW&f0@D563A!wvn+)D>Q^CLk zq;QIbJY!(^0JjNZXn=(+nr}PQsRH}{{jdtnoNjFkAE`s{D~{Lz;2`3IA>FW1)g#H z8CqjkoG^2b7I<_-rF{AzPzBW#;8MPK_g;19OFM#U^OrOP@ZI?m%H5K}VqiJ8VfUrt zaHqG|&#G%+fI5`J*<{RzQYY1aaBCvrUrpES0?ZW*ls1PRa@N2YyIm952H}T(bb{kT zWP#$p>(oXM<&|$@ZnhaF0J=P8{h}3y1*%|H029k-BF%r5zlm&Ik&9;m?(wzta=os z*!z!10ziUxpHKWQTnxOHQx+W%uL(rDY36SebDo(&)uE~)%vlq>RY1*NHdlCg2@6oA zeB#=({W>_&&;+Gdr>y{&{@C=x+JO7Mh}z4WA45_F1nB-e9NV2EV5j6~b-3DBrFx7k+`NyEMyiGwKPyDB!B>$CYW3p5iFY{L09-vSnOjYX z%zk$dpVEzdQf*$7#AU))Bs+ByI4b0xaL41JJ}UJ5eiyXsII&RiK0J2%{&&tuz#);+ zCDSQ({R6igd)QzgVyKwErg(UVmc*oe5=f?|xuW+(jL;C}2ODFm?noC^#Bkg;LRF7M z8e=1~Ed5PLyL-lm>!)gq_`OoSY>oQ~x1UZMr$xgW(te4qzxnpGSWP{sPx9b0rkfe`%)3k06%q@*w*~(Zu=G({(C&20PZ$0>uTT%Nb<(oiBwsWa9 zCGik@0R092%0&!VyJFze67?YIE*d2psxxJ+sKrhPnX*i|qd+uvYf%ir3T)2tm+0iA zS3ySJ)bj9egavuQ!)O7a11?KJ;c%%z)TF~afM!2rGFL&gZIr~c&!K=qrZ$@5h}moY z0L;2~iUjt~OVdOD3fN)|)t$DN9s>p1`9;@W&*U{-auN^>XYL6^Ke-;km9maeBn76$ z9(`HYNtLN-H_0F>*AVP$R%>oG?Nlx|REHP*zQe92f_+8I6ez_v#=t~-mK#RB99}=J ziJ@=la3ULZv9cEsN?4}nwca>^#h>bag`WByGF{Dx<@R4kQ1YEEq*e&09WuCfx&GxZ z8Y<#=&-dv6l*RYvAKMCBZ-da((H2A?*sFt$H=tcVa|;4cFv0(ckcq}O{20QnvpI{4 zH^zGbe#hb}3eW=&^f+#UKw&QuD+IX`pTG2n`vEdqE$jk_O2dbNakM9LSN@(i=2BXB zN{UC|aX7JmKYs9}JD|msA{_Vu0AFN^wYYS|LZgrxU`zckvH{}$c<))%^NRl$h6Q>0 ztaM#RvSK7n)3Pk5$yU=e^vBxY>b~#0u8X25Ns>5@7rgm*V=D^&fbkmy&!#NPZ(!nf zyBiIb-tBgq7BeZ`<#Jg(*^=Y&Na;KtkIUZtyORe@B7ed(O(%o`FDFS7ytvl_!SX_O z{n9kevh3^YD~h77>$-&CM_sTykbt;W__I>F`16@KJ+$BtsM8C>4Oew&}xeP1CxrjZZlqkN5jsNxyP4 z!Cf;Z&vQKsK2Kky+#D}1%Q8o_lS=?7K(MU11&dpVEI>zpL5_wP>%C{#Z!rX>!x63_ zSb3gH!-0eE_j_B)jas0~5TOhRI*bmP3(u!7Qh#p77w3pJ%Q9m*dzJvufnZs22-f5A zFjg{Fu{_Ujx7+=GmkoeFp~iae8TMPW9*?Y{a%$poxjY_^`~A)$62~z=MTv*(HQ97!X|T6Pk|b2Z(m3Kf{hz)_ zxqlg797juL-R*XhIW>N$d`bWqfnZs&3D)g)V{ws}Z2bj}Crwk^ofE<;sp8+|SACIL zLYr=K3XjJlHEj7i+hQ!}GM@YWZj4_~Oi>g{B9F%-SK0|rpHps*7pFwavotbOqe=i6 z!JzvvUDthld>AjuPc-}H$RDF9O4Bq=(|@*Y9bQ-dVc8W(=~hUyVkkosq1gugM}73& zO`hkn54GR#9sX|D>s8)wEFYhTu2gQeXtOL!l7uD!nx;|8ZBz*W2?T2*Ns<&rA;(R* z?(TLw8d7g6?CdUsHAXr{-ooL2w)j5p6|u7hE@_P@_W_-?l|u3?%3 z4PEVaJIXJ)k5pB4I-T-7zg#YC5P3d*rE>F$7J{`P5UgQnikklBWq^mnL76pU%CfZe zF9uu7U|2S?x~?1B7h8kF;Xry3$A592=jjid&1R;ZMeen2+cr(pwk@j?8B;W=>i_hW z%FQR*_xZH^0w7r9psotl(bMT9hf8U&DT*TMzl@63KPHqYV%FPiirwxL&AlP1JG(7Hmy|CAFA9*rXO1zPlNr!WwV^W2g~Vn+U<5&G z&?TIL99WSaG&D}E&mJC+$J_1Z_Vn=&o2KdQb~CPtQ?>()<5;mc9Dg%bqi$wsD?2@T zGY4)cF?wm_d49j&Igz8DzEZhSw8piB(tQ*x!be$_w&{5=2ggGE!5v5a7x8;;55QwR zKJJmDZdOvV#>N9ar7`yDYm}RRv|uurC0q+f%Ng9S(!b4nPDhSvKhql9dOj9Dr7>Yz z*5|gdMez=fCchhW2^OD?bacf05dforU_Be@p7TtHDFA)}lQU7E6#+F;u)Uc$Lg)Yh N002ovPDHLkV1iEA_)7o) delta 18751 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 R;6DX`RFz&UR=qF{{y+Zv?8^WE diff --git a/tests_zemu/snapshots/x-1-tr-in-1-tr-out-1-spend-2-sh-out/00015.png b/tests_zemu/snapshots/x-1-tr-in-1-tr-out-1-spend-2-sh-out/00015.png index 8436730ee4aa19f84a05fd2d060c9a8d81abfab8..c60b6ce7b5fc60ec442862e8944b3d51772932a9 100644 GIT binary patch delta 359 zcmV-t0hs=j1A+sPB!5XsL_t(|obB0N4#FT1Mo~2GWcI%#_Tob$A^b<^hpqQKHDH0x zv_Q}~0000$?xF0=dmpaN?2Pu!Ebb-luGo8Ccr>znY&9=gPsgLqKU=Mx5X!hJ|8cuE zl*@9UOF&m1!4RP2!i}Y~_$mCFr?|gbP~w0#0v94~W+U%%UVrGlZzrZZhP8BGKzM%} zGj%XO3Di=eoZm-CzkuS>cZN$$K8I~pn~Enswq1Y9@z?gk0Cbo2`Zdw}G$E4fYv&@J(inRbdL%XQl497>=XWTG!q z2sP0cBL_P%3+==@yc6LC0000000000000000000^^9HJCJ7>vO6H@>H002ovPDHLk FV1g_Up_2dr delta 377 zcmV-<0fzp91C#@hB!62;L_t(|obA|Ka>F1DKvB}^PT2pF*h@d0Xc)w63Krnp^W}jC z94QEja{vGUfVr3DWFZ83_TJwyzV|+!C7v!jyKcM&nf`7izh*OCUv>PumBx`!#$Ec4 z>%G!$mIJ#4H0cORfRYE-m(J``*v*gee5Iho0j&g1BJREK`F}0z#t=e1G0k_F%Weh8 z@3&H^#dr}YrNpwn_b^=n*{$ymM--pSvOPdohDz_0DfVP{3~io4OPjF!lrOzG>yJ-4 zhL+wCHO<}Cc${xED*@w!006L`${9mSy8=(`83fa_lR+`@f)0uplLEf1^TsNwh$lsLB*y&2rpXAdX3 ztEc6-V`yXW{TJ*56oX9k&16DN^o@~&m8e21u@A3AcmV(a000000000000000fZO~5 XAnjWSf!{fJ00000NkvXXu0mjf&l0pp diff --git a/tests_zemu/snapshots/x-1-tr-in-1-tr-out-1-spend-2-sh-out/00019.png b/tests_zemu/snapshots/x-1-tr-in-1-tr-out-1-spend-2-sh-out/00019.png index 518993a1e4c73387c538a2f58266982a360d8237..1e1abf11379a4893b5c3e2bf86103065d9bfc020 100644 GIT binary patch delta 293 zcmV+=0owki0>1)~BYyz~Nkl3dY1B+E_dR+72Rte7MWg~O)XSpOra5?LU!x~*K+d`3 zcfLp|%~_srn}atO=^M~|&9~iu5d>~Q(|dkPRqmhkTBH_KG=EbZEAK_f7E}+;;(mky z0RE=|+tB8oa_!NHk&W%?(Z~<9ILz68wEv=xc2(p)LjDr2MSo#qp9QT6bT0J30-QKB z9VmPYicSG;ro*zW|Ja&-ZD1A?*fY`$aw1MM^0hw1579KETTQa;chg9(` z-@Q>v*;C#xhnd%d`YF!+(f#<=&)Rg8I%~-c1+) zfJyp43Qupv_FT~6XU_SpcN+cpe;a3xlwZQ_73e& z9Us>`hCUhp`lsLpJPcX-(+r}P{$y$p$to1dJ{(EB0000000000008iBz5%2V-gWfE Sm5KlW002ovP6b4+LSTZL)qR=( diff --git a/tests_zemu/snapshots/x-builder-addr-diff-to-inittx-addr/00015.png b/tests_zemu/snapshots/x-builder-addr-diff-to-inittx-addr/00015.png index 8436730ee4aa19f84a05fd2d060c9a8d81abfab8..c60b6ce7b5fc60ec442862e8944b3d51772932a9 100644 GIT binary patch delta 359 zcmV-t0hs=j1A+sPB!5XsL_t(|obB0N4#FT1Mo~2GWcI%#_Tob$A^b<^hpqQKHDH0x zv_Q}~0000$?xF0=dmpaN?2Pu!Ebb-luGo8Ccr>znY&9=gPsgLqKU=Mx5X!hJ|8cuE zl*@9UOF&m1!4RP2!i}Y~_$mCFr?|gbP~w0#0v94~W+U%%UVrGlZzrZZhP8BGKzM%} zGj%XO3Di=eoZm-CzkuS>cZN$$K8I~pn~Enswq1Y9@z?gk0Cbo2`Zdw}G$E4fYv&@J(inRbdL%XQl497>=XWTG!q z2sP0cBL_P%3+==@yc6LC0000000000000000000^^9HJCJ7>vO6H@>H002ovPDHLk FV1g_Up_2dr delta 377 zcmV-<0fzp91C#@hB!62;L_t(|obA|Ka>F1DKvB}^PT2pF*h@d0Xc)w63Krnp^W}jC z94QEja{vGUfVr3DWFZ83_TJwyzV|+!C7v!jyKcM&nf`7izh*OCUv>PumBx`!#$Ec4 z>%G!$mIJ#4H0cORfRYE-m(J``*v*gee5Iho0j&g1BJREK`F}0z#t=e1G0k_F%Weh8 z@3&H^#dr}YrNpwn_b^=n*{$ymM--pSvOPdohDz_0DfVP{3~io4OPjF!lrOzG>yJ-4 zhL+wCHO<}Cc${xED*@w!006L`${9mSy8=(`83fa_lR+`@f)0uplLEf1^TsNwh$lsLB*y&2rpXAdX3 ztEc6-V`yXW{TJ*56oX9k&16DN^o@~&m8e21u@A3AcmV(a000000000000000fZO~5 XAnjWSf!{fJ00000NkvXXu0mjf&l0pp diff --git a/tests_zemu/snapshots/x-builder-addr-diff-to-inittx-addr/00019.png b/tests_zemu/snapshots/x-builder-addr-diff-to-inittx-addr/00019.png index 518993a1e4c73387c538a2f58266982a360d8237..1e1abf11379a4893b5c3e2bf86103065d9bfc020 100644 GIT binary patch delta 293 zcmV+=0owki0>1)~BYyz~Nkl3dY1B+E_dR+72Rte7MWg~O)XSpOra5?LU!x~*K+d`3 zcfLp|%~_srn}atO=^M~|&9~iu5d>~Q(|dkPRqmhkTBH_KG=EbZEAK_f7E}+;;(mky z0RE=|+tB8oa_!NHk&W%?(Z~<9ILz68wEv=xc2(p)LjDr2MSo#qp9QT6bT0J30-QKB z9VmPYicSG;ro*zW|Ja&-ZD1A?*fY`$aw1MM^0hw1579KETTQa;chg9(` z-@Q>v*;C#xhnd%d`YF!+(f#<=&)Rg8I%~-c1+) zfJyp43Qupv_FT~6XU_SpcN+cpe;a3xlwZQ_73e& z9Us>`hCUhp`lsLpJPcX-(+r}P{$y$p$to1dJ{(EB0000000000008iBz5%2V-gWfE Sm5KlW002ovP6b4+LSTZL)qR=( diff --git a/tests_zemu/snapshots/x-ext-more-sigs-than-needed-for-tx/00015.png b/tests_zemu/snapshots/x-ext-more-sigs-than-needed-for-tx/00015.png index 8436730ee4aa19f84a05fd2d060c9a8d81abfab8..c60b6ce7b5fc60ec442862e8944b3d51772932a9 100644 GIT binary patch delta 359 zcmV-t0hs=j1A+sPB!5XsL_t(|obB0N4#FT1Mo~2GWcI%#_Tob$A^b<^hpqQKHDH0x zv_Q}~0000$?xF0=dmpaN?2Pu!Ebb-luGo8Ccr>znY&9=gPsgLqKU=Mx5X!hJ|8cuE zl*@9UOF&m1!4RP2!i}Y~_$mCFr?|gbP~w0#0v94~W+U%%UVrGlZzrZZhP8BGKzM%} zGj%XO3Di=eoZm-CzkuS>cZN$$K8I~pn~Enswq1Y9@z?gk0Cbo2`Zdw}G$E4fYv&@J(inRbdL%XQl497>=XWTG!q z2sP0cBL_P%3+==@yc6LC0000000000000000000^^9HJCJ7>vO6H@>H002ovPDHLk FV1g_Up_2dr delta 377 zcmV-<0fzp91C#@hB!62;L_t(|obA|Ka>F1DKvB}^PT2pF*h@d0Xc)w63Krnp^W}jC z94QEja{vGUfVr3DWFZ83_TJwyzV|+!C7v!jyKcM&nf`7izh*OCUv>PumBx`!#$Ec4 z>%G!$mIJ#4H0cORfRYE-m(J``*v*gee5Iho0j&g1BJREK`F}0z#t=e1G0k_F%Weh8 z@3&H^#dr}YrNpwn_b^=n*{$ymM--pSvOPdohDz_0DfVP{3~io4OPjF!lrOzG>yJ-4 zhL+wCHO<}Cc${xED*@w!006L`${9mSy8=(`83fa_lR+`@f)0uplLEf1^TsNwh$lsLB*y&2rpXAdX3 ztEc6-V`yXW{TJ*56oX9k&16DN^o@~&m8e21u@A3AcmV(a000000000000000fZO~5 XAnjWSf!{fJ00000NkvXXu0mjf&l0pp diff --git a/tests_zemu/snapshots/x-ext-more-sigs-than-needed-for-tx/00019.png b/tests_zemu/snapshots/x-ext-more-sigs-than-needed-for-tx/00019.png index 518993a1e4c73387c538a2f58266982a360d8237..1e1abf11379a4893b5c3e2bf86103065d9bfc020 100644 GIT binary patch delta 293 zcmV+=0owki0>1)~BYyz~Nkl3dY1B+E_dR+72Rte7MWg~O)XSpOra5?LU!x~*K+d`3 zcfLp|%~_srn}atO=^M~|&9~iu5d>~Q(|dkPRqmhkTBH_KG=EbZEAK_f7E}+;;(mky z0RE=|+tB8oa_!NHk&W%?(Z~<9ILz68wEv=xc2(p)LjDr2MSo#qp9QT6bT0J30-QKB z9VmPYicSG;ro*zW|Ja&-ZD1A?*fY`$aw1MM^0hw1579KETTQa;chg9(` z-@Q>v*;C#xhnd%d`YF!+(f#<=&)Rg8I%~-c1+) zfJyp43Qupv_FT~6XU_SpcN+cpe;a3xlwZQ_73e& z9Us>`hCUhp`lsLpJPcX-(+r}P{$y$p$to1dJ{(EB0000000000008iBz5%2V-gWfE Sm5KlW002ovP6b4+LSTZL)qR=( diff --git a/tests_zemu/snapshots/x-not-using-ledger-rnd-for-tx/00015.png b/tests_zemu/snapshots/x-not-using-ledger-rnd-for-tx/00015.png index 8436730ee4aa19f84a05fd2d060c9a8d81abfab8..c60b6ce7b5fc60ec442862e8944b3d51772932a9 100644 GIT binary patch delta 359 zcmV-t0hs=j1A+sPB!5XsL_t(|obB0N4#FT1Mo~2GWcI%#_Tob$A^b<^hpqQKHDH0x zv_Q}~0000$?xF0=dmpaN?2Pu!Ebb-luGo8Ccr>znY&9=gPsgLqKU=Mx5X!hJ|8cuE zl*@9UOF&m1!4RP2!i}Y~_$mCFr?|gbP~w0#0v94~W+U%%UVrGlZzrZZhP8BGKzM%} zGj%XO3Di=eoZm-CzkuS>cZN$$K8I~pn~Enswq1Y9@z?gk0Cbo2`Zdw}G$E4fYv&@J(inRbdL%XQl497>=XWTG!q z2sP0cBL_P%3+==@yc6LC0000000000000000000^^9HJCJ7>vO6H@>H002ovPDHLk FV1g_Up_2dr delta 377 zcmV-<0fzp91C#@hB!62;L_t(|obA|Ka>F1DKvB}^PT2pF*h@d0Xc)w63Krnp^W}jC z94QEja{vGUfVr3DWFZ83_TJwyzV|+!C7v!jyKcM&nf`7izh*OCUv>PumBx`!#$Ec4 z>%G!$mIJ#4H0cORfRYE-m(J``*v*gee5Iho0j&g1BJREK`F}0z#t=e1G0k_F%Weh8 z@3&H^#dr}YrNpwn_b^=n*{$ymM--pSvOPdohDz_0DfVP{3~io4OPjF!lrOzG>yJ-4 zhL+wCHO<}Cc${xED*@w!006L`${9mSy8=(`83fa_lR+`@f)0uplLEf1^TsNwh$lsLB*y&2rpXAdX3 ztEc6-V`yXW{TJ*56oX9k&16DN^o@~&m8e21u@A3AcmV(a000000000000000fZO~5 XAnjWSf!{fJ00000NkvXXu0mjf&l0pp diff --git a/tests_zemu/snapshots/x-not-using-ledger-rnd-for-tx/00019.png b/tests_zemu/snapshots/x-not-using-ledger-rnd-for-tx/00019.png index 518993a1e4c73387c538a2f58266982a360d8237..1e1abf11379a4893b5c3e2bf86103065d9bfc020 100644 GIT binary patch delta 293 zcmV+=0owki0>1)~BYyz~Nkl3dY1B+E_dR+72Rte7MWg~O)XSpOra5?LU!x~*K+d`3 zcfLp|%~_srn}atO=^M~|&9~iu5d>~Q(|dkPRqmhkTBH_KG=EbZEAK_f7E}+;;(mky z0RE=|+tB8oa_!NHk&W%?(Z~<9ILz68wEv=xc2(p)LjDr2MSo#qp9QT6bT0J30-QKB z9VmPYicSG;ro*zW|Ja&-ZD1A?*fY`$aw1MM^0hw1579KETTQa;chg9(` z-@Q>v*;C#xhnd%d`YF!+(f#<=&)Rg8I%~-c1+) zfJyp43Qupv_FT~6XU_SpcN+cpe;a3xlwZQ_73e& z9Us>`hCUhp`lsLpJPcX-(+r}P{$y$p$to1dJ{(EB0000000000008iBz5%2V-gWfE Sm5KlW002ovP6b4+LSTZL)qR=( From 2acc83fa178a055419d894f8481bf3b4a6f99388 Mon Sep 17 00:00:00 2001 From: becominginsane Date: Thu, 16 Nov 2023 09:55:58 +0800 Subject: [PATCH 24/24] chore: fix last snapshots --- .../snapshots/s-2-spend-2-out/00019.png | Bin 343 -> 629 bytes .../snapshots/s-2-spend-2-out/00020.png | Bin 260 -> 646 bytes .../snapshots/s-2-spend-2-out/00021.png | Bin 249 -> 260 bytes .../snapshots/s-2-spend-2-out/00022.png | Bin 320 -> 249 bytes .../snapshots/sp-2-spend-2-out/00016.png | Bin 375 -> 894 bytes .../snapshots/sp-2-spend-2-out/00017.png | Bin 294 -> 490 bytes .../snapshots/sp-2-spend-2-out/00018.png | Bin 355 -> 294 bytes .../snapshots/sp-2-spend-2-out/00019.png | Bin 496 -> 355 bytes .../snapshots/st-2-spend-2-out/00006.png | Bin 11290 -> 18633 bytes .../snapshots/st-2-spend-2-out/00008.png | Bin 5467 -> 10838 bytes .../snapshots/x-2-spend-2-out/00016.png | Bin 379 -> 895 bytes .../snapshots/x-2-spend-2-out/00017.png | Bin 294 -> 491 bytes .../snapshots/x-2-spend-2-out/00018.png | Bin 355 -> 294 bytes .../snapshots/x-2-spend-2-out/00019.png | Bin 492 -> 355 bytes 14 files changed, 0 insertions(+), 0 deletions(-) diff --git a/tests_zemu/snapshots/s-2-spend-2-out/00019.png b/tests_zemu/snapshots/s-2-spend-2-out/00019.png index 790ac765f038daf4076015134f4593d9e155f649..217592db295aeb7c75ee6321e661e5fa2d1cb63c 100644 GIT binary patch delta 605 zcmV-j0;2ub0`&xtBYy%sNkl~@t53q++W{kco_boLfV{L>ULG8AxXmK!XqW6Fz-TlVB?;TJp?L`Y%DEx zmuwuel;b5qZ_+ppfc5`~KG{|bs)gLFO7?_Z1tA$~2J z{q$OZ6uJgA=f^LBNxxRkeoE7LYt{gfdc7$xIEIghfpXFu+hs&ULZgO6{=Z^7hQ zkGm>vW07Blntyzeqc(m9hk1m&5b;)$y}qr-TT)uc(nw1X_$Kh>e(cBklHxhxq)Rq$5vfgWVA0p?SKsL98q%_GQ3jKbuLWuP3e?5 zxP`=|-RQo30T>6YFjXRfCBud6QT3R6&Z^A4@;JnIgnyyZV&*Q2(#4Nj5QCm$k&Tt` zhM^&UY{Elui^|M|1H-!;-(dW6wXw0W@%6C30X3M&m%m{h6aPV6htTqrZ<^fF_j0I+ZLlI`+yhb-xMMT4G0`^5CCR1OM$D{=t-xIFc z9^(IKcvfRLL}$W|L|<)LkaK#lECDWvUVx}W7khZsY|*E}J+Omaiuf>$VW|2xMkV?T r4<-j00000NkvXXu0mjfmDeek delta 317 zcmV-D0mAkl6a5<%HODy$G#$iR$5>s# P00000NkvXXu0mjfgin&u diff --git a/tests_zemu/snapshots/s-2-spend-2-out/00020.png b/tests_zemu/snapshots/s-2-spend-2-out/00020.png index afa3fe3e088723f57ef0dfe3a54ede519aa0d443..db7a548f98d2956f30f002b4d5480f055c06c7c3 100644 GIT binary patch delta 622 zcmV-!0+IcM0)_>UBYy%-NklsK-#|Ij?VV~3xpO?ZxfyKLwG%&Q8iSA901qkophs)bR)&tMCh1h#f% z?zZ{?!V2_?9;6$u9Vj%S*j?*uQ);Cd{Ef?%djN@h;zeq7y&{Pl;Jj>K>FY^nY3tF@ zaSu|Nmj{93ysle)B6^*g8%MI|sU>_yz)9KoI`URcf4eo+LF8;qJu^)vhM>d(3|0snLufp>SWuwG zY*aOnf(NE2b_S%EnqHZbXfg&HvFaF=4B2M82e1t&rg0G&8!shh(P`g=h2v~oaw@hc zP}>_@+ZMoaa%2`HP8$p$m#~SuUKG`q7j@kLWZOaG5`V8kqM7qmGXxf0O4PydB+bZR zANrDe06z(y0`CUI!w|gRXT2g(EYuipsfKPD0uG&YZ6r*-QVgE^MLFXO~g03h_AfW(h(nh zKYt*jm1i1@GMh2j12TH?O=Pc*{IbR`&$tdF1JszCFmmsA*YuIAnX&plfCZ0wtYwyV zxaaTaIAZljVn7bNM^G70JZ@5l%soy+);;0H z%q*BT!RoA09ERW0_=@HECE_OE?aW_*$x(p8D8OJ8;1AVb@Xv-id#u{J junh$O0000008qFB=ZCaEkIV9900000NkvXXu0mjfeOz+H diff --git a/tests_zemu/snapshots/s-2-spend-2-out/00021.png b/tests_zemu/snapshots/s-2-spend-2-out/00021.png index 006c26abaac6c76b2e871b194165596c0b416694..afa3fe3e088723f57ef0dfe3a54ede519aa0d443 100644 GIT binary patch delta 232 zcmVVU!awrF8BOAUNhkqZ$GC;P#I4=Zc>NLJx)W`J>kX7 zEUeOR|7^dkDXmi#W$o1#kKVJ^;!{YDA(uxpJqP%x>fR5dl3~28`Pk+=CJ)s;001G* zL8%@Z+w+5*vr^B&>a0;5hTqcoisktw;wIni%wK@XQGmfHz+e>M57l4r&xSgCtlGM; i4Fv!I00000P`Co;hqOPB%kpIa0000KOn40000003gW< XFTQ24g)B5$00000NkvXXu0mjf%9Co; diff --git a/tests_zemu/snapshots/s-2-spend-2-out/00022.png b/tests_zemu/snapshots/s-2-spend-2-out/00022.png index 1cd31cb2583141eb9a68beca2d3844084ec96496..006c26abaac6c76b2e871b194165596c0b416694 100644 GIT binary patch delta 222 zcmV<403rXt0{H=uBYyzENklbj?&pa6O!qUj-KP8b*aIa}NQpVDM27(Yu87xPW-HU%N9Xm=i`GrK z`c<=vSN1M)7xn*dyAZw~D~|m>-9vo?clT7^fSMlyQ3UBWz*lp*W^o_xVX~hV_xLK! zJWxl!^aO+v9CqZO_yak9g>(j#>GisJk$>I;(Fy2tpnp;v&~L`+D(V>k00000001D# Y3NOB8u!Sr%S^xk507*qoM6N<$f&jp45C8xG delta 294 zcmV+>0onff0l)%~BYy!0NklE6YWiyP z)SiHdEaF+4qWi-*+V{-CYwla!0T1m7{D34p*v7mBdAzE`mVZ5l+2i{F03f1Qh>fk1 zvaul<)@P{6cmFqR6tm3c(R{lyXYK!VA7-+k*lL~U3YYR_)dh&FR<8!(GPJXH?<{vM z$&TIv2x9FSC=1C-4zM%_oR$+AaK1fG?0GyHn6f sLkA$l^I|V3gCC^;00000003^l2I}~YhFpU+H2?qr07*qoM6N<$g3U&SmH+?% diff --git a/tests_zemu/snapshots/sp-2-spend-2-out/00016.png b/tests_zemu/snapshots/sp-2-spend-2-out/00016.png index 58ee321eb80f39ae207a6d31b9d523b22f73653b..cbac6178130e212241008c9afc67c65ba696b701 100644 GIT binary patch delta 872 zcmV-u1DE{w0{#Y&BYy)$NkleD12qAuR6R^IT=twBKCZh2pa=)FEBh)tB^5bcr@1n$Pfi ziIo=a&5Rw9XwSY`%|mBD_$peNJ&_F{;Lj2(L(D;RJO^y6qkqTajMLao(BC59msm3c zZoEO^4I)9i)X8b2od)GKUxiudv8DsWxW1l<%Bv>t(Ip~IcM8+gs!6F?HUmT-e4K^J zdi9DHbbyZUe4>AycZyJ6D9i|73VT5Z-1kp!!*^KQiH6wEi6zA>*NeF4xA$TO6W0_a zeN^wQNMC`s*?-+>;oF(-fK`zYLJ0X@#%gFF;{^3%t+9p|$zg3Shr3eGNbFks!W~t} z3JGGT+&;{28<0p4FFHb`dEqDU!gFe9ZxkFsX5nz;F4QBDq3SisdhdOK4aXfIj9%(h zMm9mM$#6+Ip1DZXZ!Qo)!h5<#yidNR8F#=!>9rxOfq$#PaJs~a3mEp6X<4+YvFU}3 zAl8e#l2yL&RvVspSH6%T1>`nVPpIKaXWmg`)w6aJ9&T{W`z^9|n-$D>3ceDzOlnLU zaFfjJZ^KA6v%eYk!6)G=^hpLuW*@wYPH*vSD87>epM(1SSs)^s534~*O^J$QFe`Wo ziH#IV34e; zr>dD>gUY?N#;~C`w80sGjGNpH2++%}F8LvM_-#TP0@MMkCfeEwYpPN;7n73mj7_Sc z9|n3MBW`8q^KU>0whayJnC{GmS%NTv;TgwZzJJWvcTXmS5JCv~FNoC8tfU7%df-nz zLCrwI)Fr`td|iTE^^De=AiMiU>T3~Z-k?_*(U)d~Ot4N|EqyQxR5Z;oat{PgFAEI5 zE3c0Ly_dD#$gvO(%ZjE~82>sPm0FGkqs{7_!+5}J*F-a*eAMz&)wIlsEG$FgUWLm! zZDE!oy##?PfO&eZA01k?MhuGN#=)eds@O8(y|y-PI-Hw0p7$@X@Did9m{&9pU|fji yp7x1M5pP2|e|R8RxO5(Z%n(8dA%qa}BlrtX+*+G@f2-nE=#KlsNlhAggwv%b&82^~u7@Z&K+LBhBYy$0NklXlGsZJQ4!A=hmQeOxo1@I z59j-c>4VAD1E1J74#$A78)x_Uw zOVV>rPNTBYmhxT$6H(>U0b*RoPvT;inVZ*}YN@6Bk+@xr=GAk8+YBhzw6oeX)zaW~ z59QDS>e`hnf1R(iMb}$Gv`TH{ikACqLm!u{+9DkOmfyxrp<0Xa0#TzGYm(T-8dWcP zBfUaxv%5dYdw;offJ;jN0Pp2?8rrM2-R!!>C@BlsGU^7l6UOnz(vy!BHl2nxY8m4L z0oDK1!sij}a25YvIe3lXTr1CS5r=@{;`W$(9G(H#`A+rmx08s$o_G18@lb0jQwJ*q`bu_F-pFkA6$eV(tG@c_y*M^ll^U! zRFnP9=!27Z3!U_kWcpw!(hC3p00000000000000004(zh)AEj*p=dCA00000NkvXX Hu0mjfOrPYC delta 268 zcmV+n0rURq1EvCyBYyzxNklr1ROJXnmVL}+g^mCe`%sF3( z2_d%>&}{<%fa!jsC-9V7YkyfviJHm3yGBpo1!u~=$y9)Y{N|INH(>w( zCh7kuJiHa#b3%uoIrncp-{?pCWSrr|zAELHa4-AUR{8>DrvSkeAeaIyX2KcZaN0Yx z-#aX3IfgzM|NN)m1^gMZ^rsm_E&a*VAd*!ml6^RmcmV(a000000002sYi@kh-gP&1 SW`Fr1ROJXnmVL}+g^mCe`%sF3( z2_d%>&}{<%fa!jsC-9V7YkyfviJHm3yGBpo1!u~=$y9)Y{N|INH(>w( zCh7kuJiHa#b3%uoIrncp-{?pCWSrr|zAELHa4-AUR{8>DrvSkeAeaIyX2KcZaN0Yx z-#aX3IfgzM|NN)m1^gMZ^rsm_E&a*VAd*!ml6^RmcmV(a000000002sYi@kh-gP&1 SW`F?n+#&pJ|B`n{+tq|Gad(LKx&MFfd68k> zN@iU_1_Y?kSUM%>N_yde&|0SVPeg0KTC<+`GClR;ypxJ)tTRd_E`K?^jv+Ld`96r2 zENsi0TjvsUMg2q1KJJ;zuF4AvBozK8Thq zY|EQl=Mr;8{X@?_?wQNv%lb!0KmvOOmz2)xce>Zxszx!@6tIg-va!D88U+Rn5 zyh;>R*B$mc^1Jki@k1-6YsM?ndam@BnVS`F?0s*(-n^`c@2Ss@`178Jbj6K~ij|I|L!UEucr(SzJy5&O=zU6x<5KlktXPs|8E+r8v_*1Pd7 S^YeoSAVE)8KbLh*2~7a45SvT@ delta 470 zcmV;{0V)3D0`LQnB!9O_L_t(|ob8%XZo?oDL}}HVaQ`E5mwq521O$WadUxvgz7oet z&@2q>Bq0C*000000KADW>j7+#Qrfyd#`s4gxsh+{0lXawV2peLVvG`2^NAnp0i37S zJwM*vBs?I$0@M*+0rh;>bs^ybWQz2P{u9(KNL~FPy#jPM-hUe50%U6US1g9M1^okr zS3sWc>P947fQ+v687#;c3IG7`Uflg8IXu-|$=d4EszclzL;KFwt#-HIt^kF8DKz=> zFpmC|QJ3r9%IUWNnMT?ESFrq2N@@5~eZ^rsuqbGmF2=w zj|IrgEoJ^jiGR7Dac4ng+BVy1Ht~8dt)KR940002+PHfW9+YgJATxgi?t;9;t zV9*Clbh-G+D{b(wzcc)6g?%H|bY8s{Lv`lW+Rcs(F^eMle7HmiP0n+|9~RSyVK4nK z1_fBmIOpo@3fH)tpS;M%g37+vR diff --git a/tests_zemu/snapshots/st-2-spend-2-out/00006.png b/tests_zemu/snapshots/st-2-spend-2-out/00006.png index a72927492aeaf44dedc947ec73f6ad012d4916a8..233235560377c29666ec33668f600e14d951756a 100644 GIT binary patch literal 18633 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

uZoSX zu94ydq(CBLm}VI=3{l&-;&1Ly+@(Z#wv6|hO0%AWMB~3d%%ww5)w>nf420NnA@HAQ zY|*66^z@kF^Cw0HSu9%0iCAhmgTH|#D#@@ZdV2Q?4s}0ktw>T>hV191eh83c$k#(4 zFDc!%P>xxv%*NLWIB{0=ltNF*I+OjHYWC{s| zTpqm10ors!q}ur($j}NaKuq;%?%8j%LT8?+O&)q~awkCz4B)MOPhvN>U6m)@rB?DC zmu~|!CSh^EfRKH6r~a_#BQNbgfg)m=Pl1tNU#D*=_izsirsZUxM=OO5z1E-nrJu;E zp!K{QL=^hVJc68WW%)Q5BXLty8Mf5XM3lMiO@@7LQNBFd z*XSA%4m4E+Et^1UOc@FYNK_QG#`G=e6u&ZVfp~|MlN5(dt+${@hHxkXY4EZ+T|zIE z2#mDz$x`jsrMXw1obt$=QeYvU1%f`8Te{EXSSYr;B&kKH}$&+GOg@!fw-(fV7k2ni!-V}I*zNo@ibxr-NO;Nlf)fbo?VPBoFajU|C=h#4yA`IZNMpl7JTF3k%!xq`6Pb^)Np7mbB&@ z5}^j&Pi4cuZ`iY)vm+W%Ps;_V1=t9KcHB!(!7( zTz0z-J(IpQ9yCwxy{nfcqD|zyEd8q$d4{?FWnKbpt>F}?6n$U*`EEiv(8_?l@Q1P@ z#d)Waa|`Qu49O-xgTqQKsh$=vgJ5C~!^Hea17qn5T63(~c)!{1dpjUH6>dC#1!!YG zec{X;wOT$A9Eec_-PoZC)A0_T`nDxD#&dlT{ZR=XtP4}fN1qxcv6_lcXwDb>7WGjz z!rV0KQ;vDy=@Rz2X|b*rSt88{aqTZhM7NnBE=XpLfkM$5#iLHr|M9xvpU9~mZ5pM! znIEAO)UhR==kPf*SPM_I|(_7(u&H}-xf0tmkF$FraI%;)OM{@EoZ3oP|n)OCTOUS>RI^n)kr*he`Ty~%4AO*HOG!>z0yra_`so?qEZZmr=C<{m6et4M{){t z9C-v0$LeTD<|p9Kfpr(#qd+J+hm0btss%%N{NE#PAKgJl-K4DXY5Sj@Z~-ItFrLf< z4|Wy)4AR)^xHm-E;Xl3_t9K|Cy?!^vOuQ0)9MbD#DbgX}bi9a7@jByja`vFWF1R($ zxy@wt{?I-=W-IH0EGf=#{NubeTqVNoUnB0rhOGjW)>aup`^8vCa%;@Yyq#mK8>GxG zZ6>|Pwm?Be&4&50`9pPxArA946Vc@QH@GWtrU>@zos_rM-^)n|?_i?ICO__}WaWYH zq3Fj6g}>AQmi2LLdM-DpZ=q?nH@1>&_~f!hZBD7rYOI0#?K9OtIz_EpcR3*%W9=Ti zaTDFL5o&UQuD@#b(p`V60HCWYJtG;fr{2s%Nt(pU6=|`8Nio?S7Hhaz-$i<7?AvB? zer=rkqi3#rqIaw{q|nf7a{EI%PlLs&*R^FP|9*vdmGE1Cl~odEqGmx?PQCl+(}?5u zP}0Si?;&j5;ZxIoQrZ5i2Q>TKoj_ZbG1-+G5gSh`(XbhZZnqRV-x$SD@Q&@4V0lsX z{2RG{$7=2``QGqrEYA8lN3kRz)yr65eU?lZvHz-S z<^*^U<}-Efzj~f)jg&mPXVI1UZLUS;VXPx_YRl|@!+Vem9X0`gVR1=GE~{j=21B}7I;tPl+3p6D%lH5^e#Ezz2S7A2iY$meaUZ9APyliJZRp(FBI zs&~tvX9K-k#K_>KBQ5SA`biYLV9ZpIe~1v z;HaubmLCVsDQWzkDCbjf{%|ffv3wPU6{a`8wlA>S_M7!$OL{~+@1SnZ+d9CKMOYdr z0MlQW?Bf&|!L|*r?o_=m7kpk>G9Wea!P^OS4W9I;JNdQOq z3y&V+p-DraNqiCM6et((`y!i#`a>XjvF@+8q1hI!B{2V*u{&!w2}z!bIA22azx~OZ zEau1TL#HSgo((_jbJ=>qAnc;QJy7&{rWwc)1tRnLNK&nn)arL3VphK>3izc;Cm~t{ zgx${KnGA8^G3$+LC}LJHtI*}Nxe9v->&ri;vhAT@UZ2nJ^&Q)ypCPI!M4Xj}Ui(?w zPPV=fiko=z`sTb22oy6I+wnbOZyP>$C$7o8UFPgB*B=JQF4M96n(6ubt`zkqGIy+B z;I(7LE^TL?IRW1%wM}mCBD05VaTEw4K+fjDQUjjkMYJ@LT#!w^PyjFO`)Uh+ieAq7 zQ#o52ALPU3O%acRh!#}52q*PcQlbSXIW%vKh_n3i9fm&Ub|>oGXv351=~?yja)d+w z$WVCr2E6zj$CGWb@a+?6)R1XOY+qB@4dPSq-W z;`Q%mDv~(XcJ9QUjutJ%-b$P}EeGPpA9qM&N?k)|S&g?3ntyw?02Q~pNB0|hbf@}a zxD@wQi*%G+YmDa5Iz7w6^wOTn&wfi;>O}x`0(>ef`3vNJ>uD>WoR>tawW{7Dkx3gj zmzQ60Wm5=8(6=(QvK~6SCSJNyy(p`tqPUbWO)&n}y@5dEwDS9in6S^C4~UBsr0}x* zd{{++a9pe}5VE~!uIU_7QK2N98YW-Y0roMU87_`Ze9s6+YSjyv)U3p^Z2Rx;6o^Ns z{hZlY9naF{q(UjdcWkMQ(_O08Ce;+^QM2W_ocVZ9$x!*tZ2D3m92RbTRW*skJGHru znYe)ic_NixCUWbFcvzI4h&7VOS!d$}vL0F_&^1GUEg|X(_~)HfxL7`L{chr0s(ZK$ zV8y?ORQu2MvQshx3yoFXQn`QITr3%i@CtzuO4un|D8}q%$4#Z%reQSY74{$uX8$!#3DiJ}s)rK?#W?eBT^ zEUfD+;&`cat>CR$fJpA?Zu{-yLdzB;>Sf(*zom%j0Rgf`c@_Xo)3oW2OP^&r1zW4m z9_XIOYQ&b~`<}?ZCFs!ToL^tOQkqkMA-=LJYs0s1zG-A*xe0UA(+^nRhkn|dW0l-a zt?HBmn4z7cqDv)LWbl0dFW=;<5s@yiewNq{k$Y}dqZ!Hq7_95!d?*iee& zK3cCP7jPRRWuE%E4hdPK$}Ztgirdlq&WHz`RbPJ8y-U|=_SoaBCN7g>v1Gc57Z^o0 zSIn+d$k;jDoRW9Hp*^bLk;t`416ZZXlN6xZ)te$S8&jmtuK+G{8!36^X1x~~#xa%j zwB>Z@N%j}~my>_IC3lZ{-~aKWo49_(;+|bxv1ZL2eFv`)BsZ#j{bWxD9YMVwR3LYf z0)JZYL#dAMA7YdLbKzf#@|Yqz=vmq9!S;;UteQS|%G(ut*{Ngb8l}E?^q_odQ~CM4 zsA;-w?$P`0zM!k8&5r8vbZ)o{-zk<$&&y`GQWQ@mU$3NsO-yLnva!NTMw@AL$a^d z+mM(wz2T4vaqA24X1vWy1b)b?rOca#5;X-p8k5E2E15*c-`(`Xlr@%HJ|2AY=`b! zY)td(qx%{0#Bra{UL9jWWrM5s6pT0nc=>G@?~Az(cW>6H+~R|)OTT)DK|3s(lQo9P4;64*QIzr0q)CTo&IqU_RlS%@ z&4|Dwcl!N908grvK^!PIP`uZ1pbKO39&6zxU{}sf52wIhXX{FF@8?eZQ{k}KT(Ma1 z-)53~;$_@m&2*Td{T`?fzo+tuC?MWIUM_JGymy_m!Eb%K?-_H71Brd?uUtR(8jPbo zRb@^E)T}p8s-EaJc>T_>y~}g#GC6N~SY+i}KxyahXN~=IECpsbMhodl!^od}uxft| zv)W|6!~M;r9CQ{EGvB(%-j!9*Z3pA4wn-BYJrx?Y7kydf?RI-}W8`OQP&%Zi{`c6{ zt7DZv1=rt9*^8n9e?h`a{b^-NSQ@NwFL!&^;tNSm2s<$19qCf33j%`S>TRGnKbw4g z8*qPh#S-2vu-mi1+(iI%GUZ7^T9R`~I*by)GU)yFb9m&<&lFvAcF9 z(`|>m*N7`wLvH)C+?ZPr!%*Eak5#z%1+^%$NI`2?yGKGW?B-kaF~Qk(7bO6ZjL1V*Yb&mdoT&8-;y>>iF;&jyorFHgag_j2hhW@ ziL8yc#&RT3NUuYID!%Y7`iGgQDUA1b=+AEWCyoZbJj;|Q^3B>pUV_#0*D)hFb-N#~ zVx|23nPpupfi!WTQRS=;_fRm2it4#SgPqR4jyRIWqs^qWWaCtP)xi9*eikwANN31d zy(r#d74LWZO6%Ww3uVhxe@T4Bz0~XY`XO`zrD0aFVwi1KzyddYNJX2^q}+I(0>NWy zK&&8CWAC#a%yl-lz|7|b7~F?DbA41cEcw`8_|LS*GcN!s4UbDspkOaGsW~9se`o9i zV|^;?5;~J>)^_VU#Jl^f1&Dz-Gr;_BGtp*bR?|txj~g&_s{sqWgSn}oOBLj`X7LQx z^tyx%Gd$1!guazmVTVL#Zjljb8J~Cwhn7-U+bAZBHn^1&$IQhmcF6d|vmeICQ=u>sk!pw!K|M((oaf(20>ZIusstkmPaRGdfs12GqsH84sOAL0|g>wk`Mct znEsZY)<0VPPg6gdg7tUOs=Uwfj*>as)F2|Vr#swiNX`b!A?j^VrI{l?ohqOaOSMUp zU)A^dnoUJ=g?IHpp@f;bSu_>Pt7?&9Hgm1COaG$dWXAZQtD6k9krvKpV@Pm>z>y5*z?%7c5^A6M~HR#TLv z|JYze&1yh4UQYRVc^;Va2JpzMiv_NG=zQK$C}=-QPL9s4o;z~JeZ?eY4dcDhv3IU8 zlu~^~d4r++)$o(b&{LTu?%lB>A}zrwTfPv<@Hkhy?}hK{>W%iB+f6C~h%8d>sDt|K zpp{Sp8$PUQwAJ!y0w66GJzaQHZ$#3Iw|pvw2HKDCvp?25;1ADpB7vP$W?-7O@?tRGFfMK8Z^1G|n4;^ZrQSqaG^$;ksoX7?s zO&wXa$v$>UhFSqc->ce!^wi{!eH{-3fmFSN>TsBJrpQ~wbM#ytuEN8I^pd0b<7bnD z>#RO2ld=&m4+5=z3pJuAIeH7{ZQo+y(9{YPS{&8yr4(^UEk_Tq<*PYYVyuP%Wv_dn zQ-%;|(?qA6^!S(Paw>UN?rUPH0^W}!2=pD@n99#Xrp^SfzR*1eYs1av-79x6o+@a?KZ(jW zMP`t&6{WuEPN`KR3EH<{b{Ed<+X-!y=S^2$Po^g<#OA^;>ZM)f;~ zkzVggN=PQLCY~#&PUJ0#znfyQD<}0v*Bpom%p~mE38}Nzd5b*@Hi^8c9kW|I`jpla z2vPb_lPHF%ay-E7(MpdN)z!RuG+|{#y;#TPfvXjvrWTK;YSqFiUgTEky~4e|c$+^E z2r~?i*51(LJ4#(Itx5Erxzx1h(U*LD6JD2_c4`t~o+cMTgf*xU?|L{Srpd*Otf(t6 zt8*w7x=iI5;3#lp9;vRxUXn8=P>NCXwbdsqShz!77Jmo(iIeT>GfHviF1u-fkgF~? z`?zmHJP>@l;79hBWjuPgg$*X8HWIwA&8$xb?rwI4LvIqCHxTJkJ)MrKGT(3=%v}6VpPJ6xxN_j{z(Y|Sp+vI!+=T&<@41V)n zwbWQ;2l_G`Wluobn3l7_c%QZl;0s=x84cMfE$`Z{Rs`>--kB260 zPjML~kMu4r8T5#5N{iFG-;nQaybLEHe#THS!r;$Pt;tnKsAZw6MpV9B6W-ggRoOvB z7s*foVUQl+?UTy88C2Le4UQksc+ zMpo8aXS?m5{4hth%F3}@3-(xpI=aJONBz}AmZOKake3Z`j=CC@>N&-UGXh#$JBRbg z*D_H4pmYNj7mC$)#vV3{aL-GXv*$2_w8DXU^QwDK+&^c id^e1_r7A>A`6B8tA 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 literal 11290 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 diff --git a/tests_zemu/snapshots/st-2-spend-2-out/00008.png b/tests_zemu/snapshots/st-2-spend-2-out/00008.png index cd2f52759f160c3e2cf6822395ea675b8c84a851..6d1b10a3f195a9bd1118fff1189fce55d93b5611 100644 GIT binary patch literal 10838 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 delta 353 zcmV-n0iOQ<2Kxe#BYy!xNkl}SA{Ar&-{=RE0Z{L??0>17J7aLK-c(B~cTHw9 z1JoFpGkNzn_G^IZe02jerx{n5>z^=~0ePw^ds}W9^DpKlt#u+#HR?I#MYVZXdjtRg zfOV+t;HtYrv$LQxRt?ryeXLIwdY(zHQ&89+ z{ohbMVRglI3R-&3f9CN%1H$7;@MrvVwX+Q^|Gnv4yUIcbE%DRPg*Agr^rxwWn&?l) z7+4|;Sz;ZwM0f!J0000000000000000Dxh>!Cm)L-+juU00000NkvXXu0mjfx?G>F diff --git a/tests_zemu/snapshots/x-2-spend-2-out/00017.png b/tests_zemu/snapshots/x-2-spend-2-out/00017.png index 1ef49baae7efd0519feef4aa9231a01174c6c573..1868aeb579ae502049da5cde07d52f0e1569f909 100644 GIT binary patch delta 466 zcmV;@0WJQf0_y{iBYy$1NklPJc`Wwv<2BF%eBM9U#Vax)L{s%-piw+)6Fow?uU_T2#*oVKYE~)Anl5RLcX; zd#Nek0OzBpf1T(2t~72}#64z}8BZRz3#x7A4r?z_RxC?ycO!bW(HB0^M0t_dPyKfK zH7Bh|uTb0Uu73~mULhS2@+1I&_X;}=eahLkwpVdVbRkQ$tUun^4Xrq=f z-Vx9|>N&1Qu-#4kd*&ad;-Xf?3?dEz#m((8*VsG*#8E`!xtMdF@$^h^`vSGI19U2H z7Xd%}eWFhG`$Yaj=8=xX&B*?CavQqrm7M)ztwdLGN=uyoo^SjJ-=uf@g7^m2B$NGR zj8v2T#pr{bScP`FNiuyf73l>4000000000000000005@>1Ho06gXS91r1ROJXnmVL}+g^mCe`%sF3( z2_d%>&}{<%fa!jsC-9V7YkyfviJHm3yGBpo1!u~=$y9)Y{N|INH(>w( zCh7kuJiHa#b3%uoIrncp-{?pCWSrr|zAELHa4-AUR{8>DrvSkeAeaIyX2KcZaN0Yx z-#aX3IfgzM|NN)m1^gMZ^rsm_E&a*VAd*!ml6^RmcmV(a000000002sYi@kh-gP&1 SW`Fr1ROJXnmVL}+g^mCe`%sF3( z2_d%>&}{<%fa!jsC-9V7YkyfviJHm3yGBpo1!u~=$y9)Y{N|INH(>w( zCh7kuJiHa#b3%uoIrncp-{?pCWSrr|zAELHa4-AUR{8>DrvSkeAeaIyX2KcZaN0Yx z-#aX3IfgzM|NN)m1^gMZ^rsm_E&a*VAd*!ml6^RmcmV(a000000002sYi@kh-gP&1 SW`F?n+#&pJ|B`n{+tq|Gad(LKx&MFfd68k> zN@iU_1_Y?kSUM%>N_yde&|0SVPeg0KTC<+`GClR;ypxJ)tTRd_E`K?^jv+Ld`96r2 zENsi0TjvsUMg2q1KJJ;zuF4AvBozK8Thq zY|EQl=Mr;8{X@?_?wQNv%lb!0KmvOOmz2)xce>Zxszx!@6tIg-va!D88U+Rn5 zyh;>R*B$mc^1Jki@k1-6YsM?ndam@BnVS`F?0s*(-n^`c@2Ss@`178Jbj6K~ij|I|L!UEucr(SzJy5&O=zU6x<5KlktXPs|8E+r8v_*1Pd7 S^YeoSAVE)8KbLh*2~7Z}@S8{g delta 466 zcmV;@0WJRH0_+2jB!9C>L_t(|ob8%huEQV(bkRsoIZUp6|LYBwPTaNU!KWi@F7=tG`IE0NstZMt`^fM(zHJ#n85(A3%5o z*nC$vBH;oUy3!k1kTVnj0N}ZV`$=+msyULi)u+{fggb`zoo!g{P9a!zClTop5RBbxX>|teM*>$S_grXmc2R4zJz! zjYsbDXufU<$2E1?ll_mOC$hVrU_pE*!jTaG000000055i4=XwL?6X|pnE(I)07*qo IM6N<$f?VX_v;Y7A

GI6`cQsc#Jx*c0)Jpk8;CxZLe4J;y}y5#+g($SN|z3 zK*oIjrgIV(_X0686z*E=;kfU>Zg$f|B3x3Y}v_n-cW3uj?#y;XAV9a1OojPZD4}u*TUa4cpMH{%J>J&SCwvf;t-NB#HIyWcYF3r!ajKPH=bD(t}h0ap6+j*bpDq3rql{R}Ein(|SlzsUAy{ zN%A|#@4qL7Al}L@zMkOvWt)odYfUeGd#BEnV1zvQltCyHl*3tIfVaOw3wd!K<74dK zFA;;dy`hB{KIdj9BcQq-re$e#VJa2uWZtRxJ|R+Xl++krRy;2PX%L-j&B~!L(uIG;)jbNvzlg}Ef>3KS7_;(jgeTegCh z3_n-k++}5`MR;OWk*ydp(i%S6&SBVjq zqqd?S@77dmJ_ic5!*^-=g{KRw;rOhwtT#J>B(^(Qm#5Oer<(qJXMF%OX-( zLhHLd=;F@2gC_wKc1;+x~6!KxnYVoe*ad zQCg<hcMnfIAvP;ZtC{RC6ui=w5lr6xmgImQ{FptNA%BENr# z5PkcuXdzJ>gbZ0;Ugvn z+is@Z(hC3{ATee%PxW_UVN2~T%q=Ke0j_c|?E&G{{!IO+1`zMh#+Rkb6ul39T_XmO z6!fa9NMqjKI~bx!zI+Qfn(S8}_H7V(J3ho<4W`Ak2cb!`V6;C)73i6HGPUw$J5bw> z7u7XDZYEe?H7_5a>Kn?+ifqRr4hh{GZ|t1X9i}LA$^^D)NP>M01D5@a$G?b*N91WT zT58G!nBxZh=jI9d)4iu1GrtNe8vSkTk9xzTgX&*xq3??$Q#}2&KeezzcYsJpkN!q! zVe(H}5age)4#>Q|ktG~S8zZiSE4((-w*a^7-cJhxIpdNdn|PG_WkvuBKIrLtg2++m z4naLG=&UBvlvWAH5f_ASeZO;V;1QW>yrn^d?`+w1Iw&Z+Pny6!3j;{_85KuiyXXg@ z`^)&CE7K*bDZmysTp2>yA#dKv4%Rv_DPN531A@GfO-I>^`F+I8$WY*AT%CE#psM_2 zSWYh&SO0x$b-&Xtt;m*fyH5o2agD6|QH%u=X7nMRtF+ASpW>#aN-)BF0+^X~Y>?4h^L_XI>x2sml<`XyP4ScEGG3Qhf{Sl(=EDE)pBZB2DwdO2lic+O^3G*!^!t;0bz! z+MDfl2|xoXrfc|btKLguVIFeX{co?`rN+pvWkx0w2Cx~zPyQQawiQwX==+VUzba_X zXcyX|zTT@xP=gNZ&RI)#FZM~DEp^oxX?Ff?eBF>q*rHl)lphrM6p+y-xX73xY7SC= z|Ca(+q4*;>CM%7yT#M(-wmo4hTP}9G|WNRi)(NFt2+~ksT>Ji1E%$Fx~KZ zc)@Aa86jQ>ssL1OiqN-#P=HF-+jVyamLLb203wW28i62UDG|3u4bW@3Fm1KRqLF-MZd7~8aC)pDJ+|4jilWeo$uKmzMPb}v{ z&(^m4UNF^TAy-+6!OQ)|!AV8ir$>@@80An}Ew#=A{Pb)b(AZt=n!lGN|2@dr9l=+K zSn;aWql}EDXiox8R{lxFCvB2IO23nu9=kZI^xlIY;BEL*ckmXjcu_Tl!J3U6o6nd> zfrEBhJ1wBOdI6YJ2_S3TT3T%g{@d5=^Z%_tWu{WnfBNIFbz`OFzjtcX)hdeNEu;a3 z9~O&#dj8&3oS}LYg`kd`Ysf6(Zvtk=RAfyZT4<95DSCIVU7lcNFyq~V_VHZmIy;wH zJn#vT{Y$x=kuSh=BvY}f{2;293<&||O(+tO_lz5p!Bj_SOv)%_VaSBch@+=d)VhsD*7^!I)+NwV|6U=@mAB{p ze`P&_*Y==<_cHcCGtd?AD~h-}SiEA_Kw`Mnx%wcS=I;pYNJi6-X|v~_3l9T z4p4R9mq*vuf`vp~wiAftxDl9hfNhmh`S^ocN9QMHy5JShw~EzFKhMJAGfq}e8qbknOwrbzCS@XVz40GR+XNxGLE{)`O#u~DS-l2lS3mLF7CZuk!gwu=HUU%<*p8<$dey7yRija@n1s z)A3=@=`qDsyS&5--xgZ6#7Ss?3=4Gn=<5f~oUjwIT5!wq0Wk185iVKnIX9qOrmP|I zN9ATHtLb?Wf?h;-ts^pyQK*q2BY{L^cm(tG#7o7R`9++_ryE)~jbZ#hNUHiobw|12h35K`mYMS-E`NETcT8R>#~&j85M3LEAQXjvrw;9Xaxu0Lzr9@sOSR@( zrjB?@KA041{%TVEPVmWVq8K#!G5A2K~6E&4pKc8uXDhJrp^^6s6KmuU{N}=Q^W~JhBxNa9+IScfQ5;I8cUF~kO zavdOvyuXBIlgEVB*0tf60|?f>FSd-e-$@=k4q{)OFDct`mm>eK&yadU!2lWC zXOV@O*yf620Yn+PDvEi?kN-92IY}bdtv>)4E{B?+q%98CEfJ%nMQp`q z5&C)oRry$nw?_1yWa%9)^A~?Vi|r$}GhUW1@GZ+HRwBZW-}BHl2O!~Paa2hdNe!CR z>D8uBvS%f`jP^_iFeYU!w1@EFeiOV{RE1?{GpfDYmK;tGAcG-G17G#<3m;{!K*4`6 zA5DETNMA4{rx>OzrvK6*mZvQ&+cs@ZUBG<@^oR=|q=*Ob^LNSbR!GchT3&w3jj-2sG9C`7RK={QwWg zi}0mfm!RlA{H-4}G>DA~_T#+u^TKZz{zn?uUCI9Qmvvybzd$iN<8?8Y>HyGCHYXdg zqK~S&yt;Z7Ur<&C6zP6%UA<(}fA`&m%Rnn0;{%K=R z1LToQ1YFHKt*FpxGr4yHd%n<6X%i7o86UXev(!-eBoWZc1FF+Abzy3A8y-HiYbt*F z=!akFxhoNQkGyv?5O~jUgA02B;o-+aGLfkJXAYlgmkdz>U-)adySioZ%faePE_a8^ z%f@?+N(s~%I0}fLD-?ey?t1cv?Ysyq@u5*kiw`^daJ)=G_ZPS}dAaG^rWPlYJ(4#r74kd5DKt2tm9|_&Ml0PF#MfDHDYY&U= ztXHv486plg(+>9}AnSgn?r}r-MMq~5-pHl;-Q^04(LllqAlh#lDFcfApL!c23sr*a zZh_Yc`&cpooz}X}kNb2C%icuo=uX}o)ZM)~IVoJ|{)GpD0_`tazWx3MwrOa@hBk8J zI`BR-2YS?NK>UFdyFSi)(@F*P$v=%Vgx*q_1v*cG-WAkQubsVthoF?fx&)j#a=&xi zouf@<;wu<^#R|{^Cwta$KKqZzpwr~tY;VJ*-h3^wW4(BNZneIDdj9na#HK%=lS}e* z4874+tZrM&uS&((;cz^)RB3}??|!7>1Skpb^+R$m+1z_-PzQL~g?4G7p@UsZ<8ps8 zkB3$&KRv(~WRozqdTPFOdgOh$)L!yi#I5uE^7Mb5t7GT32f9%Th2o{VyuM6f?0a24 zb${eP0JSwhL~wnM4V%xzK9;zK|65WKR`(S%mujt1Dd_jNisy*1P6~B@^^f&9?5;X9 z+VzfT@`^3d!h0VI=aVyK<7hPFxqymLD@^aScKFwe0TOs>?`tZnS9p8Nm4 zTyog9H~@sH(4=<&A4=9q4zBp~d{j_bwiBCcqOK&!^EYcaHwD{=mLE=B%Jx!HQEu zOf)s-jLqOAF9Mz6JgbS}K|e{0>oscuIS{z%E8}J2eq;EPa8D-ee)lbb>ib1#WT@{w R;6DX`RFz&UR=qF{{y+Zv?8^WE diff --git a/tests_zemu/snapshots/st-1-tr-in-1-spend-2-sh-out/00008.png b/tests_zemu/snapshots/st-1-tr-in-1-spend-2-sh-out/00008.png index 6d1b10a3f195a9bd1118fff1189fce55d93b5611..cd2f52759f160c3e2cf6822395ea675b8c84a851 100644 GIT binary patch literal 5467 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 N002ovPDHLkV1iEA_)7o) delta 18751 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