diff --git a/README.md b/README.md index 1a8eda8..e19a38b 100644 --- a/README.md +++ b/README.md @@ -32,6 +32,7 @@ Latest released version available [here][bios-pw] and latest testing version (*s * [asyncritius](https://github.com/A-syncritus) — for major contribution to dell generator * [dogbert](https://github.com/dogbert) — researched most of generators present here * hpgl — for dell generator +* [let-def](https://github.com/let-def) — for Acer Insyde 10 digit [build-status]: https://api.travis-ci.org/bacher09/pwgen-for-bios.svg?branch=master [travis]: https://travis-ci.org/bacher09/pwgen-for-bios diff --git a/package-lock.json b/package-lock.json index 6b7d860..b49ca7d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -25,19 +25,19 @@ } }, "@babel/core": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.10.1.tgz", - "integrity": "sha512-u8XiZ6sMXW/gPmoP5ijonSUln4unazG291X0XAQ5h0s8qnAFr6BRRZGUEK+jtRWdmB0NTJQt7Uga25q8GetIIg==", + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.10.2.tgz", + "integrity": "sha512-KQmV9yguEjQsXqyOUGKjS4+3K8/DlOCE2pZcq4augdQmtTy5iv5EHtmMSJ7V4c1BIPjuwtZYqYLCq9Ga+hGBRQ==", "dev": true, "requires": { "@babel/code-frame": "^7.10.1", - "@babel/generator": "^7.10.1", + "@babel/generator": "^7.10.2", "@babel/helper-module-transforms": "^7.10.1", "@babel/helpers": "^7.10.1", - "@babel/parser": "^7.10.1", + "@babel/parser": "^7.10.2", "@babel/template": "^7.10.1", "@babel/traverse": "^7.10.1", - "@babel/types": "^7.10.1", + "@babel/types": "^7.10.2", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.1", @@ -95,12 +95,12 @@ } }, "@babel/generator": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.1.tgz", - "integrity": "sha512-AT0YPLQw9DI21tliuJIdplVfLHya6mcGa8ctkv7n4Qv+hYacJrKmNWIteAK1P9iyLikFIAkwqJ7HAOqIDLFfgA==", + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.2.tgz", + "integrity": "sha512-AxfBNHNu99DTMvlUPlt1h2+Hn7knPpH5ayJ8OqDWSeLld+Fi2AYBTC/IejWDM9Edcii4UzZRCsbUt0WlSDsDsA==", "dev": true, "requires": { - "@babel/types": "^7.10.1", + "@babel/types": "^7.10.2", "jsesc": "^2.5.1", "lodash": "^4.17.13", "source-map": "^0.5.0" @@ -126,9 +126,9 @@ } }, "@babel/helper-compilation-targets": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.10.1.tgz", - "integrity": "sha512-YuF8IrgSmX/+MV2plPkjEnzlC2wf+gaok8ehMNN0jodF3/sejZauExqpEVGbJua62oaWoNYIXwz4RmAsVcGyHw==", + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.10.2.tgz", + "integrity": "sha512-hYgOhF4To2UTB4LTaZepN/4Pl9LD4gfbJx8A34mqoluT8TLbof1mhUlYuNWTEebONa8+UlCC4X0TEXu7AOUyGA==", "dev": true, "requires": { "@babel/compat-data": "^7.10.1", @@ -139,9 +139,9 @@ } }, "@babel/helper-create-class-features-plugin": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.1.tgz", - "integrity": "sha512-bwhdehBJZt84HuPUcP1HaTLuc/EywVS8rc3FgsEPDcivg+DCW+SHuLHVkYOmcBA1ZfI+Z/oZjQc/+bPmIO7uAA==", + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.2.tgz", + "integrity": "sha512-5C/QhkGFh1vqcziq1vAL6SI9ymzUp8BCYjFpvYVhWP4DlATIb3u5q3iUd35mvlyGs8fO7hckkW7i0tmH+5+bvQ==", "dev": true, "requires": { "@babel/helper-function-name": "^7.10.1", @@ -355,9 +355,9 @@ } }, "@babel/parser": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.1.tgz", - "integrity": "sha512-AUTksaz3FqugBkbTZ1i+lDLG5qy8hIzCaAxEtttU6C0BtZZU9pkNZtWSVAht4EW9kl46YBiyTGMp9xTTGqViNg==", + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.2.tgz", + "integrity": "sha512-PApSXlNMJyB4JiGVhCOlzKIif+TKFTvu0aQAhnTvfP/z3vVSN6ZypH5bfUNwFXXjRQtUEBNFd2PtmCmG2Py3qQ==", "dev": true }, "@babel/plugin-proposal-async-generator-functions": { @@ -878,13 +878,13 @@ } }, "@babel/preset-env": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.10.1.tgz", - "integrity": "sha512-bGWNfjfXRLnqbN2T4lB3pMfoic8dkRrmHpVZamSFHzGy5xklyHTobZ28TVUD2grhE5WDnu67tBj8oslIhkiOMQ==", + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.10.2.tgz", + "integrity": "sha512-MjqhX0RZaEgK/KueRzh+3yPSk30oqDKJ5HP5tqTSB1e2gzGS3PLy7K0BIpnp78+0anFuSwOeuCf1zZO7RzRvEA==", "dev": true, "requires": { "@babel/compat-data": "^7.10.1", - "@babel/helper-compilation-targets": "^7.10.1", + "@babel/helper-compilation-targets": "^7.10.2", "@babel/helper-module-imports": "^7.10.1", "@babel/helper-plugin-utils": "^7.10.1", "@babel/plugin-proposal-async-generator-functions": "^7.10.1", @@ -941,7 +941,7 @@ "@babel/plugin-transform-unicode-escapes": "^7.10.1", "@babel/plugin-transform-unicode-regex": "^7.10.1", "@babel/preset-modules": "^0.1.3", - "@babel/types": "^7.10.1", + "@babel/types": "^7.10.2", "browserslist": "^4.12.0", "core-js-compat": "^3.6.2", "invariant": "^2.2.2", @@ -963,9 +963,9 @@ } }, "@babel/runtime": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.10.1.tgz", - "integrity": "sha512-nQbbCbQc9u/rpg1XCxoMYQTbSMVZjCDxErQ1ClCn9Pvcmv1lGads19ep0a2VsEiIJeHqjZley6EQGEC3Yo1xMA==", + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.10.2.tgz", + "integrity": "sha512-6sF3uQw2ivImfVIl62RZ7MXhO2tap69WeWK57vAaimT6AZbE4FbqjdEJIN1UqoD6wI6B+1n9UiagafH1sxjOtg==", "dev": true, "requires": { "regenerator-runtime": "^0.13.4" @@ -1059,9 +1059,9 @@ } }, "@babel/types": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.1.tgz", - "integrity": "sha512-L2yqUOpf3tzlW9GVuipgLEcZxnO+96SzR6fjXMuxxNkIgFJ5+07mHCZ+HkHqaeZu8+3LKnNJJ1bKbjBETQAsrA==", + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.2.tgz", + "integrity": "sha512-AD3AwWBSz0AWF0AkCN9VPiWrvldXq+/e3cHa4J89vo4ymjz1XwrBFFVZmkJTsQIPNk+ZVomPSXUJqq8yyjZsng==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.10.1", @@ -1130,6 +1130,23 @@ "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==", "dev": true }, + "@npmcli/move-file": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.0.1.tgz", + "integrity": "sha512-Uv6h1sT+0DrblvIrolFtbvM1FgWm+/sy4B3pvLp67Zys+thcukzS5ekn7HsZFGpWP4Q3fYJCljbWQE/XivMRLw==", + "dev": true, + "requires": { + "mkdirp": "^1.0.4" + }, + "dependencies": { + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + } + } + }, "@types/anymatch": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/@types/anymatch/-/anymatch-1.3.1.tgz", @@ -1165,6 +1182,12 @@ "integrity": "sha512-3F8qpwBAiVc5+HPJeXJpbrl+XjawGmciN5LgiO7Gv1pl1RHtjoMNqZpqEksaPJW05ViKe8snYInRs6xB25Xdew==", "dev": true }, + "@types/json-schema": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.4.tgz", + "integrity": "sha512-8+KAKzEvSUdeo+kmqnKrqgeE+LcA0tjYWFY7RPProVYwnqDjukzO+3b6dLD56rYX5TdWejnEOLJYOIeh4CXKuA==", + "dev": true + }, "@types/minimatch": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", @@ -1447,14 +1470,6 @@ "requires": { "clean-stack": "^2.0.0", "indent-string": "^4.0.0" - }, - "dependencies": { - "indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true - } } }, "ajv": { @@ -2386,9 +2401,9 @@ "dev": true }, "caniuse-lite": { - "version": "1.0.30001066", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001066.tgz", - "integrity": "sha512-Gfj/WAastBtfxLws0RCh2sDbTK/8rJuSeZMecrSkNGYxPcv7EzblmDGfWQCFEQcSqYE2BRgQiJh8HOD07N5hIw==", + "version": "1.0.30001078", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001078.tgz", + "integrity": "sha512-sF12qXe9VMm32IEf/+NDvmTpwJaaU7N1igpiH2FdI4DyABJSsOqG3ZAcFvszLkoLoo1y6VJLMYivukUAxaMASw==", "dev": true }, "caseless": { @@ -3205,14 +3220,6 @@ "dev": true, "requires": { "strip-bom": "^4.0.0" - }, - "dependencies": { - "strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true - } } }, "define-properties": { @@ -3469,9 +3476,9 @@ "dev": true }, "electron-to-chromium": { - "version": "1.3.453", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.453.tgz", - "integrity": "sha512-IQbCfjJR0NDDn/+vojTlq7fPSREcALtF8M1n01gw7nQghCtfFYrJ2dfhsp8APr8bANoFC8vRTFVXMOGpT0eetw==", + "version": "1.3.462", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.462.tgz", + "integrity": "sha512-HST/xWLOeA0LGUhxBqvcPDDUGHjB6rn99VBgPWmaHv+zqwXgOaZO5RnRcd5owjRE7nh+z1c0SwcK8qP8o7sofg==", "dev": true }, "elliptic": { @@ -4946,6 +4953,12 @@ "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", "dev": true }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true + }, "indexof": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", @@ -5425,12 +5438,6 @@ "supports-color": "^7.1.0" }, "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, "make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", @@ -5572,9 +5579,9 @@ } }, "jsbi": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/jsbi/-/jsbi-3.1.2.tgz", - "integrity": "sha512-5nDXo1X9QVaXK/Cpb5VECV9ss1QPbjUuk1qSruHB1PK/g39Sd414K4nci99ElFDZv0vzxDEnKn3o49/Tn9Yagw==" + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/jsbi/-/jsbi-3.1.3.tgz", + "integrity": "sha512-nBJqA0C6Qns+ZxurbEoIR56wyjiUszpNy70FHvxO5ervMoCbZVE3z3kxr5nKGhlxr/9MhKTSUBs7cAwwuf3g9w==" }, "jsbn": { "version": "0.1.1", @@ -6159,6 +6166,23 @@ "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=", "dev": true }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + }, + "dependencies": { + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + } + } + }, "make-dir": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", @@ -6355,14 +6379,6 @@ "dev": true, "requires": { "yallist": "^4.0.0" - }, - "dependencies": { - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } } }, "minipass-collect": { @@ -6400,14 +6416,6 @@ "requires": { "minipass": "^3.0.0", "yallist": "^4.0.0" - }, - "dependencies": { - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } } }, "mississippi": { @@ -6481,23 +6489,6 @@ "run-queue": "^1.0.3" } }, - "move-file": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/move-file/-/move-file-2.0.0.tgz", - "integrity": "sha512-cdkdhNCgbP5dvS4tlGxZbD+nloio9GIimP57EjqFhwLcMjnU+XJKAZzlmg/TN/AK1LuNAdTSvm3CPPP4Xkv0iQ==", - "dev": true, - "requires": { - "path-exists": "^4.0.0" - }, - "dependencies": { - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - } - } - }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -6628,9 +6619,9 @@ } }, "node-releases": { - "version": "1.1.57", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.57.tgz", - "integrity": "sha512-ZQmnWS7adi61A9JsllJ2gdj2PauElcjnOwTp2O011iGzoakTxUsDGSe+6vD7wXbKdqhSFymC0OSx35aAMhrSdw==", + "version": "1.1.58", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.58.tgz", + "integrity": "sha512-NxBudgVKiRh/2aPWMgPR7bPTX0VPmGx5QBwCtdHitnqFE5/O8DeBXuIMH1nwNnw/aMo6AjOrpsHzfY3UbUJ7yg==", "dev": true }, "normalize-path": { @@ -6658,9 +6649,9 @@ } }, "nyc": { - "version": "15.0.1", - "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.0.1.tgz", - "integrity": "sha512-n0MBXYBYRqa67IVt62qW1r/d9UH/Qtr7SF1w/nQLJ9KxvWF6b2xCHImRAixHN9tnMMYHC2P14uo6KddNGwMgGg==", + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz", + "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==", "dev": true, "requires": { "@istanbuljs/load-nyc-config": "^1.0.0", @@ -6671,6 +6662,7 @@ "find-cache-dir": "^3.2.0", "find-up": "^4.1.0", "foreground-child": "^2.0.0", + "get-package-type": "^0.1.0", "glob": "^7.1.6", "istanbul-lib-coverage": "^3.0.0", "istanbul-lib-hook": "^3.0.0", @@ -6733,15 +6725,6 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - } - }, "emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -7742,9 +7725,9 @@ } }, "regenerate": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", - "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.1.tgz", + "integrity": "sha512-j2+C8+NtXQgEKWk49MMP5P/u2GhnahTtVkRIHr5R5lVRlbKvmQ+oS+A5aLKWp2ma5VkT8sh6v+v4hbH0YHR66A==", "dev": true }, "regenerate-unicode-properties": { @@ -9299,6 +9282,12 @@ "ansi-regex": "^2.0.0" } }, + "strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true + }, "strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", @@ -9353,12 +9342,6 @@ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "dev": true - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true } } }, @@ -9408,17 +9391,17 @@ } }, "terser-webpack-plugin": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-3.0.2.tgz", - "integrity": "sha512-QeBHLJzKJHCnrPNlZj5EmOF6wwvzpVGDHvTrySIH8+jZEXfcKKCiriRmF6945rKzuZDnkOEU/LDv7qtPiiyP/Q==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-3.0.3.tgz", + "integrity": "sha512-bZFnotuIKq5Rqzrs+qIwFzGdKdffV9epG5vDSEbYzvKAhPeR5RbbrQysfPgbIIMhNAQtZD2hGwBfSKUXjXZZZw==", "dev": true, "requires": { - "cacache": "^15.0.3", + "cacache": "^15.0.4", "find-cache-dir": "^3.3.1", "jest-worker": "^26.0.0", "p-limit": "^2.3.0", "schema-utils": "^2.6.6", - "serialize-javascript": "^3.0.0", + "serialize-javascript": "^3.1.0", "source-map": "^0.6.1", "terser": "^4.6.13", "webpack-sources": "^1.4.3" @@ -9437,11 +9420,12 @@ } }, "cacache": { - "version": "15.0.3", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.0.3.tgz", - "integrity": "sha512-bc3jKYjqv7k4pWh7I/ixIjfcjPul4V4jme/WbjvwGS5LzoPL/GzXr4C5EgPNLO/QEZl9Oi61iGitYEdwcrwLCQ==", + "version": "15.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.0.4.tgz", + "integrity": "sha512-YlnKQqTbD/6iyoJvEY3KJftjrdBYroCbxxYXzhOzsFLWlp6KX4BOlEf4mTx0cMUfVaTS3ENL2QtDWeRYoGLkkw==", "dev": true, "requires": { + "@npmcli/move-file": "^1.0.1", "chownr": "^2.0.0", "fs-minipass": "^2.0.0", "glob": "^7.1.4", @@ -9452,7 +9436,6 @@ "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.2", "mkdirp": "^1.0.3", - "move-file": "^2.0.0", "p-map": "^4.0.0", "promise-inflight": "^1.0.1", "rimraf": "^3.0.2", @@ -9503,15 +9486,6 @@ "p-locate": "^4.1.0" } }, - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "requires": { - "yallist": "^3.0.2" - } - }, "make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", @@ -9579,12 +9553,13 @@ } }, "schema-utils": { - "version": "2.6.6", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.6.tgz", - "integrity": "sha512-wHutF/WPSbIi9x6ctjGGk2Hvl0VOz5l3EKEuKbjPlB30mKZUzb9A5k9yEXRX3pwyqVLPvpfZZEllaFq/M718hA==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", + "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", "dev": true, "requires": { - "ajv": "^6.12.0", + "@types/json-schema": "^7.0.4", + "ajv": "^6.12.2", "ajv-keywords": "^3.4.1" } }, @@ -9617,12 +9592,6 @@ "requires": { "minipass": "^3.1.1" } - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true } } }, @@ -9964,9 +9933,9 @@ } }, "typescript": { - "version": "3.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.3.tgz", - "integrity": "sha512-D/wqnB2xzNFIcoBG9FG8cXRDjiqSTbG2wd8DMZeQyJlP1vfTkIxH4GKveWaEBYySKIg+USu+E+EDIR47SqnaMQ==", + "version": "3.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.5.tgz", + "integrity": "sha512-hSAifV3k+i6lEoCJ2k6R2Z/rp/H3+8sdmcn5NrS3/3kE7+RyZXm9aqvxWqjEXHAd8b0pShatpcdMTvEdvAJltQ==", "dev": true }, "ua-parser-js": { @@ -11001,6 +10970,12 @@ "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", "dev": true }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "yargs": { "version": "13.2.4", "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.2.4.tgz", diff --git a/package.json b/package.json index 05fcae0..9d95c7a 100644 --- a/package.json +++ b/package.json @@ -5,11 +5,11 @@ "main": "src/ui.ts", "browserlist": "> 0.25%, not dead", "dependencies": { - "jsbi": "^3.1.2" + "jsbi": "^3.1.3" }, "devDependencies": { - "@babel/core": "^7.10.1", - "@babel/preset-env": "^7.10.1", + "@babel/core": "^7.10.2", + "@babel/preset-env": "^7.10.2", "@types/jasmine": "^3.5.10", "babel-loader": "^8.1.0", "clean-webpack-plugin": "^3.0.0", @@ -25,19 +25,19 @@ "karma-sauce-launcher": "^1.2.0", "karma-sourcemap-loader": "^0.3.7", "karma-webpack": "^4.0.2", - "nyc": "^15.0.1", - "terser-webpack-plugin": "^3.0.2", + "nyc": "^15.1.0", + "terser-webpack-plugin": "^3.0.3", "ts-loader": "^6.2.2", "ts-node": "^8.10.2", "tslint": "^5.20.1", - "typescript": "^3.9.3", + "typescript": "^3.9.5", "webpack": "^4.43.0", "webpack-cli": "^3.3.11", "webpack-dev-server": "^3.11.0" }, "scripts": { "test": "ts-node ./node_modules/jasmine/bin/jasmine --config=jasmine.json", - "lint": "tslint src/*.ts", + "lint": "tslint src/**/*.ts", "cover": "nyc -r text -e .ts -x '**/*.spec.ts' npm test", "send-coverage": "nyc report --reporter=text-lcov | coveralls", "all": "npm test && npm run lint && npm run cover && npm run browser-test", diff --git a/src/keygen/index.ts b/src/keygen/index.ts index 7e2adc8..0198fea 100644 --- a/src/keygen/index.ts +++ b/src/keygen/index.ts @@ -3,7 +3,7 @@ import { asusSolver } from "./asus"; import { dellHddSolver, dellSolver, hddOldSolver } from "./dell"; import { fsi20DecNewSolver, fsi20DecOldSolver, fsi24DecSolver, fsiHexSolver } from "./fsi"; import { hpMiniSolver } from "./hpmini"; -import { insydeSolver } from "./insyde"; +import { acerInsyde10Solver, insydeSolver } from "./insyde"; import { phoenixFsiLSolver, phoenixFsiPSolver, phoenixFsiSolver, phoenixFsiSSolver, phoenixFsiXSolver, phoenixHPCompaqSolver, phoenixSolver @@ -17,6 +17,7 @@ export type KeygenResult = [Solver, string[], number]; export const solvers: Solver[] = [ asusSolver, + acerInsyde10Solver, sonySolver, sony4x4Solver, samsungSolver, diff --git a/src/keygen/insyde.spec.ts b/src/keygen/insyde.spec.ts index d5b0481..6ab06d4 100644 --- a/src/keygen/insyde.spec.ts +++ b/src/keygen/insyde.spec.ts @@ -1,4 +1,5 @@ import { insydeSolver } from "./insyde"; +import { acerInsyde10Solver, AES128, Crc64, Sha256 } from "./insyde"; describe("Insyde BIOS", () => { it("Insyde key for 03133610 is 12891236", () => { @@ -13,3 +14,64 @@ describe("Insyde BIOS", () => { expect(insydeSolver("1234567")).toEqual([]); }); }); + +describe("Acer Insyde 10 BIOS", () => { + it("Check Acer solver", () => { + expect(acerInsyde10Solver("0173549286")).toEqual(["e0eac38fdfcfd74a"]); + expect(acerInsyde10Solver("1014206418")).toEqual(["3c0a50907bc2c604"]); + expect(acerInsyde10Solver("1765418418")).toEqual(["5f54e355b83e969c"]); + expect(acerInsyde10Solver("1858408509")).toEqual(["c4791532114cfbab"]); + expect(acerInsyde10Solver("1925715998")).toEqual(["f21cce78c0987233"]); + expect(acerInsyde10Solver("2051611322")).toEqual(["1c648cb56e8a64bb"]); + expect(acerInsyde10Solver("2036529205")).toEqual(["f2e874332b6f50b1"]); + expect(acerInsyde10Solver("1768688657")).toEqual(["80774329818c3312"]); + expect(acerInsyde10Solver("1746144265")).toEqual(["c3d46da5f6f3c75b"]); + expect(acerInsyde10Solver("1611926546")).toEqual(["f61c86479a8a6b20"]); + expect(acerInsyde10Solver("1355047683")).toEqual(["7fe913d78ffc5ed1"]); + expect(acerInsyde10Solver("1373072054")).toEqual(["aebeae5c425684cd"]); + expect(acerInsyde10Solver("1373899792")).toEqual(["a26970a4ffb62d49"]); + expect(acerInsyde10Solver("1395185025")).toEqual(["a763280d9f7396ec"]); + }); +}); + +describe("Utils", () => { + it("sha256", () => { + expect(new Sha256([]).hexdigest()) + .toEqual("e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"); + + expect(new Sha256([1]).hexdigest()) + .toEqual("4bf5122f344554c53bde2ebb8cd2b7e3d1600ad631c385a5d7cce23c7785459a"); + + expect(new Sha256([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]).hexdigest()) + .toEqual("c848e1013f9f04a9d63fa43ce7fd4af035152c7c669a4a404b67107cee5f2e4e"); + + expect(new Sha256("test".split("").map((v) => v.charCodeAt(0))).hexdigest()) + .toEqual("9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08"); + + expect(new Sha256("0".repeat(256).split("").map((v) => v.charCodeAt(0))).hexdigest()) + .toEqual("67f022195ee405142968ca1b53ae2513a8bab0404d70577785316fa95218e8ba"); + + expect(new Sha256("0".repeat(56).split("").map((v) => v.charCodeAt(0))).hexdigest()) + .toEqual("bd03ac1428f0ea86f4b83a731ffc7967bb82866d8545322f888d2f6e857ffc18"); + }); + it("AES128", () => { + const numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]; + const myaes = new AES128(numbers); + expect(myaes.encryptBlock(numbers)) + .toEqual([52, 195, 59, 127, 20, 253, 83, 220, 234, 37, 224, 26, 2, 225, 103, 39]); + + expect(myaes.encryptBlock("123456789abcdefg".split("").map((v) => v.charCodeAt(0)))) + .toEqual([111, 52, 225, 193, 98, 40, 19, 168, 122, 34, 93, 3, 146, 166, 202, 100]); + }); + it("crc64", () => { + let mycrc = new Crc64(Crc64.ECMA_POLYNOMIAL); + mycrc.update([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]); + expect(mycrc.hexdigest()).toEqual("335a089168033fbe"); + mycrc.reset(); + mycrc.update([0x80]); + expect(mycrc.hexdigest()).toEqual("c96c5795d7870f42"); + mycrc.reset(); + mycrc.update([0xde, 0xad, 0xbe, 0xef]); + expect(mycrc.hexdigest()).toEqual("fc232c18806871af"); + }); +}); diff --git a/src/keygen/insyde.ts b/src/keygen/insyde.ts index 8bec931..03afb9c 100644 --- a/src/keygen/insyde.ts +++ b/src/keygen/insyde.ts @@ -1,8 +1,537 @@ +/* tslint:disable:no-bitwise */ +/* tslint:disable:no-var-requires */ /* Maybe need fixing for browsers where numbers is 32-bits */ /* Some Acer, HP laptops. 8 digit */ +import type JSBIT from "jsbi"; import { makeSolver } from "./utils"; +const JSBI = require("jsbi"); +type JSBI = JSBIT; + +export class Crc64 { + private static tableCache: {[key: string]: JSBI[]} = {}; + // ECMA 182 0xC96C5795D7870F42 + public static readonly ECMA_POLYNOMIAL = JSBI.BigInt("14514072000185962306"); + + private table: JSBI[]; + private crc: JSBI; + public readonly polynom: JSBI; + + constructor(poly: JSBI, table?: JSBI[]) { + this.polynom = poly; + if (table && Array.isArray(table)) { + this.table = table; + } else { + this.table = Crc64.getCRC64Table(poly); + } + this.crc = JSBI.BigInt(0); + } + + public reset() { + this.crc = JSBI.BigInt(0); + } + + public update(input: number[]) { + for (let b of input) { + const index = JSBI.toNumber(JSBI.asUintN(8, JSBI.bitwiseXor(this.crc, JSBI.BigInt(b)))); + const temp = JSBI.bitwiseXor(this.table[index], JSBI.signedRightShift(this.crc, JSBI.BigInt(8))); + this.crc = JSBI.asUintN(64, temp); + } + } + + public digest(): JSBI { + return this.crc; + } + + public hexdigest(): string { + return this.digest().toString(16); + } + private static makeTable(poly: JSBI): JSBI[] { + let table: JSBI[] = []; + for (let i = 0; i < 256; i++) { + let crc: JSBI = JSBI.BigInt(i); + for (let j = 0; j < 8; j++) { + if (JSBI.EQ(JSBI.bitwiseAnd(crc, JSBI.BigInt(1)), 1)) { + crc = JSBI.bitwiseXor(JSBI.signedRightShift(crc, JSBI.BigInt(1)), poly); + } else { + crc = JSBI.signedRightShift(crc, JSBI.BigInt(1)); + } + } + table.push(JSBI.asUintN(64, crc)); + } + return table; + } + private static getCRC64Table(poly: JSBI) { + const key = poly.toString(10); + const val = Crc64.tableCache[key]; + if (val !== undefined && Array.isArray(val)) { + return val; + } else { + const table = Crc64.makeTable(poly); + // save only ECMA table + if (JSBI.EQ(poly, Crc64.ECMA_POLYNOMIAL)) { + Crc64.tableCache[key] = table; + } + return table; + } + } +} + +/* tslint:disable:no-shadowed-variable */ +export class Sha256 { + private static readonly SHA256_CONSTANTS: number[] = [ + 0x428A2F98, 0x71374491, 0xB5C0FBCF, 0xE9B5DBA5, + 0x3956C25B, 0x59F111F1, 0x923F82A4, 0xAB1C5ED5, + 0xD807AA98, 0x12835B01, 0x243185BE, 0x550C7DC3, + 0x72BE5D74, 0x80DEB1FE, 0x9BDC06A7, 0xC19BF174, + 0xE49B69C1, 0xEFBE4786, 0x0FC19DC6, 0x240CA1CC, + 0x2DE92C6F, 0x4A7484AA, 0x5CB0A9DC, 0x76F988DA, + 0x983E5152, 0xA831C66D, 0xB00327C8, 0xBF597FC7, + 0xC6E00BF3, 0xD5A79147, 0x06CA6351, 0x14292967, + 0x27B70A85, 0x2E1B2138, 0x4D2C6DFC, 0x53380D13, + 0x650A7354, 0x766A0ABB, 0x81C2C92E, 0x92722C85, + 0xA2BFE8A1, 0xA81A664B, 0xC24B8B70, 0xC76C51A3, + 0xD192E819, 0xD6990624, 0xF40E3585, 0x106AA070, + 0x19A4C116, 0x1E376C08, 0x2748774C, 0x34B0BCB5, + 0x391C0CB3, 0x4ED8AA4A, 0x5B9CCA4F, 0x682E6FF3, + 0x748F82EE, 0x78A5636F, 0x84C87814, 0x8CC70208, + 0x90BEFFFA, 0xA4506CEB, 0xBEF9A3F7, 0xC67178F2 + ]; + + private static readonly SHA256_IV: number[] = [ + 0x6A09E667, 0xBB67AE85, 0x3C6EF372, 0xA54FF53A, + 0x510E527F, 0x9B05688C, 0x1F83D9AB, 0x5BE0CD19 + ]; + + private state: number[]; + private data: number[]; + private bitlen: JSBI; + private datalen: number; + + constructor(input?: number[]) { + this.bitlen = JSBI.BigInt(0); + this.datalen = 0; + this.data = new Array(64); + this.state = Sha256.SHA256_IV.slice(); + + if (input && Array.isArray(input)) { + this.update(input); + } + } + + private transform() { + // Maybe Uint8Array ? + let m: number[] = new Array(64); + + function ROTRIGHT(a: number, b: number): number { + return (a >>> b) | (a << (32 - b)); + } + function CH(a: number, b: number, c: number): number { + return (a & b) ^ (~a & c); + } + function MAJ(a: number, b: number, c: number): number { + return (a & b) ^ (a & c) ^ (b & c); + } + function EP0(a: number) { + return ROTRIGHT(a, 2) ^ ROTRIGHT(a, 13) ^ ROTRIGHT(a, 22); + } + function EP1(a: number) { + return ROTRIGHT(a, 6) ^ ROTRIGHT(a, 11) ^ ROTRIGHT(a, 25); + } + function SIG0(a: number): number { + return ROTRIGHT(a, 7) ^ ROTRIGHT(a, 18) ^ (a >>> 3); + } + function SIG1(a: number): number { + return ROTRIGHT(a, 17) ^ ROTRIGHT(a, 19) ^ (a >>> 10); + } + for (let i = 0, j = 0; i < 16; i++, j += 4) { + m[i] = (this.data[j] << 24) | (this.data[j + 1] << 16) | (this.data[j + 2] << 8) | + (this.data[j + 3]); + } + for (let i = 16; i < 64; i++) { + m[i] = (SIG1(m[i - 2]) + m[i - 7] + SIG0(m[i - 15]) + m[i - 16]) >>> 0; + } + let [a, b, c, d, e, f, g, h] = this.state; + for (let i = 0; i < 64; i++) { + const t1 = h + EP1(e) + CH(e, f, g) + Sha256.SHA256_CONSTANTS[i] + m[i]; + const t2 = EP0(a) + MAJ(a, b, c); + h = g; + g = f; + f = e; + e = (d + t1) >>> 0; + d = c; + c = b; + b = a; + a = (t1 + t2) >>> 0; + } + this.state[0] += a; + this.state[1] += b; + this.state[2] += c; + this.state[3] += d; + this.state[4] += e; + this.state[5] += f; + this.state[6] += g; + this.state[7] += h; + + this.state.forEach((val, index) => { + this.state[index] = val >>> 0; + }); + } + + private final(): number[] { + let i = this.datalen & 63; + if (this.datalen < 56) { + this.data[i++] = 0x80; + while (i < 56) { + this.data[i++] = 0; + } + } else { + this.data[i++] = 0x80; + while (i < 64) { + this.data[i++] = 0; + } + this.transform(); + for (let i = 0; i < 56; i++) { + this.data[i] = 0; + } + } + this.bitlen = JSBI.add(this.bitlen, JSBI.BigInt(this.datalen * 8)); + for (let i = 63, j = 0; i >= 56; i--, j += 8) { + // val = (this.bitlen >> j) & 0xFF + const val = JSBI.asUintN(8, JSBI.signedRightShift(this.bitlen, JSBI.BigInt(j))); + this.data[i] = JSBI.toNumber(val); + } + this.transform(); + let hash: number[] = new Array(32); + for (let i = 0; i < 4; i++) { + for (let j = 0; j < 8; j++) { + hash[i + j * 4] = (this.state[j] >>> (24 - i * 8)) & 0xFF; + } + } + return hash; + } + + private copy(): Sha256 { + let item = new Sha256(); + item.state = this.state.slice(); + item.data = this.data.slice(); + item.bitlen = this.bitlen; + item.datalen = this.datalen; + return item; + } + + public update(input: number[]) { + for (let b of input) { + this.data[this.datalen] = b; + this.datalen++; + + if (this.datalen >= 64) { + this.transform(); + this.bitlen = JSBI.add(this.bitlen, JSBI.BigInt(512)); + this.datalen = 0; + } + } + } + + public digest(): number[] { + let item = this.copy(); + return item.final(); + } + + public hexdigest() { + return this.digest().map((x) => { + x = x & 0xFF; + return (x < 0xf) ? "0" + x.toString(16) : x.toString(16); + }).join(""); + } +} + +export class AES128 { + // AES128 ECB mode + private static readonly NB = 4; + private static readonly NK = 4; + private static readonly NR = 10; + + private static readonly sbox: number[] = [ + 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76, + 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, + 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, + 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75, + 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, + 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, + 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8, + 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, + 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, + 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb, + 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, + 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, + 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a, + 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, + 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, + 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16 + ]; + + private static readonly rcon: number[] = [ + 0x8D, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1B, 0x36, 0x6C, 0xD8, 0xAB, 0x4D, 0x9A + ]; + + private roundKey: number[]; + + constructor(key: number[]) { + this.roundKey = AES128.keyExpansion(key); + } + + public encryptBlock(input: number[]): number[] { + if (input.length !== 16) { + throw new Error("Invalid block length"); + } + let state = input.slice(); + AES128.addRoundKey(0, state, this.roundKey); + for (let round = 1; ; round++) { + AES128.subBytes(state); + AES128.shiftRows(state); + if (round === 10) { + break; + } + AES128.mixColumns(state); + AES128.addRoundKey(round, state, this.roundKey); + } + AES128.addRoundKey(AES128.NR, state, this.roundKey); + return state; + } + + private static keyExpansion(key: number[]): number[] { + if (key.length !== 16) { + throw new Error("Key should be 16 bytes"); + } + + let roundKey = new Array(176); + // first round key is the key itself + for (let i = 0; i < AES128.NK * 4; i++) { + roundKey[i] = key[i]; + } + let temp: number[] = new Array(4); + // all other round keys generated from previous ones + for (let i = AES128.NK; i < AES128.NB * (AES128.NR + 1); i++) { + const k = (i - 1) * 4; + temp[0] = roundKey[k + 0]; + temp[1] = roundKey[k + 1]; + temp[2] = roundKey[k + 2]; + temp[3] = roundKey[k + 3]; + + if (i % AES128.NK === 0) { + // AES RotWord() + { + const first = temp[0]; + temp[0] = temp[1]; + temp[1] = temp[2]; + temp[2] = temp[3]; + temp[3] = first; + } + // AES SubWord() + { + temp[0] = AES128.sbox[temp[0]]; + temp[1] = AES128.sbox[temp[1]]; + temp[2] = AES128.sbox[temp[2]]; + temp[3] = AES128.sbox[temp[3]]; + } + + temp[0] ^= AES128.rcon[i / AES128.NK]; + } + { + const j = i * 4; + const k = (i - AES128.NK) * 4; + roundKey[j + 0] = roundKey[k + 0] ^ temp[0]; + roundKey[j + 1] = roundKey[k + 1] ^ temp[1]; + roundKey[j + 2] = roundKey[k + 2] ^ temp[2]; + roundKey[j + 3] = roundKey[k + 3] ^ temp[3]; + } + } + return roundKey; + } + + private static addRoundKey(round: number, state: number[], roundKey: number[]) { + for (let i = 0; i < 4; i++) { + for (let j = 0; j < 4; j++) { + state[i * 4 + j] ^= roundKey[(round * AES128.NB * 4) + (i * AES128.NB) + j]; + state[i * 4 + j] &= 0xFF; + } + } + } + + private static subBytes(state: number[]) { + for (let i = 0; i < 4; i++) { + for (let j = 0; j < 4; j++) { + state[j * 4 + i] = AES128.sbox[state[j * 4 + i]]; + } + } + } + + private static shiftRows(state: number[]) { + // rotate first row 1 columns to left + let temp: number = state[0 * 4 + 1]; + state[0 * 4 + 1] = state[1 * 4 + 1]; + state[1 * 4 + 1] = state[2 * 4 + 1]; + state[2 * 4 + 1] = state[3 * 4 + 1]; + state[3 * 4 + 1] = temp; + // rotate second row 2 columns to left + temp = state[0 * 4 + 2]; + state[0 * 4 + 2] = state[2 * 4 + 2]; + state[2 * 4 + 2] = temp; + temp = state[1 * 4 + 2]; + state[1 * 4 + 2] = state[3 * 4 + 2]; + state[3 * 4 + 2] = temp; + // rotate thirdd row 3 columns to left + temp = state[0 * 4 + 3]; + state[0 * 4 + 3] = state[3 * 4 + 3]; + state[3 * 4 + 3] = state[2 * 4 + 3]; + state[2 * 4 + 3] = state[1 * 4 + 3]; + state[1 * 4 + 3] = temp; + } + + private static mixColumns(state: number[]) { + let tmp1: number; + let tmp2: number; + + function xtime(x: number): number { + return (x << 1) ^ (((x >>> 7) & 1) * 0x1B); + } + + for (let i = 0; i < 4; i++) { + const t = state[i * 4 + 0]; + tmp1 = state[i * 4 + 0] ^ state[i * 4 + 1] ^ state[i * 4 + 2] ^ state[i * 4 + 3]; + tmp2 = xtime(state[i * 4 + 0] ^ state[i * 4 + 1]); + state[i * 4 + 0] ^= tmp2 ^ tmp1; + tmp2 = xtime(state[i * 4 + 1] ^ state[i * 4 + 2]); + state[i * 4 + 1] ^= tmp2 ^ tmp1; + tmp2 = xtime(state[i * 4 + 2] ^ state[i * 4 + 3]); + state[i * 4 + 2] ^= tmp2 ^ tmp1; + tmp2 = xtime(state[i * 4 + 3] ^ t); + state[i * 4 + 3] ^= tmp2 ^ tmp1; + } + } +} + +export function insydeAcerSwitch(arr: number[]): number[] { + if (arr.length !== 32) { + throw new Error("Input array should have 32 length"); + } + + function fun0(arr: number[]): number[] { + let output: number[] = []; + for (let i = 3; i >= 0; i--) { + for (let j = 0; j < 16; j += 4 ) { + output.push(arr[i + j]); + } + } + return output; + } + function fun1(arr: number[]): number[] { + let output: number[] = []; + for (let i = 0; i < 4; i++) { + for (let j = 12; j >= 0; j -= 4) { + output.push(arr[i + j]); + } + } + return output; + } + function fun2(arr: number[]): number[] { + let output: number[] = []; + for (let i = 0; i < 4; i++) { + for (let j = 0; j < 4; j++) { + output.push((arr[((j + i) & 3) + i * 4] + i) & 0xFF); + } + } + return output; + } + function fun3(arr: number[]): number[] { + let output: number[] = []; + let acc1 = 0; + let acc2 = 0; + for (let i = 0; i < 4; i++) { + acc1 ^= arr[i * 5]; + acc2 ^= arr[i * 3 + 3]; + } + for (let i = 0; i < 16; i++) { + const pivot = ((i & 1) === 0) ? acc1 : acc2; + output.push(arr[i] ^ pivot); + } + return output; + } + function fun4(arr: number[]): number[] { + let output: number[] = []; + for (let i = 0; i < 16; i++) { + const temp1 = arr[i]; + const temp2 = arr[(i + 1) & 0xF]; // arr[(i + 1) % 15]; + const pivot = (temp2 < temp1) ? temp2 : 0xFF; + output.push(temp1 ^ pivot); + } + return output; + } + function fun5(arr: number[]): number[] { + let output: number[] = new Array(16); + for (let i = 0; i < 4; i++) { + let acc: number = 0; + for (let j = 0; j < 16; j += 4) { + acc ^= arr[j + i]; + } + for (let j = 0; j < 16; j += 4) { + const temp = i + j; + output[temp] = (arr[temp] * acc) & 0xFF; + } + } + return output; + } + function keyProcess(arr: number[]): number[] { + let output: number[] = new Array(16); + for (let i = 0; i < 16; i++) { + let acc: number = 0; + for (let j = 0; j < 8; j++) { + acc += arr[((i >> 2) << 3) + j] * arr[j * 4 + (i & 3)]; + } + output[i] = acc & 0xFF; + } + return output; + } + + const temp = keyProcess(arr); + switch (arr[8] % 6) { + case 0: + return fun0(temp); + case 1: + return fun1(temp); + case 2: + return fun2(temp); + case 3: + return fun3(temp); + case 4: + return fun4(temp); + default: + return fun5(temp); + } +} + +// 10 digits acer key +export function acerInsydeKeygen(serial: string): string[] { + // TODO: Uint8Array + function rotatefun(arr: number[]): number[] { + const idx = arr[9] & 0xF; + let output: number[] = new Array(16); + for (let i = 0; i < output.length; i++) { + output[i] = arr[((idx * 2 + 1) * i) % arr.length]; + } + return output; + } + + const inputBytes: number[] = serial.split("").map((c) => c.charCodeAt(0)); + const digest = (new Sha256(inputBytes)).digest(); + const key = insydeAcerSwitch(digest); + const blockData = rotatefun(digest); + const data = (new AES128(key)).encryptBlock(blockData); + let crc = new Crc64(Crc64.ECMA_POLYNOMIAL); + crc.update(data); + return [crc.hexdigest()]; +} -/* tslint:disable:no-bitwise */ function insydeKeygen(serial: string): string[] { const salt = "Iou|hj&Z"; let password = ""; @@ -31,3 +560,11 @@ export let insydeSolver = makeSolver({ inputValidator: (s) => /^\d{8}$/i.test(s), fun: insydeKeygen }); + +export let acerInsyde10Solver = makeSolver({ + name: "acerInsyde10", + description: "Acer Insyde 10 digits", + examples: ["0173549286"], + inputValidator: (s) => /^\d{10}$/i.test(s), + fun: acerInsydeKeygen +}); diff --git a/src/keygen/sony_4x4.spec.ts b/src/keygen/sony_4x4.spec.ts index d012b91..905d4ca 100644 --- a/src/keygen/sony_4x4.spec.ts +++ b/src/keygen/sony_4x4.spec.ts @@ -1,3 +1,4 @@ +/* tslint:disable:no-var-requires */ const JSBI = require("jsbi"); import { modularPow, sony4x4Keygen, sony4x4Solver } from "./sony_4x4"; diff --git a/src/keygen/sony_4x4.ts b/src/keygen/sony_4x4.ts index 82afa19..7a7c1f0 100644 --- a/src/keygen/sony_4x4.ts +++ b/src/keygen/sony_4x4.ts @@ -1,5 +1,6 @@ // based on dogbert's pwgen-sony-4x4.py /* tslint:disable:no-bitwise */ +/* tslint:disable:no-var-requires */ import type JSBIT from "jsbi"; const JSBI = require("jsbi"); type JSBI = JSBIT;