From d3a4753b79c84ffefde136b49e5944770047c964 Mon Sep 17 00:00:00 2001 From: Jonas Hermsmeier Date: Fri, 27 Apr 2018 21:49:43 +0200 Subject: [PATCH] feat(writer): Use xxHash instead of SHA512 for verification This switches from SHA512 to xxHash for verification hashing, as xxHash provides more throughput. Change-Type: patch --- lib/cli/etcher.js | 4 ++-- lib/gui/app/modules/image-writer.js | 2 +- lib/sdk/writer/checksum-stream.js | 12 +++++++++++- npm-shrinkwrap.json | 4 ++++ package.json | 1 + 5 files changed, 19 insertions(+), 4 deletions(-) diff --git a/lib/cli/etcher.js b/lib/cli/etcher.js index c9df30aa..5ce0d432 100644 --- a/lib/cli/etcher.js +++ b/lib/cli/etcher.js @@ -99,7 +99,7 @@ permissions.isElevated().then((elevated) => { const writer = new ImageWriter({ verify: options.check, unmountOnSuccess: options.unmount, - checksumAlgorithms: options.check ? [ 'sha512' ] : [] + checksumAlgorithms: options.check ? [ 'xxhash' ] : [] }) /** @@ -133,7 +133,7 @@ permissions.isElevated().then((elevated) => { exitCode = EXIT_CODES.GENERAL_ERROR console.log(` - ${result.device.device}: ${result.error.message}`) } else { - console.log(` - ${result.device.device}: ${result.checksum.sha512}`) + console.log(` - ${result.device.device}: ${result.checksum.xxhash}`) } }) } diff --git a/lib/gui/app/modules/image-writer.js b/lib/gui/app/modules/image-writer.js index 026012b8..e5825916 100644 --- a/lib/gui/app/modules/image-writer.js +++ b/lib/gui/app/modules/image-writer.js @@ -147,7 +147,7 @@ exports.performWrite = (image, drives, onProgress) => { destinations: drives, validateWriteOnSuccess: settings.get('validateWriteOnSuccess'), unmountOnSuccess: settings.get('unmountOnSuccess'), - checksumAlgorithms: [ 'sha512' ] + checksumAlgorithms: [ 'xxhash' ] }) }) diff --git a/lib/sdk/writer/checksum-stream.js b/lib/sdk/writer/checksum-stream.js index 68e33cee..634ada7c 100644 --- a/lib/sdk/writer/checksum-stream.js +++ b/lib/sdk/writer/checksum-stream.js @@ -18,6 +18,7 @@ const stream = require('readable-stream') const crypto = require('crypto') +const xxhash = require('xxhash') const _ = require('lodash') /** @@ -66,7 +67,16 @@ class ChecksumStream extends stream.Transform { * const hash = this._createHash(algorithm) */ _createHash (algorithm) { - const hash = _.attempt(crypto.createHash, algorithm) + let hash = null + + if (algorithm === 'xxhash') { + // Seed value 0x45544348 = ASCII "ETCH" + const seed = 0x45544348 + const is64Bit = process.arch === 'x64' || process.arch === 'aarch64' + hash = new xxhash.Stream(seed, is64Bit ? 64 : 32) + } else { + hash = _.attempt(crypto.createHash, algorithm) + } if (_.isError(hash)) { hash.message += ` "${algorithm}"` diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index c5f71ad3..9dff693c 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -9081,6 +9081,10 @@ "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", "dev": true }, + "xxhash": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/xxhash/-/xxhash-0.2.4.tgz" + }, "y18n": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz" diff --git a/package.json b/package.json index 7fa1f6df..cdaefa33 100644 --- a/package.json +++ b/package.json @@ -89,6 +89,7 @@ "uuid": "3.0.1", "winusb-driver-generator": "1.1.7", "xml2js": "0.4.17", + "xxhash": "0.2.4", "yargs": "11.0.0", "yauzl": "2.6.0" },