diff --git a/Makefile b/Makefile index a1aa12d8e..0bb797c6c 100644 --- a/Makefile +++ b/Makefile @@ -189,7 +189,7 @@ testbuilds/$(name)$1.crx.zip : \ package.json version.json tools/zip-crx.js node_modules/jszip/package.json node tools/zip-crx.js $1 -testbuilds/$(name)$1.crx : testbuilds/$(name)$1.crx.zip package.json tools/sign.js node_modules/crx/package.json +testbuilds/$(name)$1.crx : testbuilds/$(name)$1.crx.zip package.json tools/sign.js node_modules/node-rsa/package.json node tools/sign.js $1 testbuilds/$(name)$1.meta.js : src/meta/metadata.js src/meta/icon48.png version.json $(template_deps) | testbuilds diff --git a/package.json b/package.json index 9548d0f9d..e06114f07 100644 --- a/package.json +++ b/package.json @@ -65,7 +65,6 @@ }, "devDependencies": { "coffee-script": "=1.9.3", - "crx": "=3.0.3", "esprima": "^3.1.3", "font-awesome": "=4.6.3", "jshint": "^2.9.4", @@ -73,6 +72,7 @@ "lodash.template": "^4.4.0", "markdown-it": "^8.2.2", "markdown-it-anchor": "^3.0.0", + "node-rsa": "^0.4.2", "request": "^2.79.0", "webstore-upload": "0.0.7" }, diff --git a/src/meta/npm-shrinkwrap.json b/src/meta/npm-shrinkwrap.json index f18d668de..b2f2637b9 100644 --- a/src/meta/npm-shrinkwrap.json +++ b/src/meta/npm-shrinkwrap.json @@ -6,232 +6,6 @@ "from": "coffee-script@1.9.3", "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.9.3.tgz" }, - "crx": { - "version": "3.0.3", - "from": "crx@3.0.3", - "resolved": "https://registry.npmjs.org/crx/-/crx-3.0.3.tgz", - "dependencies": { - "archiver": { - "version": "0.8.1", - "from": "archiver@>=0.8.0 <0.9.0", - "resolved": "https://registry.npmjs.org/archiver/-/archiver-0.8.1.tgz", - "dependencies": { - "buffer-crc32": { - "version": "0.2.13", - "from": "buffer-crc32@>=0.2.1 <0.3.0", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz" - }, - "readable-stream": { - "version": "1.0.34", - "from": "readable-stream@>=1.0.24 <1.1.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "dependencies": { - "core-util-is": { - "version": "1.0.2", - "from": "core-util-is@>=1.0.0 <1.1.0", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" - }, - "isarray": { - "version": "0.0.1", - "from": "isarray@0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" - }, - "string_decoder": { - "version": "0.10.31", - "from": "string_decoder@>=0.10.0 <0.11.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" - }, - "inherits": { - "version": "2.0.3", - "from": "inherits@>=2.0.1 <2.1.0", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" - } - } - }, - "zip-stream": { - "version": "0.3.7", - "from": "zip-stream@>=0.3.0 <0.4.0", - "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-0.3.7.tgz", - "dependencies": { - "crc32-stream": { - "version": "0.2.0", - "from": "crc32-stream@>=0.2.0 <0.3.0", - "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-0.2.0.tgz" - }, - "debug": { - "version": "1.0.4", - "from": "debug@>=1.0.2 <1.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-1.0.4.tgz", - "dependencies": { - "ms": { - "version": "0.6.2", - "from": "ms@0.6.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.6.2.tgz" - } - } - }, - "deflate-crc32-stream": { - "version": "0.1.2", - "from": "deflate-crc32-stream@>=0.1.0 <0.2.0", - "resolved": "https://registry.npmjs.org/deflate-crc32-stream/-/deflate-crc32-stream-0.1.2.tgz" - } - } - }, - "lazystream": { - "version": "0.1.0", - "from": "lazystream@>=0.1.0 <0.2.0", - "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-0.1.0.tgz" - }, - "file-utils": { - "version": "0.1.5", - "from": "file-utils@>=0.1.5 <0.2.0", - "resolved": "https://registry.npmjs.org/file-utils/-/file-utils-0.1.5.tgz", - "dependencies": { - "lodash": { - "version": "2.1.0", - "from": "lodash@>=2.1.0 <2.2.0", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.1.0.tgz" - }, - "iconv-lite": { - "version": "0.2.11", - "from": "iconv-lite@>=0.2.11 <0.3.0", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.2.11.tgz" - }, - "rimraf": { - "version": "2.2.8", - "from": "rimraf@>=2.2.2 <2.3.0", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz" - }, - "glob": { - "version": "3.2.11", - "from": "glob@>=3.2.6 <3.3.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz", - "dependencies": { - "inherits": { - "version": "2.0.3", - "from": "inherits@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" - }, - "minimatch": { - "version": "0.3.0", - "from": "minimatch@>=0.3.0 <0.4.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz", - "dependencies": { - "lru-cache": { - "version": "2.7.3", - "from": "lru-cache@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz" - }, - "sigmund": { - "version": "1.0.1", - "from": "sigmund@>=1.0.0 <1.1.0", - "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz" - } - } - } - } - }, - "minimatch": { - "version": "0.2.14", - "from": "minimatch@>=0.2.12 <0.3.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", - "dependencies": { - "lru-cache": { - "version": "2.7.3", - "from": "lru-cache@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz" - }, - "sigmund": { - "version": "1.0.1", - "from": "sigmund@>=1.0.0 <1.1.0", - "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz" - } - } - }, - "findup-sync": { - "version": "0.1.3", - "from": "findup-sync@>=0.1.2 <0.2.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.1.3.tgz", - "dependencies": { - "lodash": { - "version": "2.4.2", - "from": "lodash@>=2.4.1 <2.5.0", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz" - } - } - }, - "isbinaryfile": { - "version": "0.1.9", - "from": "isbinaryfile@>=0.1.9 <0.2.0", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-0.1.9.tgz" - } - } - }, - "lodash": { - "version": "2.4.2", - "from": "lodash@>=2.4.1 <2.5.0", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz" - } - } - }, - "commander": { - "version": "2.9.0", - "from": "commander@>=2.5.0 <3.0.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", - "dependencies": { - "graceful-readlink": { - "version": "1.0.1", - "from": "graceful-readlink@>=1.0.0", - "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz" - } - } - }, - "es6-promise": { - "version": "2.3.0", - "from": "es6-promise@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-2.3.0.tgz" - }, - "node-rsa": { - "version": "0.2.30", - "from": "node-rsa@>=0.2.10 <0.3.0", - "resolved": "https://registry.npmjs.org/node-rsa/-/node-rsa-0.2.30.tgz", - "dependencies": { - "asn1": { - "version": "0.2.3", - "from": "asn1@0.2.3", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz" - }, - "lodash": { - "version": "3.3.0", - "from": "lodash@3.3.0", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.3.0.tgz" - } - } - }, - "temp": { - "version": "0.8.3", - "from": "temp@>=0.8.1 <0.9.0", - "resolved": "https://registry.npmjs.org/temp/-/temp-0.8.3.tgz", - "dependencies": { - "os-tmpdir": { - "version": "1.0.2", - "from": "os-tmpdir@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz" - }, - "rimraf": { - "version": "2.2.8", - "from": "rimraf@>=2.2.6 <2.3.0", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz" - } - } - }, - "wrench": { - "version": "1.5.9", - "from": "wrench@>=1.5.0 <2.0.0", - "resolved": "https://registry.npmjs.org/wrench/-/wrench-1.5.9.tgz" - } - } - }, "esprima": { "version": "3.1.3", "from": "esprima@latest", @@ -570,6 +344,18 @@ } } }, + "node-rsa": { + "version": "0.4.2", + "from": "node-rsa@latest", + "resolved": "https://registry.npmjs.org/node-rsa/-/node-rsa-0.4.2.tgz", + "dependencies": { + "asn1": { + "version": "0.2.3", + "from": "asn1@0.2.3", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz" + } + } + }, "request": { "version": "2.79.0", "from": "request@latest", diff --git a/tools/sign.js b/tools/sign.js index 8db51e16a..8c09ed986 100644 --- a/tools/sign.js +++ b/tools/sign.js @@ -1,15 +1,24 @@ var fs = require('fs'); -var crx = require('crx'); +var crypto = require('crypto'); +var RSA = require('node-rsa'); var pkg = JSON.parse(fs.readFileSync('package.json', 'utf8')); var channel = process.argv[2] || ''; var privateKey = fs.readFileSync(`../${pkg.meta.path}.keys/${pkg.name}.pem`); var archive = fs.readFileSync(`testbuilds/${pkg.name}${channel}.crx.zip`); -var extension = new crx({privateKey, loaded: true}); -extension.pack(archive).then((data) => - fs.writeFileSync(`testbuilds/${pkg.name}${channel}.crx`, data) -).catch(function(err) { - console.error(err); - process.exit(1); -}); + +// https://developer.chrome.com/extensions/crx + +var publicKey = new RSA(privateKey).exportKey('pkcs8-public-der'); +var signature = crypto.createSign('sha1').update(archive).sign(privateKey); + +var header = Buffer.alloc(16); +header.write('Cr24'); +header.writeInt32LE(2, 4); +header.writeInt32LE(publicKey.length, 8); +header.writeInt32LE(signature.length, 12); + +var crx = Buffer.concat([header, publicKey, signature, archive]); + +fs.writeFileSync(`testbuilds/${pkg.name}${channel}.crx`, crx);