diff --git a/node/tenvoy.js b/node/tenvoy.js index 31f2d9b2..37ee010b 100644 --- a/node/tenvoy.js +++ b/node/tenvoy.js @@ -1,14 +1,12 @@ const openpgp = require('../openpgpjs/dist/openpgp.js'); const nacl = require('../tweetnacljs/nacl.js'); -const sjcl = require('../sjcl/sjcl.js'); const sha256 = require('../fast-sha256-js'); var TogaTech = {}; -function tEnvoy(openpgpRef = openpgp, naclRef = nacl, sjclRef = sjcl, sha256Ref = sha256) { +function tEnvoy(openpgpRef = openpgp, naclRef = nacl, sha256Ref = sha256) { let _openpgp = openpgpRef; let _nacl = naclRef; - let _sjcl = sjclRef; let _sha256 = sha256Ref; @@ -18,7 +16,7 @@ function tEnvoy(openpgpRef = openpgp, naclRef = nacl, sjclRef = sjcl, sha256Ref Object.defineProperty(this, "version", { get: () => { - return "v6.1.0"; + return "v7.0.0"; } }); @@ -34,11 +32,6 @@ function tEnvoy(openpgpRef = openpgp, naclRef = nacl, sjclRef = sjcl, sha256Ref return _nacl; } }); - Object.defineProperty(this.core, "sjcl", { - get: () => { - return _sjcl; - } - }); Object.defineProperty(this.core, "sha256", { get: () => { return _sha256; @@ -767,67 +760,6 @@ function tEnvoy(openpgpRef = openpgp, naclRef = nacl, sjclRef = sjcl, sha256Ref this.keyFactory = {}; - this.keyFactory.pbkdf2_legacy = (password, salt, rounds = 25000, size = 32 * 8) => { - if(password == null) { - throw "tEnvoy Fatal Error: argument password of method keyFactory.pbkdf2_legacy is required and does not have a default value."; - } - if(salt == null) { - throw "tEnvoy Fatal Error: argument salt of method keyFactory.pbkdf2_legacy is required and does not have a default value."; - } - if(rounds == null) { - rounds = 25000; - } - if(isNaN(parseInt(rounds))) { - rounds = 25000; - } else { - rounds = parseInt(rounds); - } - if(size == null) { - size = 32 * 8; - } - if(isNaN(parseInt(size))) { - size = 32 * 8; - } else { - size = parseInt(size); - } - return _sjcl.misc.pbkdf2(password, salt, rounds, size); - } - - this.keyFactory.pbkdf2hex_legacy = (password, salt, rounds = 25000, size = 32 * 8) => { - return new Promise(async (resolve, reject) => { - let seed = this.keyFactory.pbkdf2_legacy(password, salt, rounds, size); - let stringSeed = seed.join(","); - let shaSeed = await this.hash.sha512(stringSeed); - resolve(shaSeed); - }); - } - - this.keyFactory.genSeedFromCredentials_legacy = (username, password, rounds = 25000, size = 32) => { - return new Promise(async (resolve, reject) => { - if(username == null) { - reject("tEnvoy Fatal Error: argument username of method keyFactory.genSeedFromCredentials_legacy is required and does not have a default value."); - } - if(password == null) { - reject("tEnvoy Fatal Error: argument password of method keyFactory.genSeedFromCredentials_legacy is required and does not have a default value."); - } - if(size == null) { - size = 32; - } - if(isNaN(parseInt(size))) { - size = 32; - } else { - size = parseInt(size); - } - let shaSeed = await this.keyFactory.pbkdf2hex_legacy(password, username, rounds, 32 * 8); - while(shaSeed.length < size * 2) { - shaSeed += await this.hash.sha512(shaSeed); - } - let encoded = this.util.hexToBytes(shaSeed); - let sliced = encoded.slice(0, size); - resolve(sliced); - }); - } - this.keyFactory.pbkdf2 = (password, salt, rounds = 150000, size = 32) => { if(password == null) { throw "tEnvoy Fatal Error: argument password of method keyFactory.pbkdf2 is required and does not have a default value."; @@ -851,13 +783,10 @@ function tEnvoy(openpgpRef = openpgp, naclRef = nacl, sjclRef = sjcl, sha256Ref } else { size = parseInt(size); } + password = this.util.mixedToUint8Array(password, false); + salt = this.util.mixedToUint8Array(salt, false); return _sha256.pbkdf2(password, salt, rounds, size); } - - this.keyFactory.pbkdf2hex = (password, salt, rounds = 150000, size = 32) => { - return this.util.bytesToHex(this.keyFactory.pbkdf2(password, salt, rounds, size)); - } - this.keyFactory.genSeedFromCredentials = (username, password, rounds = 150000, size = 32) => { if(username == null) { reject("tEnvoy Fatal Error: argument username of method keyFactory.genSeedFromCredentials is required and does not have a default value."); @@ -873,7 +802,7 @@ function tEnvoy(openpgpRef = openpgp, naclRef = nacl, sjclRef = sjcl, sha256Ref } else { size = parseInt(size); } - return this.keyFactory.pbkdf2(username, password, rounds, size); + return this.keyFactory.pbkdf2(password, username, rounds, size); } this.keyFactory.genPGPKeys = (args) => { @@ -2009,6 +1938,6 @@ function tEnvoyNaClSigningKey(key, type = "secret", password = null, passwordPro } -TogaTech.tEnvoy = new tEnvoy(openpgp, nacl, sjcl, sha256); +TogaTech.tEnvoy = new tEnvoy(openpgp, nacl, sha256); module.exports = {tEnvoy, tEnvoyPGPKey, tEnvoyNaClKey, tEnvoyNaClSigningKey}; \ No newline at end of file diff --git a/sjcl/.gitignore b/sjcl/.gitignore deleted file mode 100644 index 35e843e8..00000000 --- a/sjcl/.gitignore +++ /dev/null @@ -1,29 +0,0 @@ -# Logs -logs -*.log - -# Runtime data -pids -*.pid -*.seed - -# Directory for instrumented libs generated by jscoverage/JSCover -lib-cov - -# Coverage directory used by tools like istanbul -coverage - -# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) -.grunt - -# Compiled binary addons (http://nodejs.org/api/addons.html) -build/Release - -# Dependency directory -# Deployed apps should consider commenting this line out: -# see https://npmjs.org/doc/faq.html#Should-I-check-my-node_modules-folder-into-git -node_modules - -# build artifact -test/bundle.js -.nyc_output diff --git a/sjcl/.travis.yml b/sjcl/.travis.yml deleted file mode 100644 index e8bf9ba9..00000000 --- a/sjcl/.travis.yml +++ /dev/null @@ -1,19 +0,0 @@ -sudo: false -language: node_js -before_install: - - npm install npm -g -node_js: - - "12" - - "lts/*" - - "8" - - "9" - - "10" -matrix: - include: - - node_js: "8" - env: TEST_SUITE=coverage - - node_js: "8" - env: TEST_SUITE=lint -env: - - TEST_SUITE=test -script: npm run-script $TEST_SUITE diff --git a/sjcl/LICENSE b/sjcl/LICENSE deleted file mode 100644 index a115b524..00000000 --- a/sjcl/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2014 Daniel Cousens - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/sjcl/LICENSE.txt b/sjcl/LICENSE.txt deleted file mode 100644 index 983d342e..00000000 --- a/sjcl/LICENSE.txt +++ /dev/null @@ -1,58 +0,0 @@ -SJCL is open. You can use, modify and redistribute it under a BSD -license or under the GNU GPL, version 2.0. - ---------------------------------------------------------------------- - -http://opensource.org/licenses/BSD-2-Clause - -Copyright (c) 2009-2015, Emily Stark, Mike Hamburg and Dan Boneh at -Stanford University. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -1. Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright -notice, this list of conditions and the following disclaimer in the -documentation and/or other materials provided with the distribution. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS -IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED -TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A -PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED -TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - ---------------------------------------------------------------------- - -http://opensource.org/licenses/GPL-2.0 - -The Stanford Javascript Crypto Library (hosted here on GitHub) is a -project by the Stanford Computer Security Lab to build a secure, -powerful, fast, small, easy-to-use, cross-browser library for -cryptography in Javascript. - -Copyright (c) 2009-2015, Emily Stark, Mike Hamburg and Dan Boneh at -Stanford University. - -This program is free software; you can redistribute it and/or modify it -under the terms of the GNU General Public License as published by the -Free Software Foundation; either version 2 of the License, or (at your -option) any later version. - -This program is distributed in the hope that it will be useful, but -WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General -Public License for more details. - -You should have received a copy of the GNU General Public License along -with this program; if not, write to the Free Software Foundation, Inc., -59 Temple Place, Suite 330, Boston, MA 02111-1307 USA \ No newline at end of file diff --git a/sjcl/Makefile b/sjcl/Makefile deleted file mode 100644 index dd0c3462..00000000 --- a/sjcl/Makefile +++ /dev/null @@ -1,99 +0,0 @@ -YUICOMPRESSOR= yuicompressor-2.4.2.jar - -include config.mk - -.PHONY: all test test_yui test_closure test_uncompressed lint compression_stats - -all: sjcl.js - -sjcl.js: $(COMPRESS) - cp $^ $@ - -core.js: $(SOURCES) config.mk - cat $(SOURCES) > $@ - -# compressed targets -core_closure.js: core.js compress/compress_with_closure.sh compress/*.pl - compress/compress_with_closure.sh $< > $@ - -core_yui.js: core.js compress/compress_with_yui.sh compress/*.pl - compress/compress_with_yui.sh $< > $@ - -compression_stats: core.js core_closure.js core_yui.js - gzip -c core.js > core.js.gz - gzip -c core_yui.js > core_yui.js.gz - gzip -c core_closure.js > core_closure.js.gz - - @echo - @echo - @echo Compression stats: - @echo - @wc -c core.js core_closure.js core_yui.js | head -n -1 - @echo - @wc -c core*.js.gz | head -n -1 - @echo - @echo - - rm -f core*.js.gz - -doc: $(SOURCES) - rm -fr $@ - npm run jsdoc -- $(SOURCES) --destination $@ - -doc_private: $(SOURCES) - rm -fr $@ - npm run jsdoc -- $(SOURCES) --destination $@ --private - -lint: - npm run lint - - -TEST_COMMON= browserTest/nodeUtil.js test/test.js - -TEST_SCRIPTS= $(TEST_COMMON) \ - test/ccm_vectors.js test/ccm_arraybuffer_test.js \ - test/codec_arraybuffer_test.js \ - test/aes_vectors.js test/aes_test.js \ - test/bitArray_vectors.js test/bitArray_test.js \ - test/bn_vectors.js test/bn_test.js \ - test/cbc_vectors.js test/cbc_test.js \ - test/ctr_vectors.js test/ctr_test.js \ - test/ccm_vectors.js test/ccm_test.js \ - test/ecc_vectors.js test/ecc_test.js \ - test/ecc_conv.js \ - test/ecdsa_test.js test/ecdsa_vectors.js test/ecdh_test.js \ - test/gcm_vectors.js test/gcm_test.js \ - test/hmac_vectors.js test/hmac_test.js \ - test/json_test.js \ - test/ocb2_vectors.js test/ocb2_test.js \ - test/ocb2progressive_test.js \ - test/pbkdf2_test.js test/scrypt_vectors.js test/scrypt_test.js \ - test/ripemd160_vectors.js test/ripemd160_test.js \ - test/sha1_vectors.js test/sha1_test.js \ - test/sha1_vectors_long_messages.js test/sha1_test_long_messages.js \ - test/sha1_huge_test_messages.js test/sha1_huge_test.js \ - test/sha256_vectors.js test/sha256_test.js \ - test/sha256_huge_test_messages.js test/sha256_huge_test.js \ - test/sha256_vectors_long_messages.js test/sha256_test_long_messages.js \ - test/sha256_test_brute_force.js \ - test/sha512_vectors.js test/sha512_test.js \ - test/sha512_vectors_long_messages.js test/sha512_test_long_messages.js \ - test/sha512_huge_test_messages.js test/sha512_huge_test.js \ - test/sha512_test_brute_force.js \ - test/srp_vectors.js test/srp_test.js \ - test/z85_vectors.js test/z85_test.js - -# Run all tests in node.js. -test: sjcl.js $(TEST_SCRIPTS) test/run_tests_node.js - node test/run_tests_node.js $< $(TEST_SCRIPTS) - -tidy: - find . -name '*~' -delete - rm -f core.js core_*.js - -clean: tidy - rm -fr sjcl.js doc doc_private - -distclean: clean - ./configure - make sjcl.js tidy diff --git a/sjcl/README.md b/sjcl/README.md deleted file mode 100644 index 4d3cf20e..00000000 --- a/sjcl/README.md +++ /dev/null @@ -1,34 +0,0 @@ -sjcl -==== - -[![Build Status](https://travis-ci.org/bitwiseshiftleft/sjcl.png)](https://travis-ci.org/bitwiseshiftleft/sjcl) - -[![Join the chat at https://gitter.im/bitwiseshiftleft/sjcl](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/bitwiseshiftleft/sjcl?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) - -Stanford Javascript Crypto Library - -Security Advisories -=== - -* 12.02.2014: the current development version has a paranoia bug in the ecc module. The bug was introduced in commit [ac0b3fe0](https://github.com/bitwiseshiftleft/sjcl/commit/ac0b3fe0) and might affect ecc key generation on platforms without a platform random number generator. - -Security Contact -==== -Security Mail: sjcl@ovt.me -OpenPGP-Key Fingerprint: 0D54 3E52 87B4 EC06 3FA9 0115 72ED A6C7 7AAF 48ED -Keyserver: pool.sks-keyservers.net - -Upgrade Guide -==== - -## 1.0.3 -> 1.0.4 - -`codecBase32` has been re-enabled with changes to conform to [RFC 4648](http://tools.ietf.org/html/rfc4648#section-6): - -* Padding with `=` is now applied to the output of `fromBits`. If you don't want that padding, you can disable it by calling `fromBits` with a second parameter of `true` or anything that evaluates as "truthy" in JS -* The encoding alphabet for `sjcl.codec.base32` now matches that specified by the RFC, rather than the extended hex alphabet. -* The former extended hex alphabet is now available through `sjcl.codec.base32hex` (also matching the RFC). So if you encoded something with `base32` before, you'll want to decode it with `base32hex` now. - -Documentation -==== -The documentation is available [here](http://bitwiseshiftleft.github.io/sjcl/doc/) diff --git a/sjcl/README/COPYRIGHT b/sjcl/README/COPYRIGHT deleted file mode 100644 index 69b3e19f..00000000 --- a/sjcl/README/COPYRIGHT +++ /dev/null @@ -1,49 +0,0 @@ -SJCL used to be in the public domain. Now it's: - -Copyright 2009-2010 Emily Stark, Mike Hamburg, Dan Boneh, Stanford University. - -This is for liability reasons. (Speaking of which, SJCL comes with NO -WARRANTY WHATSOEVER, express or implied, to the limit of applicable -law.) - -SJCL is dual-licensed under the GNU GPL version 2.0 or higher, and a -2-clause BSD license. You may use SJCL under the terms of either of -these licenses. For your convenience, the GPL versions 2.0 and 3.0 -and the 2-clause BSD license are included here. Additionally, you may -serve "crunched" copies of sjcl (i.e. those with comments removed, -and other transformations to reduce code size) without any copyright -notice. - -SJCL includes JsDoc toolkit, YUI compressor, Closure compressor, -JSLint and the CodeView template in its build system. These programs' -copyrights are owned by other people. They are distributed here under -the MPL, MIT, BSD, Apache and JSLint licenses. Codeview is "free for -download" but has no license attached; it is Copyright 2010 Wouter Bos. - -The BSD license is (almost?) strictly more permissive, but the -additionally licensing under the GPL allows us to use OCB 2.0 code -royalty-free (at least, if OCB 2.0's creator Phil Rogaway has anything -to say about it). Note that if you redistribute SJCL under a license -other than the GPL, you or your users may need to pay patent licensing -fees for OCB 2.0. - -There may be patents which apply to SJCL other than Phil Rogaway's OCB -patents. We suggest that you consult legal counsel before using SJCL -in a commercial project. - ------ - -Please note, two Java JAR files, Google Closure Compiler and -YUI Compressor, are provided in the "compress" folder as a convenience -for the compiling process of SJCL. These are not part of SJCL itself -and provided under their own licenses. - -As of October 2015, more information can be found at the following -locations: - -Google Closure Compiler - - https://developers.google.com/closure/compiler/ - -YUI Compressor - - http://yui.github.io/yuicompressor/ - diff --git a/sjcl/README/INSTALL b/sjcl/README/INSTALL deleted file mode 100644 index a5898c40..00000000 --- a/sjcl/README/INSTALL +++ /dev/null @@ -1,36 +0,0 @@ -SJCL comes with a file sjcl.js pre-built. This default build includes -all the modules except for sjcl.codec.bytes (because the demo site doesn't -use it). All you need to do to install is copy this file to your web -server and start using it. - -SJCL is divided into modules implementing various cryptographic and -convenience functions. If you don't need them all for your application, -you can reconfigure SJCL for a smaller code size. To do this, you can -run - -./configure --without-all --with-aes --with-sha256 ... - -Then type - -make - -to rebuild sjcl.js. This will also create a few intermediate files -core*.js; you can delete these automatically by typing - -make sjcl.js tidy - -instead. You will need make, perl, bash and java to rebuild SJCL. - -Some of the modules depend on other modules; configure should handle this -automatically unless you tell it --without-FOO --with-BAR, where BAR -depends on FOO. If you do this, configure will yell at you. - -SJCL is compressed by stripping comments, shortening variable names, etc. -You can also pass a --compress argument to configure to change the -compressor. By default SJCL uses some perl/sh scripts and Google's -Closure compressor. - -If you reconfigure SJCL, it is recommended that you run the included test -suite by typing "make test". If this prints "FAIL" or segfaults, SJCL -doesn't work; please file a bug. - diff --git a/sjcl/README/bsd.txt b/sjcl/README/bsd.txt deleted file mode 100644 index a0559ed0..00000000 --- a/sjcl/README/bsd.txt +++ /dev/null @@ -1,30 +0,0 @@ -Copyright 2009-2010 Emily Stark, Mike Hamburg, Dan Boneh. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - 1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials provided - with the distribution. - -THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR -IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR -BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN -IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -The views and conclusions contained in the software and documentation -are those of the authors and should not be interpreted as representing -official policies, either expressed or implied, of the authors. diff --git a/sjcl/README/gpl-2.0.txt b/sjcl/README/gpl-2.0.txt deleted file mode 100644 index d159169d..00000000 --- a/sjcl/README/gpl-2.0.txt +++ /dev/null @@ -1,339 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Lesser General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) year name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - , 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. diff --git a/sjcl/README/gpl-3.0.txt b/sjcl/README/gpl-3.0.txt deleted file mode 100644 index 94a9ed02..00000000 --- a/sjcl/README/gpl-3.0.txt +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/sjcl/bench/index.js b/sjcl/bench/index.js deleted file mode 100644 index 706d5f49..00000000 --- a/sjcl/bench/index.js +++ /dev/null @@ -1,35 +0,0 @@ -var Benchmark = require('benchmark') -var current = require('../lib/sync') -var old = require('./old') - -run('hello', 'world', 100, 32, 'md5') -run('hello', 'world', 100, 32, 'sha256') -run('hello', 'world', 10000, 70, 'md5') -run('hello', 'world', 10000, 70, 'sha256') -function run (password, salt, iterations, keylen, digest) { - var suite = new Benchmark.Suite() - console.log(`password: ${password}`) - console.log(`salt: ${salt}`) - console.log(`iterations: ${iterations}`) - console.log(`keylen: ${keylen}`) - console.log(`digest: ${digest}`) - - // add tests - suite - .add('current', function () { - current(password, salt, iterations, keylen, digest) - }) - .add('old', function () { - old(password, salt, iterations, keylen, digest) - }) - - // add listeners - .on('cycle', function (event) { - console.log(String(event.target)) - }) - .on('complete', function () { - console.log('Fastest is ' + this.filter('fastest').map('name')) - console.log('') - }) - .run() -} diff --git a/sjcl/bench/old.js b/sjcl/bench/old.js deleted file mode 100644 index ffcc2e5b..00000000 --- a/sjcl/bench/old.js +++ /dev/null @@ -1,47 +0,0 @@ -var createHmac = require('create-hmac') -var checkParameters = require('../lib/precondition') -var defaultEncoding = require('../lib/default-encoding') -var Buffer = require('safe-buffer').Buffer -module.exports = pbkdf2 -function pbkdf2 (password, salt, iterations, keylen, digest) { - if (!Buffer.isBuffer(password)) password = Buffer.from(password, defaultEncoding) - if (!Buffer.isBuffer(salt)) salt = Buffer.from(salt, defaultEncoding) - - checkParameters(iterations, keylen) - - digest = digest || 'sha1' - - var hLen - var l = 1 - var DK = Buffer.allocUnsafe(keylen) - var block1 = Buffer.allocUnsafe(salt.length + 4) - salt.copy(block1, 0, 0, salt.length) - - var r - var T - - for (var i = 1; i <= l; i++) { - block1.writeUInt32BE(i, salt.length) - var U = createHmac(digest, password).update(block1).digest() - - if (!hLen) { - hLen = U.length - T = Buffer.allocUnsafe(hLen) - l = Math.ceil(keylen / hLen) - r = keylen - (l - 1) * hLen - } - - U.copy(T, 0, 0, hLen) - - for (var j = 1; j < iterations; j++) { - U = createHmac(digest, password).update(U).digest() - for (var k = 0; k < hLen; k++) T[k] ^= U[k] - } - - var destPos = (i - 1) * hLen - var len = (i === l ? r : hLen) - T.copy(DK, destPos, 0, len) - } - - return DK -} diff --git a/sjcl/bower.json b/sjcl/bower.json deleted file mode 100644 index 823fcea1..00000000 --- a/sjcl/bower.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "name": "sjcl", - "version": "1.0.8", - "main": ["./sjcl.js"] -} diff --git a/sjcl/browser.js b/sjcl/browser.js deleted file mode 100644 index ac5fdd8d..00000000 --- a/sjcl/browser.js +++ /dev/null @@ -1,2 +0,0 @@ -exports.pbkdf2 = require('./lib/async') -exports.pbkdf2Sync = require('./lib/sync') diff --git a/sjcl/browserTest/browserTest.html b/sjcl/browserTest/browserTest.html deleted file mode 100644 index be8d5348..00000000 --- a/sjcl/browserTest/browserTest.html +++ /dev/null @@ -1,16 +0,0 @@ - - - - - SJCL browser test - - - - - -

SJCL browser test

-
Waiting for tests to begin...
-
- - diff --git a/sjcl/browserTest/browserUtil.js b/sjcl/browserTest/browserUtil.js deleted file mode 100644 index a460adfb..00000000 --- a/sjcl/browserTest/browserUtil.js +++ /dev/null @@ -1,162 +0,0 @@ -browserUtil = {}; - -browserUtil.isNodeJS = (typeof(window) === 'undefined'); - -/** - * Pause (for the graphics to update and the script timer to clear), then run the - * specified action. - */ -browserUtil.pauseAndThen = function (cb) { - cb && window.setTimeout(cb, 1); -}; - -/** - * Iterate using continuation-passing style. - */ -browserUtil.cpsIterate = function (f, start, end, pause, callback) { - var pat = pause ? browserUtil.pauseAndThen : function (cb) { cb && cb(); }; - function go() { - var called = false; - if (start >= end) { - pat(callback); - } else { - pat(function () { f(start, function () { - if (!called) { called = true; start++; go(); } - }); }); - } - } - go (start); -}; - -/** - * Map a function over an array using continuation-passing style. - */ -browserUtil.cpsMap = function (map, list, pause, callback) { - browserUtil.cpsIterate(function (i, cb) { map(list[i], i, list.length, cb); }, - 0, list.length, pause, callback); -}; - -/** Cache for remotely loaded scripts. */ -browserUtil.scriptCache = {}; - -/** Load several scripts, then call back */ -browserUtil.loadScripts = function(scriptNames, cbSuccess, cbError) { - var head = document.getElementsByTagName('head')[0]; - browserUtil.cpsMap(function (script, i, n, cb) { - var scriptE = document.createElement('script'), xhr, loaded = false; - - browserUtil.status("Loading script " + script); - - if (window.location.protocol === "file:") { - /* Can't make an AJAX request for files. - * But, we know the load time will be short, so timeout-based error - * detection is fine. - */ - scriptE.onload = function () { - loaded = true; - cb(); - }; - scriptE.onerror = function(err) { - cbError && cbError(script, err, cb); - }; - script.onreadystatechange = function() { - if (this.readyState == 'complete' || this.readyState == 'loaded') { - loaded = true; - cb(); - } - }; - scriptE.type = 'text/javascript'; - scriptE.src = script+"?"+(new Date().valueOf()); - window.setTimeout(function () { - loaded || cbError && cbError(script, "timeout expired", cb); - }, 100); - head.appendChild(scriptE); - } else if (browserUtil.scriptCache[script] !== undefined) { - try { - scriptE.appendChild(document.createTextNode(browserUtil.scriptCache[script])); - } catch (e) { - scriptE.text = browserUtil.scriptCache[script]; - } - head.appendChild(scriptE); - cb(); - } else { - var xhr; - if (window.XMLHttpRequest) { - xhr = new XMLHttpRequest; - } else if (window.ActiveXObject) { - xhr = new ActiveXObject("Microsoft.XMLHTTP"); - } - xhr.onreadystatechange = function() { - if (xhr.readyState == 4) { - if (xhr.status == 200) { - browserUtil.scriptCache[script] = xhr.responseText; - try { - scriptE.appendChild(document.createTextNode(xhr.responseText)); - } catch (e) { - scriptE.text = xhr.responseText; - } - head.appendChild(scriptE); - cb(); - } else { - cbError && cbError(script, xhr.status, cb); - } - } - }; - xhr.open("GET", script+"?"+(new Date().valueOf()), true); - xhr.send(); - } - }, scriptNames, false, cbSuccess); -}; - -/** Write a message to the console */ -browserUtil.write = function(type, message) { - var d1 = document.getElementById("print"), d2 = document.createElement("div"), d3 = document.createElement("div"); - d3.className = type; - d3.appendChild(document.createTextNode(message)); - d2.appendChild(d3); - d1.appendChild(d2); - return { update: function (type2, message2) { - var d4 = document.createElement("div"); - d4.className = type2 + " also"; - d4.appendChild(document.createTextNode(message2)); - d2.insertBefore(d4, d3); - }}; -}; - -browserUtil.writeTable = function (headers) { - var d1 = document.getElementById("print"), d2 = document.createElement("table"), d3 = document.createElement("tr"); - d2.className = 'table'; - - // write the headers - for (var i = 0; i < headers.length; i++) { - var header = document.createElement("th"); - header.appendChild(document.createTextNode(headers[i])); - d3.appendChild(header); - } - - d2.appendChild(d3); - d1.appendChild(d2); - - return { update: function (row) { - var d4 = document.createElement("tr"); - - // write the rows - for (var i = 0; i < row.length; i++) { - var cell = document.createElement("td"); - - cell.appendChild(document.createTextNode(row[i])); - d4.appendChild(cell); - } - - d2.appendChild(d4); - }}; -}; - -/** Write a newline. Does nothing in the browser. */ -browserUtil.writeNewline = function () { }; - -/** Write a message to the status line */ -browserUtil.status = function(message) { - var d1 = document.getElementById("status"); - d1.replaceChild(document.createTextNode(message), d1.firstChild); -}; diff --git a/sjcl/browserTest/entropy.html b/sjcl/browserTest/entropy.html deleted file mode 100644 index 4458ba73..00000000 --- a/sjcl/browserTest/entropy.html +++ /dev/null @@ -1,88 +0,0 @@ - - - -Entropy Generator Progress - - - - - - - - - - -

Entropy Generator Progress

- -

Target: 192 bits, available at paranoia level 5.

- -

Corresponding paranoia level from [0,1..10]: (the idea being that you can see the progress bar advance gently from empty/black to full/yellow after you press this)

- -

(also consumes 192 bits with every keypress in the text field; use key repeat to consume swiftly)

- -
-
-
- -

Please move your mouse, play around and generally introduce entropy into your environment.

- - - \ No newline at end of file diff --git a/sjcl/browserTest/nodeUtil.js b/sjcl/browserTest/nodeUtil.js deleted file mode 100644 index 9ccb6b94..00000000 --- a/sjcl/browserTest/nodeUtil.js +++ /dev/null @@ -1,44 +0,0 @@ -browserUtil = { - isNodeJS: true, - - pauseAndThen: function (cb) { cb(); }, - - cpsIterate: function (f, start, end, pause, callback) { - function go() { - var called = false; - if (start >= end) { - callback && callback(); - } else { - f(start, function () { - if (!called) { called = true; start++; go(); } - }); - } - } - go (start); - }, - - cpsMap: function (map, list, pause, callback) { - browserUtil.cpsIterate(function (i, cb) { map(list[i], i, list.length, cb); }, - 0, list.length, pause, callback); - }, - - loadScripts: function(scriptNames, callback) { - for (i=0; i - - - SJCL browser performance - - - -

SJCL browser performance

-
Waiting for tests to begin...
-
- - - - - diff --git a/sjcl/browserTest/performance.js b/sjcl/browserTest/performance.js deleted file mode 100644 index a5c41e53..00000000 --- a/sjcl/browserTest/performance.js +++ /dev/null @@ -1,70 +0,0 @@ -sjcl.perf = { all: {} }; - -sjcl.perf.PerfCase = function PerfCase (name, cases, runCase) { - this.name = name; - this.cases = cases; - this.runCase = runCase; - sjcl.perf.all[name] = this; -}; - -sjcl.perf.PerfCase.prototype.run = function (callback) { - var thiz = this; - - var repo = browserUtil.write("info", "Running " + this.name + "..."); - var table = browserUtil.writeTable(["iter", "time"]); - - thiz.runCase(this.cases[0]); // cold start - - browserUtil.cpsMap(function (t, i, n, cb) { - var runs = []; - - // do 3 runs and average them - for (var k = 0; k < 3; k++) { - var t0 = performance.now(); - thiz.runCase(t); - var t1 = performance.now(); - runs.push(t1 - t0); - } - - var avg = runs.reduce(function(a, b) { return a + b; }) / runs.length; - table.update([t, avg.toFixed(3) + ' ms']); - - cb && cb(); - }, this.cases, true, function() { - - repo.update("pass", "done."); - callback(); - - }); -}; - -sjcl.perf.run = function (perfs, callback) { - browserUtil.status("Profiling..."); - - var t; - if (perfs === undefined || perfs.length == 0) { - perfs = []; - for (t in sjcl.perf.all) { - if (sjcl.perf.all.hasOwnProperty(t)) { - perfs.push(t); - } - } - } - - browserUtil.cpsMap(function (t, i, n, cb) { - sjcl.perf.all[perfs[i]].run(cb); - }, perfs, true, callback); -}; - - -// performance case for pbkdf2 -var cases = [1000, 2000, 4000, 8000, 16000, 32000, 48000, 64000]; -new sjcl.perf.PerfCase("pbkdf2", cases, - function (iter) { - sjcl.misc.pbkdf2("mypassword", "01234567890123456789", iter); - } -); - -sjcl.perf.run([], function() { - browserUtil.status(""); -}); diff --git a/sjcl/browserTest/test.css b/sjcl/browserTest/test.css deleted file mode 100644 index 9402feb3..00000000 --- a/sjcl/browserTest/test.css +++ /dev/null @@ -1,79 +0,0 @@ -* { - margin: 0px; - padding: 0px; - font-family: Arial, Helvetica, FreeSans, sans; -} - -#print { - position: relative; - width: 40em; - margin: 0px auto; - padding: 5px; -} - -#print div { - position: relative; -} - -.pass { color: #0A0; } -.fail { color: #A00; } -.unimplemented { color: #F80; } - -.begin { - text-align: center; - padding-bottom: 2px; - border-bottom: 1px solid #aaa; - margin: 0px auto 2px auto; -} - -.all { - text-align: center; - font-weight: bold; -} - -*+* > .begin, *+* > .all { - margin-top: 1em; -} - -.also { - float: right; - width: 17em; - text-align: right; -} - -h1 { - text-align: center; - background: #8A0000; - padding: 5px; - color: white; -} - -#status { - padding: 3px 10px 3px 5px; - background: #d5c490; - color: #444; - font-size: 0.8em; - margin-bottom: 1em; - height: 1.3em; - vertical-align: middle; -} - -.table { - width: 100%; - border-spacing: 0; - border-collapse: collapse; - margin: 5px 0; -} - -.table td, .table th { - padding: 3px; - border: 1px solid #ddd; -} - -.table td { - text-align: right; -} - -.table tr:nth-of-type(odd) { - background: #f9f9f9; -} diff --git a/sjcl/compress/compiler-latest.zip b/sjcl/compress/compiler-latest.zip deleted file mode 100644 index f5a9ad5a..00000000 Binary files a/sjcl/compress/compiler-latest.zip and /dev/null differ diff --git a/sjcl/compress/compiler.jar b/sjcl/compress/compiler.jar deleted file mode 100644 index 63719cd1..00000000 Binary files a/sjcl/compress/compiler.jar and /dev/null differ diff --git a/sjcl/compress/compress_with_closure.sh b/sjcl/compress/compress_with_closure.sh deleted file mode 100755 index fe577557..00000000 --- a/sjcl/compress/compress_with_closure.sh +++ /dev/null @@ -1,39 +0,0 @@ -#!/bin/bash - -DIR=`dirname $0` - -URL="https://dl.google.com/closure-compiler/compiler-latest.zip" -FILE=`echo $URL | sed 's#.*/##'` -unzip > /dev/null 2> /dev/null -if [ $? -eq 0 ] ; then - wget -V > /dev/null 2> /dev/null - if [ $? -eq 0 ] ; then - pushd . > /dev/null - cd $DIR - wget -q -N $URL - popd > /dev/null - else - curl -V > /dev/null 2> /dev/null - if [ $? -eq 0 ] ; then - curl -s -z $DIR/$FILE -o $DIR/$FILE $URL > /dev/null 2> /dev/null - fi - fi - if [ -s $DIR/$FILE ] ; then - pushd . > /dev/null - cd $DIR - unzip -o $FILE compiler.jar > /dev/null 2> /dev/null - popd > /dev/null - fi -fi - -$DIR/remove_constants.pl $1 | $DIR/opacify.pl > ._tmpRC.js - -echo -n '"use strict";' -java -jar $DIR/compiler.jar --compilation_level ADVANCED_OPTIMIZATIONS \ - --js ._tmpRC.js \ - | $DIR/digitize.pl \ - | $DIR/dewindowize.pl - - -rm -f ._tmpRC.js - diff --git a/sjcl/compress/compress_with_yui.sh b/sjcl/compress/compress_with_yui.sh deleted file mode 100755 index 9dfecdac..00000000 --- a/sjcl/compress/compress_with_yui.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/bash - -# Compress $1 with YUI Compressor 2.4.2, returning the compressed script on stdout - -DIR=`dirname $0` - -$DIR/remove_constants.pl $1 > ._tmpRC.js - -java -jar $DIR/yuicompressor-2.4.2.jar ._tmpRC.js \ - | $DIR/digitize.pl - -rm -f ._tmpRC.js - diff --git a/sjcl/compress/dewindowize.pl b/sjcl/compress/dewindowize.pl deleted file mode 100755 index c8843825..00000000 --- a/sjcl/compress/dewindowize.pl +++ /dev/null @@ -1,8 +0,0 @@ -#!/usr/bin/env perl - -while (<>) { - s/window\.sjcl\s*=/var sjcl=/g; - s/window\.sjcl/sjcl/g; - print; -} - diff --git a/sjcl/compress/digitize.pl b/sjcl/compress/digitize.pl deleted file mode 100755 index 0fcc5c27..00000000 --- a/sjcl/compress/digitize.pl +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env perl - -# Convert numbers to hex, when doing so is likely to increase compressibility. -# This actually makes the script slightly longer, but generally makes it compress -# to something shorter. -# -# Here we're targeting constants like 0xFF, 0xFFFF0000, 0x10101, 0x100000000, etc. - -sub digitize { - my $number = shift; - if ($number >= 256) { - my $nn = `printf "%x" $number`; - if ($nn =~ /^[01f]+$/i) { return "0x$nn"; } - } - return $number; -} - -while (<>) { - s/([^a-zA-Z0-9_"])(\d+)/$1 . digitize $2/eg; - print; -} - diff --git a/sjcl/compress/opacify.pl b/sjcl/compress/opacify.pl deleted file mode 100755 index 4d76a752..00000000 --- a/sjcl/compress/opacify.pl +++ /dev/null @@ -1,39 +0,0 @@ -#!/usr/bin/env perl - -# This script is a hack. -# -# Opacify all non-private names by turning them into strings. -# That way, the Google compressor won't rename them. -# -# The script ignores properties whose names begin with _, because they -# are believed to be private. -# -# XXX TODO FIXME: this messes with strings, so it screws up exceptions. - -my $script = join '', <>; - -# remove comments -#$script =~ s=/\*([^\*]|\*+[^\/])*\*/==g; -#$script =~ s=//.*==g; - -# stringify property names -$script =~ s=\.([a-zA-Z][_a-zA-Z0-9]*)=['$1']=g; - -# destringify 'prototype' -$script =~ s=\['prototype'\]=.prototype=g; - -# stringify sjcl -$script =~ s=(?:var\s+)?sjcl(\.|\s*\=)=window['sjcl']$1=g; - -# stringify object notation -$script =~ s=([\{,] - \s* - (?:/\*(?:[^\*]|\*+[^\/])*\*/\s* # preserve C-style comments - |//[^\n]*\n\s*)*) - ([a-zA-Z0-9][_a-zA-Z0-9]*):=$1'$2':=xg; - -# Export sjcl. This is a bit of a hack, and might get replaced later. -print $script; - -# not necessary with windowization. -# print "window\['sjcl'\] = sjcl;\n"; diff --git a/sjcl/compress/remove_constants.pl b/sjcl/compress/remove_constants.pl deleted file mode 100755 index 73aee057..00000000 --- a/sjcl/compress/remove_constants.pl +++ /dev/null @@ -1,69 +0,0 @@ -#!/usr/bin/env perl - -# This script is a hack. It identifies things which it believes to be -# constant, then replaces them throughout the code. -# -# Constants are identified as properties declared in object notation -# with values consisting only of capital letters and underscores. If -# the first character is an underscore, the constant is private, and -# can be removed entirely. -# -# The script dies if any two constants have the same property name but -# different values. -my $script = join '', <>; - -# remove comments -#$script =~ s=/\*([^\*]|\*+[^\/])*\*/==g; -#$script =~ s=//.*==g; - -sub preserve { - my $stuff = shift; - $stuff =~ s/,//; - return $stuff; -} - -my %constants = (); - -sub add_constant { - my ($name, $value) = @_; - if (defined $constants{$name} && $constants{$name} ne $value) { - print STDERR "variant constant $name = $value"; - die; - } else { - $constants{$name} = $value; - #print STDERR "constant: $name = $value\n"; - } -} - -# find private constants -while ($script =~ - s/([,\{]) \s* # indicator that this is part of an object - (_[A-Z0-9_]+) \s* : \s* # all-caps variable name beginning with _ - (\d+|0x[0-9A-Fa-f]+) \s* # numeric value - ([,\}]) # next part of object - /preserve "$1$4"/ex) { - add_constant $2, $3; -} - -my $script2 = ''; - -# find public constants -while ($script =~ - s/^(.*?) # beginning of script - ([,\{]) \s* # indicator that this is part of an object - ([A-Z0-9_]+) \s* : \s* # all-caps variable name - (\d+|0x[0-9A-Fa-f]+) \s* # numeric value - ([,\}]) # next part of object([,\{]) \s* - /$5/esx) { - $script2 .= "$1$2$3:$4"; - add_constant $3, $4; -} - -$script = "$script2$script"; - -foreach (keys %constants) { - my $value = $constants{$_}; - $script =~ s/(?:[a-zA-Z0-9_]+\.)+$_(?=[^a-zA-Z0-9_])/$value/g; -} - -print $script; diff --git a/sjcl/compress/yuicompressor-2.4.2.jar b/sjcl/compress/yuicompressor-2.4.2.jar deleted file mode 100644 index c29470bd..00000000 Binary files a/sjcl/compress/yuicompressor-2.4.2.jar and /dev/null differ diff --git a/sjcl/config.mk b/sjcl/config.mk deleted file mode 100644 index 1a6a3613..00000000 --- a/sjcl/config.mk +++ /dev/null @@ -1,2 +0,0 @@ -SOURCES= core/sjcl.js core/aes.js core/bitArray.js core/codecString.js core/codecHex.js core/codecBase32.js core/codecBase64.js core/sha256.js core/ccm.js core/ocb2.js core/gcm.js core/hmac.js core/pbkdf2.js core/random.js core/convenience.js core/exports.js -COMPRESS= core_closure.js diff --git a/sjcl/configure b/sjcl/configure deleted file mode 100755 index abc6dd89..00000000 --- a/sjcl/configure +++ /dev/null @@ -1,157 +0,0 @@ -#!/usr/bin/env perl - -use strict; - -my ($arg, $i, $j, $targ); - -my @targets = qw/sjcl aes bitArray codecString codecHex codecBase32 codecBase64 codecBytes codecZ85 sha256 sha512 sha1 ccm ctr cbc ocb2 ocb2progressive gcm hmac pbkdf2 scrypt random convenience bn ecc srp ccmArrayBuffer codecArrayBuffer ripemd160/; -my %deps = ('aes'=>'sjcl', - 'bitArray'=>'sjcl', - 'codecString'=>'bitArray', - 'codecHex'=>'bitArray', - 'codecBase64'=>'bitArray', - 'codecBase32'=>'bitArray', - 'codecBytes'=>'bitArray', - 'codecZ85'=>'bitArray', - 'sha256'=>'codecString', - 'sha512'=>'codecString', - 'sha1'=>'codecString', - 'ripemd160' => 'codecString', - 'ccm'=>'bitArray,aes', - 'ctr'=>'bitArray,aes', - 'ocb2'=>'bitArray,aes', - 'ocb2progressive'=>'ocb2', - 'gcm'=>'bitArray,aes', - 'hmac'=>'sha256', - 'pbkdf2'=>'hmac', - 'scrypt'=>'pbkdf2,codecBytes', - 'srp'=>'sha1,bn,bitArray', - 'bn'=>'bitArray,random', - 'ecc'=>'bn', - 'cbc'=>'bitArray,aes', - 'random'=>'sha256,aes', - 'convenience'=>'ccm,pbkdf2,random,codecBase64', - 'ccmArrayBuffer'=>'bitArray,codecArrayBuffer', - 'codecArrayBuffer'=>'bitArray'); - -my $compress = "closure"; -my $exported = 1; - -my %enabled = (); -$enabled{$_} = 0 foreach (@targets); - -# by default, all but codecBytes, codecZ85, srp, bn -$enabled{$_} = 1 foreach (qw/aes bitArray codecString codecHex codecBase32 codecBase64 sha256 ccm ocb2 gcm hmac pbkdf2 random convenience/); - -# argument parsing -while (my $arg = shift @ARGV) { - if ($arg =~ /^--?with-all$/) { - foreach (@targets) { - if ($enabled{$_} == 0) { - $enabled{$_} = 1; - } - } - } elsif ($arg =~ /^--?without-all$/) { - foreach (@targets) { - if ($enabled{$_} == 1) { - $enabled{$_} = 0; - } - } - } elsif ($arg =~ /^--?with-(.*)$/) { - $targ = $1; - $targ =~ s/-(.)/uc $1/ge; - if (!defined $deps{$targ}) { - print STDERR "No such target $targ\n"; - exit 1; - } - $enabled{$targ} = 2; - } elsif ($arg =~ /^--?without-(.*)$/) { - $targ = $1; - $targ =~ s/-(.)/uc $1/ge; - if (!defined $deps{$targ}) { - print STDERR "No such target $targ\n"; - exit 1; - } - $enabled{$targ} = -1; - } elsif ($arg =~ /^--?compress(?:or|ion)?=(none|closure|yui)$/) { - $compress = $1; - } elsif ($arg =~ /^--?no-export$/) { - $exported = 0; - } else { - my $targets = join " ", @targets; - $targets =~ s/sjcl //; - $targets =~ s/(.{50})\s+/$1\n /g; - print STDERR < 0) { - foreach $j (split /,/, $deps{$i}) { - if ($enabled{$j} == -1) { - if ($enabled{$i} == 2) { - print STDERR "Conflicting options: $i depends on $j\n"; - exit 1; - } else { - $enabled{$i} = -1; - last; - } - } - } - } -} - -$config = "exports $config" if $exported; - -# reverse -foreach my $i (reverse @targets) { - if ($enabled{$i} > 0) { - foreach $j (split /,/, $deps{$i}) { - if ($enabled{$j} < $enabled{$i}) { - $enabled{$j} = $enabled{$i}; - } - } - $config = "$i $config"; - } -} - -open CONFIG, "> config.mk" or die "$!"; - - -($pconfig = $config) =~ s/^sjcl //; -$pconfig =~ s/ /\n /g; -print "Enabled components:\n $pconfig\n"; -print "Compression: $compress\n"; - -$config =~ s=\S+=core/$&.js=g; -print CONFIG "SOURCES= $config\n"; - -$compress = "core_$compress.js"; -$compress = 'core.js' if ($compress eq 'core_none.js'); - -print CONFIG "COMPRESS= $compress\n"; diff --git a/sjcl/core/aes.js b/sjcl/core/aes.js deleted file mode 100644 index 5e1b6528..00000000 --- a/sjcl/core/aes.js +++ /dev/null @@ -1,206 +0,0 @@ -/** @fileOverview Low-level AES implementation. - * - * This file contains a low-level implementation of AES, optimized for - * size and for efficiency on several browsers. It is based on - * OpenSSL's aes_core.c, a public-domain implementation by Vincent - * Rijmen, Antoon Bosselaers and Paulo Barreto. - * - * An older version of this implementation is available in the public - * domain, but this one is (c) Emily Stark, Mike Hamburg, Dan Boneh, - * Stanford University 2008-2010 and BSD-licensed for liability - * reasons. - * - * @author Emily Stark - * @author Mike Hamburg - * @author Dan Boneh - */ - -/** - * Schedule out an AES key for both encryption and decryption. This - * is a low-level class. Use a cipher mode to do bulk encryption. - * - * @constructor - * @param {Array} key The key as an array of 4, 6 or 8 words. - */ -sjcl.cipher.aes = function (key) { - if (!this._tables[0][0][0]) { - this._precompute(); - } - - var i, j, tmp, - encKey, decKey, - sbox = this._tables[0][4], decTable = this._tables[1], - keyLen = key.length, rcon = 1; - - if (keyLen !== 4 && keyLen !== 6 && keyLen !== 8) { - throw new sjcl.exception.invalid("invalid aes key size"); - } - - this._key = [encKey = key.slice(0), decKey = []]; - - // schedule encryption keys - for (i = keyLen; i < 4 * keyLen + 28; i++) { - tmp = encKey[i-1]; - - // apply sbox - if (i%keyLen === 0 || (keyLen === 8 && i%keyLen === 4)) { - tmp = sbox[tmp>>>24]<<24 ^ sbox[tmp>>16&255]<<16 ^ sbox[tmp>>8&255]<<8 ^ sbox[tmp&255]; - - // shift rows and add rcon - if (i%keyLen === 0) { - tmp = tmp<<8 ^ tmp>>>24 ^ rcon<<24; - rcon = rcon<<1 ^ (rcon>>7)*283; - } - } - - encKey[i] = encKey[i-keyLen] ^ tmp; - } - - // schedule decryption keys - for (j = 0; i; j++, i--) { - tmp = encKey[j&3 ? i : i - 4]; - if (i<=4 || j<4) { - decKey[j] = tmp; - } else { - decKey[j] = decTable[0][sbox[tmp>>>24 ]] ^ - decTable[1][sbox[tmp>>16 & 255]] ^ - decTable[2][sbox[tmp>>8 & 255]] ^ - decTable[3][sbox[tmp & 255]]; - } - } -}; - -sjcl.cipher.aes.prototype = { - // public - /* Something like this might appear here eventually - name: "AES", - blockSize: 4, - keySizes: [4,6,8], - */ - - /** - * Encrypt an array of 4 big-endian words. - * @param {Array} data The plaintext. - * @return {Array} The ciphertext. - */ - encrypt:function (data) { return this._crypt(data,0); }, - - /** - * Decrypt an array of 4 big-endian words. - * @param {Array} data The ciphertext. - * @return {Array} The plaintext. - */ - decrypt:function (data) { return this._crypt(data,1); }, - - /** - * The expanded S-box and inverse S-box tables. These will be computed - * on the client so that we don't have to send them down the wire. - * - * There are two tables, _tables[0] is for encryption and - * _tables[1] is for decryption. - * - * The first 4 sub-tables are the expanded S-box with MixColumns. The - * last (_tables[01][4]) is the S-box itself. - * - * @private - */ - _tables: [[[],[],[],[],[]],[[],[],[],[],[]]], - - /** - * Expand the S-box tables. - * - * @private - */ - _precompute: function () { - var encTable = this._tables[0], decTable = this._tables[1], - sbox = encTable[4], sboxInv = decTable[4], - i, x, xInv, d=[], th=[], x2, x4, x8, s, tEnc, tDec; - - // Compute double and third tables - for (i = 0; i < 256; i++) { - th[( d[i] = i<<1 ^ (i>>7)*283 )^i]=i; - } - - for (x = xInv = 0; !sbox[x]; x ^= x2 || 1, xInv = th[xInv] || 1) { - // Compute sbox - s = xInv ^ xInv<<1 ^ xInv<<2 ^ xInv<<3 ^ xInv<<4; - s = s>>8 ^ s&255 ^ 99; - sbox[x] = s; - sboxInv[s] = x; - - // Compute MixColumns - x8 = d[x4 = d[x2 = d[x]]]; - tDec = x8*0x1010101 ^ x4*0x10001 ^ x2*0x101 ^ x*0x1010100; - tEnc = d[s]*0x101 ^ s*0x1010100; - - for (i = 0; i < 4; i++) { - encTable[i][x] = tEnc = tEnc<<24 ^ tEnc>>>8; - decTable[i][s] = tDec = tDec<<24 ^ tDec>>>8; - } - } - - // Compactify. Considerable speedup on Firefox. - for (i = 0; i < 5; i++) { - encTable[i] = encTable[i].slice(0); - decTable[i] = decTable[i].slice(0); - } - }, - - /** - * Encryption and decryption core. - * @param {Array} input Four words to be encrypted or decrypted. - * @param dir The direction, 0 for encrypt and 1 for decrypt. - * @return {Array} The four encrypted or decrypted words. - * @private - */ - _crypt:function (input, dir) { - if (input.length !== 4) { - throw new sjcl.exception.invalid("invalid aes block size"); - } - - var key = this._key[dir], - // state variables a,b,c,d are loaded with pre-whitened data - a = input[0] ^ key[0], - b = input[dir ? 3 : 1] ^ key[1], - c = input[2] ^ key[2], - d = input[dir ? 1 : 3] ^ key[3], - a2, b2, c2, - - nInnerRounds = key.length/4 - 2, - i, - kIndex = 4, - out = [0,0,0,0], - table = this._tables[dir], - - // load up the tables - t0 = table[0], - t1 = table[1], - t2 = table[2], - t3 = table[3], - sbox = table[4]; - - // Inner rounds. Cribbed from OpenSSL. - for (i = 0; i < nInnerRounds; i++) { - a2 = t0[a>>>24] ^ t1[b>>16 & 255] ^ t2[c>>8 & 255] ^ t3[d & 255] ^ key[kIndex]; - b2 = t0[b>>>24] ^ t1[c>>16 & 255] ^ t2[d>>8 & 255] ^ t3[a & 255] ^ key[kIndex + 1]; - c2 = t0[c>>>24] ^ t1[d>>16 & 255] ^ t2[a>>8 & 255] ^ t3[b & 255] ^ key[kIndex + 2]; - d = t0[d>>>24] ^ t1[a>>16 & 255] ^ t2[b>>8 & 255] ^ t3[c & 255] ^ key[kIndex + 3]; - kIndex += 4; - a=a2; b=b2; c=c2; - } - - // Last round. - for (i = 0; i < 4; i++) { - out[dir ? 3&-i : i] = - sbox[a>>>24 ]<<24 ^ - sbox[b>>16 & 255]<<16 ^ - sbox[c>>8 & 255]<<8 ^ - sbox[d & 255] ^ - key[kIndex++]; - a2=a; a=b; b=c; c=d; d=a2; - } - - return out; - } -}; - diff --git a/sjcl/core/bitArray.js b/sjcl/core/bitArray.js deleted file mode 100644 index 963bdcea..00000000 --- a/sjcl/core/bitArray.js +++ /dev/null @@ -1,202 +0,0 @@ -/** @fileOverview Arrays of bits, encoded as arrays of Numbers. - * - * @author Emily Stark - * @author Mike Hamburg - * @author Dan Boneh - */ - -/** - * Arrays of bits, encoded as arrays of Numbers. - * @namespace - * @description - *

- * These objects are the currency accepted by SJCL's crypto functions. - *

- * - *

- * Most of our crypto primitives operate on arrays of 4-byte words internally, - * but many of them can take arguments that are not a multiple of 4 bytes. - * This library encodes arrays of bits (whose size need not be a multiple of 8 - * bits) as arrays of 32-bit words. The bits are packed, big-endian, into an - * array of words, 32 bits at a time. Since the words are double-precision - * floating point numbers, they fit some extra data. We use this (in a private, - * possibly-changing manner) to encode the number of bits actually present - * in the last word of the array. - *

- * - *

- * Because bitwise ops clear this out-of-band data, these arrays can be passed - * to ciphers like AES which want arrays of words. - *

- */ -sjcl.bitArray = { - /** - * Array slices in units of bits. - * @param {bitArray} a The array to slice. - * @param {Number} bstart The offset to the start of the slice, in bits. - * @param {Number} bend The offset to the end of the slice, in bits. If this is undefined, - * slice until the end of the array. - * @return {bitArray} The requested slice. - */ - bitSlice: function (a, bstart, bend) { - a = sjcl.bitArray._shiftRight(a.slice(bstart/32), 32 - (bstart & 31)).slice(1); - return (bend === undefined) ? a : sjcl.bitArray.clamp(a, bend-bstart); - }, - - /** - * Extract a number packed into a bit array. - * @param {bitArray} a The array to slice. - * @param {Number} bstart The offset to the start of the slice, in bits. - * @param {Number} blength The length of the number to extract. - * @return {Number} The requested slice. - */ - extract: function(a, bstart, blength) { - // FIXME: this Math.floor is not necessary at all, but for some reason - // seems to suppress a bug in the Chromium JIT. - var x, sh = Math.floor((-bstart-blength) & 31); - if ((bstart + blength - 1 ^ bstart) & -32) { - // it crosses a boundary - x = (a[bstart/32|0] << (32 - sh)) ^ (a[bstart/32+1|0] >>> sh); - } else { - // within a single word - x = a[bstart/32|0] >>> sh; - } - return x & ((1< 0 && len) { - a[l-1] = sjcl.bitArray.partial(len, a[l-1] & 0x80000000 >> (len-1), 1); - } - return a; - }, - - /** - * Make a partial word for a bit array. - * @param {Number} len The number of bits in the word. - * @param {Number} x The bits. - * @param {Number} [_end=0] Pass 1 if x has already been shifted to the high side. - * @return {Number} The partial word. - */ - partial: function (len, x, _end) { - if (len === 32) { return x; } - return (_end ? x|0 : x << (32-len)) + len * 0x10000000000; - }, - - /** - * Get the number of bits used by a partial word. - * @param {Number} x The partial word. - * @return {Number} The number of bits used by the partial word. - */ - getPartial: function (x) { - return Math.round(x/0x10000000000) || 32; - }, - - /** - * Compare two arrays for equality in a predictable amount of time. - * @param {bitArray} a The first array. - * @param {bitArray} b The second array. - * @return {boolean} true if a == b; false otherwise. - */ - equal: function (a, b) { - if (sjcl.bitArray.bitLength(a) !== sjcl.bitArray.bitLength(b)) { - return false; - } - var x = 0, i; - for (i=0; i= 32; shift -= 32) { - out.push(carry); - carry = 0; - } - if (shift === 0) { - return out.concat(a); - } - - for (i=0; i>>shift); - carry = a[i] << (32-shift); - } - last2 = a.length ? a[a.length-1] : 0; - shift2 = sjcl.bitArray.getPartial(last2); - out.push(sjcl.bitArray.partial(shift+shift2 & 31, (shift + shift2 > 32) ? carry : out.pop(),1)); - return out; - }, - - /** xor a block of 4 words together. - * @private - */ - _xor4: function(x,y) { - return [x[0]^y[0],x[1]^y[1],x[2]^y[2],x[3]^y[3]]; - }, - - /** byteswap a word array inplace. - * (does not handle partial words) - * @param {sjcl.bitArray} a word array - * @return {sjcl.bitArray} byteswapped array - */ - byteswapM: function(a) { - var i, v, m = 0xff00; - for (i = 0; i < a.length; ++i) { - v = a[i]; - a[i] = (v >>> 24) | ((v >>> 8) & m) | ((v & m) << 8) | (v << 24); - } - return a; - } -}; diff --git a/sjcl/core/bn.js b/sjcl/core/bn.js deleted file mode 100644 index 3d5acc5a..00000000 --- a/sjcl/core/bn.js +++ /dev/null @@ -1,738 +0,0 @@ -// Thanks to Colin McRae and Jonathan Burns of ionic security -// for reporting and fixing two bugs in this file! - -/** - * Constructs a new bignum from another bignum, a number or a hex string. - * @constructor - */ -sjcl.bn = function(it) { - this.initWith(it); -}; - -sjcl.bn.prototype = { - radix: 24, - maxMul: 8, - _class: sjcl.bn, - - copy: function() { - return new this._class(this); - }, - - /** - * Initializes this with it, either as a bn, a number, or a hex string. - */ - initWith: function(it) { - var i=0, k; - switch(typeof it) { - case "object": - this.limbs = it.limbs.slice(0); - break; - - case "number": - this.limbs = [it]; - this.normalize(); - break; - - case "string": - it = it.replace(/^0x/, ''); - this.limbs = []; - // hack - k = this.radix / 4; - for (i=0; i < it.length; i+=k) { - this.limbs.push(parseInt(it.substring(Math.max(it.length - i - k, 0), it.length - i),16)); - } - break; - - default: - this.limbs = [0]; - } - return this; - }, - - /** - * Returns true if "this" and "that" are equal. Calls fullReduce(). - * Equality test is in constant time. - */ - equals: function(that) { - if (typeof that === "number") { that = new this._class(that); } - var difference = 0, i; - this.fullReduce(); - that.fullReduce(); - for (i = 0; i < this.limbs.length || i < that.limbs.length; i++) { - difference |= this.getLimb(i) ^ that.getLimb(i); - } - return (difference === 0); - }, - - /** - * Get the i'th limb of this, zero if i is too large. - */ - getLimb: function(i) { - return (i >= this.limbs.length) ? 0 : this.limbs[i]; - }, - - /** - * Constant time comparison function. - * Returns 1 if this >= that, or zero otherwise. - */ - greaterEquals: function(that) { - if (typeof that === "number") { that = new this._class(that); } - var less = 0, greater = 0, i, a, b; - i = Math.max(this.limbs.length, that.limbs.length) - 1; - for (; i>= 0; i--) { - a = this.getLimb(i); - b = that.getLimb(i); - greater |= (b - a) & ~less; - less |= (a - b) & ~greater; - } - return (greater | ~less) >>> 31; - }, - - /** - * Convert to a hex string. - */ - toString: function() { - this.fullReduce(); - var out="", i, s, l = this.limbs; - for (i=0; i < this.limbs.length; i++) { - s = l[i].toString(16); - while (i < this.limbs.length - 1 && s.length < 6) { - s = "0" + s; - } - out = s + out; - } - return "0x"+out; - }, - - /** this += that. Does not normalize. */ - addM: function(that) { - if (typeof(that) !== "object") { that = new this._class(that); } - var i, l=this.limbs, ll=that.limbs; - for (i=l.length; i> r; - } - if (carry) { - l.push(carry); - } - return this; - }, - - /** this /= 2, rounded down. Requires normalized; ends up normalized. */ - halveM: function() { - var i, carry=0, tmp, r=this.radix, l=this.limbs; - for (i=l.length-1; i>=0; i--) { - tmp = l[i]; - l[i] = (tmp+carry)>>1; - carry = (tmp&1) << r; - } - if (!l[l.length-1]) { - l.pop(); - } - return this; - }, - - /** this -= that. Does not normalize. */ - subM: function(that) { - if (typeof(that) !== "object") { that = new this._class(that); } - var i, l=this.limbs, ll=that.limbs; - for (i=l.length; i 0; ci--) { - that.halveM(); - if (out.greaterEquals(that)) { - out.subM(that).normalize(); - } - } - return out.trim(); - }, - - /** return inverse mod prime p. p must be odd. Binary extended Euclidean algorithm mod p. */ - inverseMod: function(p) { - var a = new sjcl.bn(1), b = new sjcl.bn(0), x = new sjcl.bn(this), y = new sjcl.bn(p), tmp, i, nz=1; - - if (!(p.limbs[0] & 1)) { - throw (new sjcl.exception.invalid("inverseMod: p must be odd")); - } - - // invariant: y is odd - do { - if (x.limbs[0] & 1) { - if (!x.greaterEquals(y)) { - // x < y; swap everything - tmp = x; x = y; y = tmp; - tmp = a; a = b; b = tmp; - } - x.subM(y); - x.normalize(); - - if (!a.greaterEquals(b)) { - a.addM(p); - } - a.subM(b); - } - - // cut everything in half - x.halveM(); - if (a.limbs[0] & 1) { - a.addM(p); - } - a.normalize(); - a.halveM(); - - // check for termination: x ?= 0 - for (i=nz=0; i>(j + 1) == 0) { break; } - - pow = pow.square(); - } - } - - return out; - }, - - /** this * that mod N */ - mulmod: function(that, N) { - return this.mod(N).mul(that.mod(N)).mod(N); - }, - - /** this ^ x mod N */ - powermod: function(x, N) { - x = new sjcl.bn(x); - N = new sjcl.bn(N); - - // Jump to montpowermod if possible. - if ((N.limbs[0] & 1) == 1) { - var montOut = this.montpowermod(x, N); - - if (montOut != false) { return montOut; } // else go to slow powermod - } - - var i, j, l = x.normalize().trim().limbs, out = new this._class(1), pow = this; - - for (i=0; i>(j + 1) == 0) { break; } - - pow = pow.mulmod(pow, N); - } - } - - return out; - }, - - /** this ^ x mod N with Montomery reduction */ - montpowermod: function(x, N) { - x = new sjcl.bn(x).normalize().trim(); - N = new sjcl.bn(N); - - var i, j, - radix = this.radix, - out = new this._class(1), - pow = this.copy(); - - // Generate R as a cap of N. - var R, s, wind, bitsize = x.bitLength(); - - R = new sjcl.bn({ - limbs: N.copy().normalize().trim().limbs.map(function() { return 0; }) - }); - - for (s = this.radix; s > 0; s--) { - if (((N.limbs[N.limbs.length - 1] >> s) & 1) == 1) { - R.limbs[R.limbs.length - 1] = 1 << s; - break; - } - } - - // Calculate window size as a function of the exponent's size. - if (bitsize == 0) { - return this; - } else if (bitsize < 18) { - wind = 1; - } else if (bitsize < 48) { - wind = 3; - } else if (bitsize < 144) { - wind = 4; - } else if (bitsize < 768) { - wind = 5; - } else { - wind = 6; - } - - // Find R' and N' such that R * R' - N * N' = 1. - var RR = R.copy(), NN = N.copy(), RP = new sjcl.bn(1), NP = new sjcl.bn(0), RT = R.copy(); - - while (RT.greaterEquals(1)) { - RT.halveM(); - - if ((RP.limbs[0] & 1) == 0) { - RP.halveM(); - NP.halveM(); - } else { - RP.addM(NN); - RP.halveM(); - - NP.halveM(); - NP.addM(RR); - } - } - - RP = RP.normalize(); - NP = NP.normalize(); - - RR.doubleM(); - var R2 = RR.mulmod(RR, N); - - // Check whether the invariant holds. - // If it doesn't, we can't use Montgomery reduction on this modulus. - if (!RR.mul(RP).sub(N.mul(NP)).equals(1)) { - return false; - } - - var montIn = function(c) { return montMul(c, R2); }, - montMul = function(a, b) { - // Standard Montgomery reduction - var k, ab, right, abBar, mask = (1 << (s + 1)) - 1; - - ab = a.mul(b); - - right = ab.mul(NP); - right.limbs = right.limbs.slice(0, R.limbs.length); - - if (right.limbs.length == R.limbs.length) { - right.limbs[R.limbs.length - 1] &= mask; - } - - right = right.mul(N); - - abBar = ab.add(right).normalize().trim(); - abBar.limbs = abBar.limbs.slice(R.limbs.length - 1); - - // Division. Equivelent to calling *.halveM() s times. - for (k=0; k < abBar.limbs.length; k++) { - if (k > 0) { - abBar.limbs[k - 1] |= (abBar.limbs[k] & mask) << (radix - s - 1); - } - - abBar.limbs[k] = abBar.limbs[k] >> (s + 1); - } - - if (abBar.greaterEquals(N)) { - abBar.subM(N); - } - - return abBar; - }, - montOut = function(c) { return montMul(c, 1); }; - - pow = montIn(pow); - out = montIn(out); - - // Sliding-Window Exponentiation (HAC 14.85) - var h, precomp = {}, cap = (1 << (wind - 1)) - 1; - - precomp[1] = pow.copy(); - precomp[2] = montMul(pow, pow); - - for (h=1; h<=cap; h++) { - precomp[(2 * h) + 1] = montMul(precomp[(2 * h) - 1], precomp[2]); - } - - var getBit = function(exp, i) { // Gets ith bit of exp. - var off = i % exp.radix; - - return (exp.limbs[Math.floor(i / exp.radix)] & (1 << off)) >> off; - }; - - for (i = x.bitLength() - 1; i >= 0; ) { - if (getBit(x, i) == 0) { - // If the next bit is zero: - // Square, move forward one bit. - out = montMul(out, out); - i = i - 1; - } else { - // If the next bit is one: - // Find the longest sequence of bits after this one, less than `wind` - // bits long, that ends with a 1. Convert the sequence into an - // integer and look up the pre-computed value to add. - var l = i - wind + 1; - - while (getBit(x, l) == 0) { - l++; - } - - var indx = 0; - for (j = l; j <= i; j++) { - indx += getBit(x, j) << (j - l); - out = montMul(out, out); - } - - out = montMul(out, precomp[indx]); - - i = l - 1; - } - } - - return montOut(out); - }, - - trim: function() { - var l = this.limbs, p; - do { - p = l.pop(); - } while (l.length && p === 0); - l.push(p); - return this; - }, - - /** Reduce mod a modulus. Stubbed for subclassing. */ - reduce: function() { - return this; - }, - - /** Reduce and normalize. */ - fullReduce: function() { - return this.normalize(); - }, - - /** Propagate carries. */ - normalize: function() { - var carry=0, i, pv = this.placeVal, ipv = this.ipv, l, m, limbs = this.limbs, ll = limbs.length, mask = this.radixMask; - for (i=0; i < ll || (carry !== 0 && carry !== -1); i++) { - l = (limbs[i]||0) + carry; - m = limbs[i] = l & mask; - carry = (l-m)*ipv; - } - if (carry === -1) { - limbs[i-1] -= pv; - } - this.trim(); - return this; - }, - - /** Constant-time normalize. Does not allocate additional space. */ - cnormalize: function() { - var carry=0, i, ipv = this.ipv, l, m, limbs = this.limbs, ll = limbs.length, mask = this.radixMask; - for (i=0; i < ll-1; i++) { - l = limbs[i] + carry; - m = limbs[i] = l & mask; - carry = (l-m)*ipv; - } - limbs[i] += carry; - return this; - }, - - /** Serialize to a bit array */ - toBits: function(len) { - this.fullReduce(); - len = len || this.exponent || this.bitLength(); - var i = Math.floor((len-1)/24), w=sjcl.bitArray, e = (len + 7 & -8) % this.radix || this.radix, - out = [w.partial(e, this.getLimb(i))]; - for (i--; i >= 0; i--) { - out = w.concat(out, [w.partial(Math.min(this.radix,len), this.getLimb(i))]); - len -= this.radix; - } - return out; - }, - - /** Return the length in bits, rounded up to the nearest byte. */ - bitLength: function() { - this.fullReduce(); - var out = this.radix * (this.limbs.length - 1), - b = this.limbs[this.limbs.length - 1]; - for (; b; b >>>= 1) { - out ++; - } - return out+7 & -8; - } -}; - -/** @memberOf sjcl.bn -* @this { sjcl.bn } -*/ -sjcl.bn.fromBits = function(bits) { - var Class = this, out = new Class(), words=[], w=sjcl.bitArray, t = this.prototype, - l = Math.min(this.bitLength || 0x100000000, w.bitLength(bits)), e = l % t.radix || t.radix; - - words[0] = w.extract(bits, 0, e); - for (; e < l; e += t.radix) { - words.unshift(w.extract(bits, e, t.radix)); - } - - out.limbs = words; - return out; -}; - - - -sjcl.bn.prototype.ipv = 1 / (sjcl.bn.prototype.placeVal = Math.pow(2,sjcl.bn.prototype.radix)); -sjcl.bn.prototype.radixMask = (1 << sjcl.bn.prototype.radix) - 1; - -/** - * Creates a new subclass of bn, based on reduction modulo a pseudo-Mersenne prime, - * i.e. a prime of the form 2^e + sum(a * 2^b),where the sum is negative and sparse. - */ -sjcl.bn.pseudoMersennePrime = function(exponent, coeff) { - /** @constructor - * @private - */ - function p(it) { - this.initWith(it); - /*if (this.limbs[this.modOffset]) { - this.reduce(); - }*/ - } - - var ppr = p.prototype = new sjcl.bn(), i, tmp, mo; - mo = ppr.modOffset = Math.ceil(tmp = exponent / ppr.radix); - ppr.exponent = exponent; - ppr.offset = []; - ppr.factor = []; - ppr.minOffset = mo; - ppr.fullMask = 0; - ppr.fullOffset = []; - ppr.fullFactor = []; - ppr.modulus = p.modulus = new sjcl.bn(Math.pow(2,exponent)); - - ppr.fullMask = 0|-Math.pow(2, exponent % ppr.radix); - - for (i=0; i mo) { - l = limbs.pop(); - ll = limbs.length; - for (k=0; k> 3) & 15)) * 0x1010101; - - /* Pad and encrypt. */ - iv = prp.encrypt(xor(iv,w.concat(plaintext,[bl,bl,bl,bl]).slice(i,i+4))); - output.splice(i,0,iv[0],iv[1],iv[2],iv[3]); - return output; - }, - - /** Decrypt in CBC mode. - * @param {Object} prp The block cipher. It must have a block size of 16 bytes. - * @param {bitArray} ciphertext The ciphertext data. - * @param {bitArray} iv The initialization value. - * @param {bitArray} [adata=[]] The authenticated data. It must be empty. - * @return The decrypted data, an array of bytes. - * @throws {sjcl.exception.invalid} if the IV isn't exactly 128 bits, or if any adata is specified. - * @throws {sjcl.exception.corrupt} if if the message is corrupt. - */ - decrypt: function(prp, ciphertext, iv, adata) { - if (adata && adata.length) { - throw new sjcl.exception.invalid("cbc can't authenticate data"); - } - if (sjcl.bitArray.bitLength(iv) !== 128) { - throw new sjcl.exception.invalid("cbc iv must be 128 bits"); - } - if ((sjcl.bitArray.bitLength(ciphertext) & 127) || !ciphertext.length) { - throw new sjcl.exception.corrupt("cbc ciphertext must be a positive multiple of the block size"); - } - var i, - w = sjcl.bitArray, - xor = w._xor4, - bi, bo, - output = []; - - adata = adata || []; - - for (i=0; i 16) { - throw new sjcl.exception.corrupt("pkcs#5 padding corrupt"); - } - bo = bi * 0x1010101; - if (!w.equal(w.bitSlice([bo,bo,bo,bo], 0, bi*8), - w.bitSlice(output, output.length*32 - bi*8, output.length*32))) { - throw new sjcl.exception.corrupt("pkcs#5 padding corrupt"); - } - - return w.bitSlice(output, 0, output.length*32 - bi*8); - } - }; -}; diff --git a/sjcl/core/ccm.js b/sjcl/core/ccm.js deleted file mode 100644 index 00c2feab..00000000 --- a/sjcl/core/ccm.js +++ /dev/null @@ -1,220 +0,0 @@ -/** @fileOverview CCM mode implementation. - * - * Special thanks to Roy Nicholson for pointing out a bug in our - * implementation. - * - * @author Emily Stark - * @author Mike Hamburg - * @author Dan Boneh - */ - -/** - * CTR mode with CBC MAC. - * @namespace - */ -sjcl.mode.ccm = { - /** The name of the mode. - * @constant - */ - name: "ccm", - - _progressListeners: [], - - listenProgress: function (cb) { - sjcl.mode.ccm._progressListeners.push(cb); - }, - - unListenProgress: function (cb) { - var index = sjcl.mode.ccm._progressListeners.indexOf(cb); - if (index > -1) { - sjcl.mode.ccm._progressListeners.splice(index, 1); - } - }, - - _callProgressListener: function (val) { - var p = sjcl.mode.ccm._progressListeners.slice(), i; - - for (i = 0; i < p.length; i += 1) { - p[i](val); - } - }, - - /** Encrypt in CCM mode. - * @static - * @param {Object} prf The pseudorandom function. It must have a block size of 16 bytes. - * @param {bitArray} plaintext The plaintext data. - * @param {bitArray} iv The initialization value. - * @param {bitArray} [adata=[]] The authenticated data. - * @param {Number} [tlen=64] the desired tag length, in bits. - * @return {bitArray} The encrypted data, an array of bytes. - */ - encrypt: function(prf, plaintext, iv, adata, tlen) { - var L, out = plaintext.slice(0), tag, w=sjcl.bitArray, ivl = w.bitLength(iv) / 8, ol = w.bitLength(out) / 8; - tlen = tlen || 64; - adata = adata || []; - - if (ivl < 7) { - throw new sjcl.exception.invalid("ccm: iv must be at least 7 bytes"); - } - - // compute the length of the length - for (L=2; L<4 && ol >>> 8*L; L++) {} - if (L < 15 - ivl) { L = 15-ivl; } - iv = w.clamp(iv,8*(15-L)); - - // compute the tag - tag = sjcl.mode.ccm._computeTag(prf, plaintext, iv, adata, tlen, L); - - // encrypt - out = sjcl.mode.ccm._ctrMode(prf, out, iv, tag, tlen, L); - - return w.concat(out.data, out.tag); - }, - - /** Decrypt in CCM mode. - * @static - * @param {Object} prf The pseudorandom function. It must have a block size of 16 bytes. - * @param {bitArray} ciphertext The ciphertext data. - * @param {bitArray} iv The initialization value. - * @param {bitArray} [adata=[]] adata The authenticated data. - * @param {Number} [tlen=64] tlen the desired tag length, in bits. - * @return {bitArray} The decrypted data. - */ - decrypt: function(prf, ciphertext, iv, adata, tlen) { - tlen = tlen || 64; - adata = adata || []; - var L, - w=sjcl.bitArray, - ivl = w.bitLength(iv) / 8, - ol = w.bitLength(ciphertext), - out = w.clamp(ciphertext, ol - tlen), - tag = w.bitSlice(ciphertext, ol - tlen), tag2; - - - ol = (ol - tlen) / 8; - - if (ivl < 7) { - throw new sjcl.exception.invalid("ccm: iv must be at least 7 bytes"); - } - - // compute the length of the length - for (L=2; L<4 && ol >>> 8*L; L++) {} - if (L < 15 - ivl) { L = 15-ivl; } - iv = w.clamp(iv,8*(15-L)); - - // decrypt - out = sjcl.mode.ccm._ctrMode(prf, out, iv, tag, tlen, L); - - // check the tag - tag2 = sjcl.mode.ccm._computeTag(prf, out.data, iv, adata, tlen, L); - if (!w.equal(out.tag, tag2)) { - throw new sjcl.exception.corrupt("ccm: tag doesn't match"); - } - - return out.data; - }, - - _macAdditionalData: function (prf, adata, iv, tlen, ol, L) { - var mac, tmp, i, macData = [], w=sjcl.bitArray, xor = w._xor4; - - // mac the flags - mac = [w.partial(8, (adata.length ? 1<<6 : 0) | (tlen-2) << 2 | L-1)]; - - // mac the iv and length - mac = w.concat(mac, iv); - mac[3] |= ol; - mac = prf.encrypt(mac); - - if (adata.length) { - // mac the associated data. start with its length... - tmp = w.bitLength(adata)/8; - if (tmp <= 0xFEFF) { - macData = [w.partial(16, tmp)]; - } else if (tmp <= 0xFFFFFFFF) { - macData = w.concat([w.partial(16,0xFFFE)], [tmp]); - } // else ... - - // mac the data itself - macData = w.concat(macData, adata); - for (i=0; i 16) { - throw new sjcl.exception.invalid("ccm: invalid tag length"); - } - - if (adata.length > 0xFFFFFFFF || plaintext.length > 0xFFFFFFFF) { - // I don't want to deal with extracting high words from doubles. - throw new sjcl.exception.bug("ccm: can't deal with 4GiB or more data"); - } - - mac = sjcl.mode.ccm._macAdditionalData(prf, adata, iv, tlen, w.bitLength(plaintext)/8, L); - - // mac the plaintext - for (i=0; i n) { - sjcl.mode.ccm._callProgressListener(i/l); - n += p; - } - ctr[3]++; - enc = prf.encrypt(ctr); - data[i] ^= enc[0]; - data[i+1] ^= enc[1]; - data[i+2] ^= enc[2]; - data[i+3] ^= enc[3]; - } - return { tag:tag, data:w.clamp(data,bl) }; - } -}; diff --git a/sjcl/core/ccmArrayBuffer.js b/sjcl/core/ccmArrayBuffer.js deleted file mode 100644 index 15b14e86..00000000 --- a/sjcl/core/ccmArrayBuffer.js +++ /dev/null @@ -1,249 +0,0 @@ -/** @fileOverview Really fast & small implementation of CCM using JS' array buffers - * - * @author Marco Munizaga - */ - -/** - * CTR mode with CBC MAC. - * @namespace - */ -sjcl.arrayBuffer = sjcl.arrayBuffer || {}; - -//patch arraybuffers if they don't exist -if (typeof(ArrayBuffer) === 'undefined') { - (function(globals){ - "use strict"; - globals.ArrayBuffer = function(){}; - globals.DataView = function(){}; - }(this)); -} - - -sjcl.arrayBuffer.ccm = { - mode: "ccm", - - defaults: { - tlen:128 //this is M in the NIST paper - }, - - /** Encrypt in CCM mode. Meant to return the same exact thing as the bitArray ccm to work as a drop in replacement - * @static - * @param {Object} prf The pseudorandom function. It must have a block size of 16 bytes. - * @param {bitArray} plaintext The plaintext data. - * @param {bitArray} iv The initialization value. - * @param {bitArray} [adata=[]] The authenticated data. - * @param {Number} [tlen=64] the desired tag length, in bits. - * @return {bitArray} The encrypted data, an array of bytes. - */ - compat_encrypt: function(prf, plaintext, iv, adata, tlen){ - var plaintext_buffer = sjcl.codec.arrayBuffer.fromBits(plaintext, true, 16), - ol = sjcl.bitArray.bitLength(plaintext)/8, - encrypted_obj, - ct, - tag; - - tlen = tlen || 64; - adata = adata || []; - - encrypted_obj = sjcl.arrayBuffer.ccm.encrypt(prf, plaintext_buffer, iv, adata, tlen, ol); - ct = sjcl.codec.arrayBuffer.toBits(encrypted_obj.ciphertext_buffer); - - ct = sjcl.bitArray.clamp(ct, ol*8); - - - return sjcl.bitArray.concat(ct, encrypted_obj.tag); - }, - - /** Decrypt in CCM mode. Meant to imitate the bitArray ccm - * @static - * @param {Object} prf The pseudorandom function. It must have a block size of 16 bytes. - * @param {bitArray} ciphertext The ciphertext data. - * @param {bitArray} iv The initialization value. - * @param {bitArray} [adata=[]] adata The authenticated data. - * @param {Number} [tlen=64] tlen the desired tag length, in bits. - * @return {bitArray} The decrypted data. - */ - compat_decrypt: function(prf, ciphertext, iv, adata, tlen){ - tlen = tlen || 64; - adata = adata || []; - var L, i, - w=sjcl.bitArray, - ol = w.bitLength(ciphertext), - out = w.clamp(ciphertext, ol - tlen), - tag = w.bitSlice(ciphertext, ol - tlen), tag2, - ciphertext_buffer = sjcl.codec.arrayBuffer.fromBits(out, true, 16); - - var plaintext_buffer = sjcl.arrayBuffer.ccm.decrypt(prf, ciphertext_buffer, iv, tag, adata, tlen, (ol-tlen)/8); - return sjcl.bitArray.clamp(sjcl.codec.arrayBuffer.toBits(plaintext_buffer), ol-tlen); - - }, - - /** Really fast ccm encryption, uses arraybufer and mutates the plaintext buffer - * @static - * @param {Object} prf The pseudorandom function. It must have a block size of 16 bytes. - * @param {ArrayBuffer} plaintext_buffer The plaintext data. - * @param {bitArray} iv The initialization value. - * @param {ArrayBuffer} [adata=[]] The authenticated data. - * @param {Number} [tlen=128] the desired tag length, in bits. - * @return {ArrayBuffer} The encrypted data, in the same array buffer as the given plaintext, but given back anyways - */ - encrypt: function(prf, plaintext_buffer, iv, adata, tlen, ol){ - var auth_blocks, mac, L, w = sjcl.bitArray, - ivl = w.bitLength(iv) / 8; - - //set up defaults - adata = adata || []; - tlen = tlen || sjcl.arrayBuffer.ccm.defaults.tlen; - ol = ol || plaintext_buffer.byteLength; - tlen = Math.ceil(tlen/8); - - for (L=2; L<4 && ol >>> 8*L; L++) {} - if (L < 15 - ivl) { L = 15-ivl; } - iv = w.clamp(iv,8*(15-L)); - - //prf should use a 256 bit key to make precomputation attacks infeasible - - mac = sjcl.arrayBuffer.ccm._computeTag(prf, plaintext_buffer, iv, adata, tlen, ol, L); - - //encrypt the plaintext and the mac - //returns the mac since the plaintext will be left encrypted inside the buffer - mac = sjcl.arrayBuffer.ccm._ctrMode(prf, plaintext_buffer, iv, mac, tlen, L); - - - //the plaintext_buffer has been modified so it is now the ciphertext_buffer - return {'ciphertext_buffer':plaintext_buffer, 'tag':mac}; - }, - - /** Really fast ccm decryption, uses arraybufer and mutates the given buffer - * @static - * @param {Object} prf The pseudorandom function. It must have a block size of 16 bytes. - * @param {ArrayBuffer} ciphertext_buffer The Ciphertext data. - * @param {bitArray} iv The initialization value. - * @param {bitArray} The authentication tag for the ciphertext - * @param {ArrayBuffer} [adata=[]] The authenticated data. - * @param {Number} [tlen=128] the desired tag length, in bits. - * @return {ArrayBuffer} The decrypted data, in the same array buffer as the given buffer, but given back anyways - */ - decrypt: function(prf, ciphertext_buffer, iv, tag, adata, tlen, ol){ - var mac, mac2, i, L, w = sjcl.bitArray, - ivl = w.bitLength(iv) / 8; - - //set up defaults - adata = adata || []; - tlen = tlen || sjcl.arrayBuffer.ccm.defaults.tlen; - ol = ol || ciphertext_buffer.byteLength; - tlen = Math.ceil(tlen/8) ; - - for (L=2; L<4 && ol >>> 8*L; L++) {} - if (L < 15 - ivl) { L = 15-ivl; } - iv = w.clamp(iv,8*(15-L)); - - //prf should use a 256 bit key to make precomputation attacks infeasible - - //decrypt the buffer - mac = sjcl.arrayBuffer.ccm._ctrMode(prf, ciphertext_buffer, iv, tag, tlen, L); - - mac2 = sjcl.arrayBuffer.ccm._computeTag(prf, ciphertext_buffer, iv, adata, tlen, ol, L); - - //check the tag - if (!sjcl.bitArray.equal(mac, mac2)){ - throw new sjcl.exception.corrupt("ccm: tag doesn't match"); - } - - return ciphertext_buffer; - - }, - - /* Compute the (unencrypted) authentication tag, according to the CCM specification - * @param {Object} prf The pseudorandom function. - * @param {ArrayBuffer} data_buffer The plaintext data in an arraybuffer. - * @param {bitArray} iv The initialization value. - * @param {bitArray} adata The authenticated data. - * @param {Number} tlen the desired tag length, in bits. - * @return {bitArray} The tag, but not yet encrypted. - * @private - */ - _computeTag: function(prf, data_buffer, iv, adata, tlen, ol, L){ - var i, plaintext, mac, data, data_blocks_size, data_blocks, - w = sjcl.bitArray, tmp, macData; - - mac = sjcl.mode.ccm._macAdditionalData(prf, adata, iv, tlen, ol, L); - - if (data_buffer.byteLength !== 0) { - data = new DataView(data_buffer); - //set padding bytes to 0 - for (i=ol; i< data_buffer.byteLength; i++){ - data.setUint8(i,0); - } - - //now to mac the plaintext blocks - for (i=0; i < data.byteLength; i+=16){ - mac[0] ^= data.getUint32(i); - mac[1] ^= data.getUint32(i+4); - mac[2] ^= data.getUint32(i+8); - mac[3] ^= data.getUint32(i+12); - - mac = prf.encrypt(mac); - } - } - - return sjcl.bitArray.clamp(mac,tlen*8); - }, - - /** CCM CTR mode. - * Encrypt or decrypt data and tag with the prf in CCM-style CTR mode. - * Mutates given array buffer - * @param {Object} prf The PRF. - * @param {ArrayBuffer} data_buffer The data to be encrypted or decrypted. - * @param {bitArray} iv The initialization vector. - * @param {bitArray} tag The authentication tag. - * @param {Number} tlen The length of th etag, in bits. - * @return {Object} An object with data and tag, the en/decryption of data and tag values. - * @private - */ - _ctrMode: function(prf, data_buffer, iv, mac, tlen, L){ - var data, ctr, word0, word1, word2, word3, keyblock, i, w = sjcl.bitArray, xor = w._xor4, n = data_buffer.byteLength/50, p = n; - - ctr = new DataView(new ArrayBuffer(16)); //create the first block for the counter - - //prf should use a 256 bit key to make precomputation attacks infeasible - - // start the ctr - ctr = w.concat([w.partial(8,L-1)],iv).concat([0,0,0]).slice(0,4); - - // en/decrypt the tag - mac = w.bitSlice(xor(mac,prf.encrypt(ctr)), 0, tlen*8); - - ctr[3]++; - if (ctr[3]===0) ctr[2]++; //increment higher bytes if the lowest 4 bytes are 0 - - if (data_buffer.byteLength !== 0) { - data = new DataView(data_buffer); - //now lets encrypt the message - for (i=0; i n) { - sjcl.mode.ccm._callProgressListener(i/data_buffer.byteLength); - n += p; - } - keyblock = prf.encrypt(ctr); - - word0 = data.getUint32(i); - word1 = data.getUint32(i+4); - word2 = data.getUint32(i+8); - word3 = data.getUint32(i+12); - - data.setUint32(i,word0 ^ keyblock[0]); - data.setUint32(i+4, word1 ^ keyblock[1]); - data.setUint32(i+8, word2 ^ keyblock[2]); - data.setUint32(i+12, word3 ^ keyblock[3]); - - ctr[3]++; - if (ctr[3]===0) ctr[2]++; //increment higher bytes if the lowest 4 bytes are 0 - } - } - - //return the mac, the ciphered data is available through the same data_buffer that was given - return mac; - } - -}; diff --git a/sjcl/core/codecArrayBuffer.js b/sjcl/core/codecArrayBuffer.js deleted file mode 100644 index cc100497..00000000 --- a/sjcl/core/codecArrayBuffer.js +++ /dev/null @@ -1,116 +0,0 @@ -/** @fileOverview Bit array codec implementations. - * - * @author Marco Munizaga - */ - -//patch arraybuffers if they don't exist -if (typeof(ArrayBuffer) === 'undefined') { - (function(globals){ - "use strict"; - globals.ArrayBuffer = function(){}; - globals.DataView = function(){}; - }(this)); -} - -/** - * ArrayBuffer - * @namespace - */ -sjcl.codec.arrayBuffer = { - /** Convert from a bitArray to an ArrayBuffer. - * Will default to 8byte padding if padding is undefined*/ - fromBits: function (arr, padding, padding_count) { - var out, i, ol, tmp, smallest; - padding = padding==undefined ? true : padding; - padding_count = padding_count || 8; - - if (arr.length === 0) { - return new ArrayBuffer(0); - } - - ol = sjcl.bitArray.bitLength(arr)/8; - - //check to make sure the bitLength is divisible by 8, if it isn't - //we can't do anything since arraybuffers work with bytes, not bits - if ( sjcl.bitArray.bitLength(arr)%8 !== 0 ) { - throw new sjcl.exception.invalid("Invalid bit size, must be divisble by 8 to fit in an arraybuffer correctly"); - } - - if (padding && ol%padding_count !== 0){ - ol += padding_count - (ol%padding_count); - } - - - //padded temp for easy copying - tmp = new DataView(new ArrayBuffer(arr.length*4)); - for (i=0; i= width ? n : new Array(width - n.length + 1).join('0') + n; - }; - - for (var i = 0; i < stringBufferView.byteLength; i+=2) { - if (i%16 == 0) string += ('\n'+(i).toString(16)+'\t'); - string += ( pad(stringBufferView.getUint16(i).toString(16),4) + ' '); - } - - if ( typeof console === undefined ){ - console = console || {log:function(){}}; //fix for IE - } - console.log(string.toUpperCase()); - } -}; - diff --git a/sjcl/core/codecBase32.js b/sjcl/core/codecBase32.js deleted file mode 100644 index ed80269e..00000000 --- a/sjcl/core/codecBase32.js +++ /dev/null @@ -1,91 +0,0 @@ -/** @fileOverview Bit array codec implementations. - * - * @author Nils Kenneweg - */ - -/** - * Base32 encoding/decoding - * @namespace - */ -sjcl.codec.base32 = { - /** The base32 alphabet. - * @private - */ - _chars: "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567", - _hexChars: "0123456789ABCDEFGHIJKLMNOPQRSTUV", - - /* bits in an array */ - BITS: 32, - /* base to encode at (2^x) */ - BASE: 5, - /* bits - base */ - REMAINING: 27, - - /** Convert from a bitArray to a base32 string. */ - fromBits: function (arr, _noEquals, _hex) { - var BITS = sjcl.codec.base32.BITS, BASE = sjcl.codec.base32.BASE, REMAINING = sjcl.codec.base32.REMAINING; - var out = "", i, bits=0, c = sjcl.codec.base32._chars, ta=0, bl = sjcl.bitArray.bitLength(arr); - - if (_hex) { - c = sjcl.codec.base32._hexChars; - } - - for (i=0; out.length * BASE < bl; ) { - out += c.charAt((ta ^ arr[i]>>>bits) >>> REMAINING); - if (bits < BASE) { - ta = arr[i] << (BASE-bits); - bits += REMAINING; - i++; - } else { - ta <<= BASE; - bits -= BASE; - } - } - while ((out.length & 7) && !_noEquals) { out += "="; } - - return out; - }, - - /** Convert from a base32 string to a bitArray */ - toBits: function(str, _hex) { - str = str.replace(/\s|=/g,'').toUpperCase(); - var BITS = sjcl.codec.base32.BITS, BASE = sjcl.codec.base32.BASE, REMAINING = sjcl.codec.base32.REMAINING; - var out = [], i, bits=0, c = sjcl.codec.base32._chars, ta=0, x, format="base32"; - - if (_hex) { - c = sjcl.codec.base32._hexChars; - format = "base32hex"; - } - - for (i=0; i REMAINING) { - bits -= REMAINING; - out.push(ta ^ x>>>bits); - ta = x << (BITS-bits); - } else { - bits += BASE; - ta ^= x << (BITS-bits); - } - } - if (bits&56) { - out.push(sjcl.bitArray.partial(bits&56, ta, 1)); - } - return out; - } -}; - -sjcl.codec.base32hex = { - fromBits: function (arr, _noEquals) { return sjcl.codec.base32.fromBits(arr,_noEquals,1); }, - toBits: function (str) { return sjcl.codec.base32.toBits(str,1); } -}; diff --git a/sjcl/core/codecBase64.js b/sjcl/core/codecBase64.js deleted file mode 100644 index fc0dbb00..00000000 --- a/sjcl/core/codecBase64.js +++ /dev/null @@ -1,70 +0,0 @@ -/** @fileOverview Bit array codec implementations. - * - * @author Emily Stark - * @author Mike Hamburg - * @author Dan Boneh - */ - -/** - * Base64 encoding/decoding - * @namespace - */ -sjcl.codec.base64 = { - /** The base64 alphabet. - * @private - */ - _chars: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", - - /** Convert from a bitArray to a base64 string. */ - fromBits: function (arr, _noEquals, _url) { - var out = "", i, bits=0, c = sjcl.codec.base64._chars, ta=0, bl = sjcl.bitArray.bitLength(arr); - if (_url) { - c = c.substr(0,62) + '-_'; - } - for (i=0; out.length * 6 < bl; ) { - out += c.charAt((ta ^ arr[i]>>>bits) >>> 26); - if (bits < 6) { - ta = arr[i] << (6-bits); - bits += 26; - i++; - } else { - ta <<= 6; - bits -= 6; - } - } - while ((out.length & 3) && !_noEquals) { out += "="; } - return out; - }, - - /** Convert from a base64 string to a bitArray */ - toBits: function(str, _url) { - str = str.replace(/\s|=/g,''); - var out = [], i, bits=0, c = sjcl.codec.base64._chars, ta=0, x; - if (_url) { - c = c.substr(0,62) + '-_'; - } - for (i=0; i 26) { - bits -= 26; - out.push(ta ^ x>>>bits); - ta = x << (32-bits); - } else { - bits += 6; - ta ^= x << (32-bits); - } - } - if (bits&56) { - out.push(sjcl.bitArray.partial(bits&56, ta, 1)); - } - return out; - } -}; - -sjcl.codec.base64url = { - fromBits: function (arr) { return sjcl.codec.base64.fromBits(arr,1,1); }, - toBits: function (str) { return sjcl.codec.base64.toBits(str,1); } -}; diff --git a/sjcl/core/codecBytes.js b/sjcl/core/codecBytes.js deleted file mode 100644 index cc8e818d..00000000 --- a/sjcl/core/codecBytes.js +++ /dev/null @@ -1,40 +0,0 @@ -/** @fileOverview Bit array codec implementations. - * - * @author Emily Stark - * @author Mike Hamburg - * @author Dan Boneh - */ - -/** - * Arrays of bytes - * @namespace - */ -sjcl.codec.bytes = { - /** Convert from a bitArray to an array of bytes. */ - fromBits: function (arr) { - var out = [], bl = sjcl.bitArray.bitLength(arr), i, tmp; - for (i=0; i>> 24); - tmp <<= 8; - } - return out; - }, - /** Convert from an array of bytes to a bitArray. */ - toBits: function (bytes) { - var out = [], i, tmp=0; - for (i=0; i>> 8 >>> 8 >>> 8); - tmp <<= 8; - } - return decodeURIComponent(escape(out)); - }, - - /** Convert from a UTF-8 string to a bitArray. */ - toBits: function (str) { - str = unescape(encodeURIComponent(str)); - var out = [], i, tmp=0; - for (i=0; i()[]{}@%$#", - - /** The decoder map (maps base 85 to base 256). - * @private - */ - _byteMap: [ - 0x00, 0x44, 0x00, 0x54, 0x53, 0x52, 0x48, 0x00, - 0x4B, 0x4C, 0x46, 0x41, 0x00, 0x3F, 0x3E, 0x45, - 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, - 0x08, 0x09, 0x40, 0x00, 0x49, 0x42, 0x4A, 0x47, - 0x51, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, - 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, 0x30, 0x31, 0x32, - 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, - 0x3B, 0x3C, 0x3D, 0x4D, 0x00, 0x4E, 0x43, 0x00, - 0x00, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, - 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, - 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, - 0x21, 0x22, 0x23, 0x4F, 0x00, 0x50, 0x00, 0x00 - ], - - /** - * @summary Method to convert a bitArray to a Z85-encoded string. - * The bits represented by the array MUST be multiples of 4 bytes. - * @param {bitArray} arr - The input bitArray. - * @return {string} The Z85-encoded string. - */ - fromBits: function (arr) { - // Sanity checks - if (!arr) { - return null; - } - // Check we have multiples of 4 bytes (32 bits) - if (0 !== sjcl.bitArray.bitLength(arr) % 32) { - throw new sjcl.exception.invalid("Invalid bitArray length!"); - } - - var out = "", c = sjcl.codec.z85._chars; - - // Convert sequences of 4 bytes (each word) to 5 characters. - for (var i = 0; i < arr.length; ++i) { - // Each element in the bitArray is a 32-bit (4-byte) word. - var word = arr[i]; - var value = 0; - for (var j = 0; j < 4; ++j) { - // Extract each successive byte from the word from the left. - var byteChunk = (word >>> 8*(4 - j - 1)) & 0xFF; - // Accumulate in base-256 - value = value*256 + byteChunk; - } - var divisor = 85*85*85*85; - while (divisor) { - out += c.charAt(Math.floor(value/divisor) % 85); - divisor = Math.floor(divisor/85); - } - } - - // Sanity check - each 4-bytes (1 word) should yield 5 characters. - var encodedSize = arr.length*5; - if (out.length !== encodedSize) { - throw new sjcl.exception.invalid("Bad Z85 conversion!"); - } - return out; - }, - - /** - * @summary Method to convert a Z85-encoded string to a bitArray. - * The length of the string MUST be a multiple of 5 - * (else it is not a valid Z85 string). - * @param {string} str - A valid Z85-encoded string. - * @return {bitArray} The decoded data represented as a bitArray. - */ - toBits: function(str) { - // Sanity check - if (!str) { - return []; - } - // Accept only strings bounded to 5 bytes - if (0 !== str.length % 5) { - throw new sjcl.exception.invalid("Invalid Z85 string!"); - } - - var out = [], value = 0, byteMap = sjcl.codec.z85._byteMap; - var word = 0, wordSize = 0; - for (var i = 0; i < str.length;) { - // Accumulate value in base 85. - value = value * 85 + byteMap[str[i++].charCodeAt(0) - 32]; - if (0 === i % 5) { - // Output value in base-256 - var divisor = 256*256*256; - while (divisor) { - // The following is equivalent to a left shift by 8 bits - // followed by OR-ing; however, left shift may cause sign problems - // due to 2's complement interpretation, - // and we're operating on unsigned values. - word = (word * Math.pow(2, 8)) + (Math.floor(value/divisor) % 256); - ++wordSize; - // If 4 bytes have been acumulated, push the word into the bitArray. - if (4 === wordSize) { - out.push(word); - word = 0, wordSize = 0; - } - divisor = Math.floor(divisor/256); - } - value = 0; - } - } - - return out; - } -} diff --git a/sjcl/core/convenience.js b/sjcl/core/convenience.js deleted file mode 100644 index 909e12da..00000000 --- a/sjcl/core/convenience.js +++ /dev/null @@ -1,327 +0,0 @@ -/** @fileOverview Convenience functions centered around JSON encapsulation. - * - * @author Emily Stark - * @author Mike Hamburg - * @author Dan Boneh - */ - - /** - * JSON encapsulation - * @namespace - */ - sjcl.json = { - /** Default values for encryption */ - defaults: { v:1, iter:10000, ks:128, ts:64, mode:"ccm", adata:"", cipher:"aes" }, - - /** Simple encryption function. - * @param {String|bitArray} password The password or key. - * @param {String} plaintext The data to encrypt. - * @param {Object} [params] The parameters including tag, iv and salt. - * @param {Object} [rp] A returned version with filled-in parameters. - * @return {Object} The cipher raw data. - * @throws {sjcl.exception.invalid} if a parameter is invalid. - */ - _encrypt: function (password, plaintext, params, rp) { - params = params || {}; - rp = rp || {}; - - var j = sjcl.json, p = j._add({ iv: sjcl.random.randomWords(4,0) }, - j.defaults), tmp, prp, adata; - j._add(p, params); - adata = p.adata; - if (typeof p.salt === "string") { - p.salt = sjcl.codec.base64.toBits(p.salt); - } - if (typeof p.iv === "string") { - p.iv = sjcl.codec.base64.toBits(p.iv); - } - - if (!sjcl.mode[p.mode] || - !sjcl.cipher[p.cipher] || - (typeof password === "string" && p.iter <= 100) || - (p.ts !== 64 && p.ts !== 96 && p.ts !== 128) || - (p.ks !== 128 && p.ks !== 192 && p.ks !== 256) || - (p.iv.length < 2 || p.iv.length > 4)) { - throw new sjcl.exception.invalid("json encrypt: invalid parameters"); - } - - if (typeof password === "string") { - tmp = sjcl.misc.cachedPbkdf2(password, p); - password = tmp.key.slice(0,p.ks/32); - p.salt = tmp.salt; - } else if (sjcl.ecc && password instanceof sjcl.ecc.elGamal.publicKey) { - tmp = password.kem(); - p.kemtag = tmp.tag; - password = tmp.key.slice(0,p.ks/32); - } - if (typeof plaintext === "string") { - plaintext = sjcl.codec.utf8String.toBits(plaintext); - } - if (typeof adata === "string") { - p.adata = adata = sjcl.codec.utf8String.toBits(adata); - } - prp = new sjcl.cipher[p.cipher](password); - - /* return the json data */ - j._add(rp, p); - rp.key = password; - - /* do the encryption */ - if (p.mode === "ccm" && sjcl.arrayBuffer && sjcl.arrayBuffer.ccm && plaintext instanceof ArrayBuffer) { - p.ct = sjcl.arrayBuffer.ccm.encrypt(prp, plaintext, p.iv, adata, p.ts); - } else { - p.ct = sjcl.mode[p.mode].encrypt(prp, plaintext, p.iv, adata, p.ts); - } - - //return j.encode(j._subtract(p, j.defaults)); - return p; - }, - - /** Simple encryption function. - * @param {String|bitArray} password The password or key. - * @param {String} plaintext The data to encrypt. - * @param {Object} [params] The parameters including tag, iv and salt. - * @param {Object} [rp] A returned version with filled-in parameters. - * @return {String} The ciphertext serialized data. - * @throws {sjcl.exception.invalid} if a parameter is invalid. - */ - encrypt: function (password, plaintext, params, rp) { - var j = sjcl.json, p = j._encrypt.apply(j, arguments); - return j.encode(p); - }, - - /** Simple decryption function. - * @param {String|bitArray} password The password or key. - * @param {Object} ciphertext The cipher raw data to decrypt. - * @param {Object} [params] Additional non-default parameters. - * @param {Object} [rp] A returned object with filled parameters. - * @return {String} The plaintext. - * @throws {sjcl.exception.invalid} if a parameter is invalid. - * @throws {sjcl.exception.corrupt} if the ciphertext is corrupt. - */ - _decrypt: function (password, ciphertext, params, rp) { - params = params || {}; - rp = rp || {}; - - var j = sjcl.json, p = j._add(j._add(j._add({},j.defaults),ciphertext), params, true), ct, tmp, prp, adata=p.adata; - if (typeof p.salt === "string") { - p.salt = sjcl.codec.base64.toBits(p.salt); - } - if (typeof p.iv === "string") { - p.iv = sjcl.codec.base64.toBits(p.iv); - } - - if (!sjcl.mode[p.mode] || - !sjcl.cipher[p.cipher] || - (typeof password === "string" && p.iter <= 100) || - (p.ts !== 64 && p.ts !== 96 && p.ts !== 128) || - (p.ks !== 128 && p.ks !== 192 && p.ks !== 256) || - (!p.iv) || - (p.iv.length < 2 || p.iv.length > 4)) { - throw new sjcl.exception.invalid("json decrypt: invalid parameters"); - } - - if (typeof password === "string") { - tmp = sjcl.misc.cachedPbkdf2(password, p); - password = tmp.key.slice(0,p.ks/32); - p.salt = tmp.salt; - } else if (sjcl.ecc && password instanceof sjcl.ecc.elGamal.secretKey) { - password = password.unkem(sjcl.codec.base64.toBits(p.kemtag)).slice(0,p.ks/32); - } - if (typeof adata === "string") { - adata = sjcl.codec.utf8String.toBits(adata); - } - prp = new sjcl.cipher[p.cipher](password); - - /* do the decryption */ - if (p.mode === "ccm" && sjcl.arrayBuffer && sjcl.arrayBuffer.ccm && p.ct instanceof ArrayBuffer) { - ct = sjcl.arrayBuffer.ccm.decrypt(prp, p.ct, p.iv, p.tag, adata, p.ts); - } else { - ct = sjcl.mode[p.mode].decrypt(prp, p.ct, p.iv, adata, p.ts); - } - - /* return the json data */ - j._add(rp, p); - rp.key = password; - - if (params.raw === 1) { - return ct; - } else { - return sjcl.codec.utf8String.fromBits(ct); - } - }, - - /** Simple decryption function. - * @param {String|bitArray} password The password or key. - * @param {String} ciphertext The ciphertext to decrypt. - * @param {Object} [params] Additional non-default parameters. - * @param {Object} [rp] A returned object with filled parameters. - * @return {String} The plaintext. - * @throws {sjcl.exception.invalid} if a parameter is invalid. - * @throws {sjcl.exception.corrupt} if the ciphertext is corrupt. - */ - decrypt: function (password, ciphertext, params, rp) { - var j = sjcl.json; - return j._decrypt(password, j.decode(ciphertext), params, rp); - }, - - /** Encode a flat structure into a JSON string. - * @param {Object} obj The structure to encode. - * @return {String} A JSON string. - * @throws {sjcl.exception.invalid} if obj has a non-alphanumeric property. - * @throws {sjcl.exception.bug} if a parameter has an unsupported type. - */ - encode: function (obj) { - var i, out='{', comma=''; - for (i in obj) { - if (obj.hasOwnProperty(i)) { - if (!i.match(/^[a-z0-9]+$/i)) { - throw new sjcl.exception.invalid("json encode: invalid property name"); - } - out += comma + '"' + i + '":'; - comma = ','; - - switch (typeof obj[i]) { - case 'number': - case 'boolean': - out += obj[i]; - break; - - case 'string': - out += '"' + escape(obj[i]) + '"'; - break; - - case 'object': - out += '"' + sjcl.codec.base64.fromBits(obj[i],0) + '"'; - break; - - default: - throw new sjcl.exception.bug("json encode: unsupported type"); - } - } - } - return out+'}'; - }, - - /** Decode a simple (flat) JSON string into a structure. The ciphertext, - * adata, salt and iv will be base64-decoded. - * @param {String} str The string. - * @return {Object} The decoded structure. - * @throws {sjcl.exception.invalid} if str isn't (simple) JSON. - */ - decode: function (str) { - str = str.replace(/\s/g,''); - if (!str.match(/^\{.*\}$/)) { - throw new sjcl.exception.invalid("json decode: this isn't json!"); - } - var a = str.replace(/^\{|\}$/g, '').split(/,/), out={}, i, m; - for (i=0; i= 0; carry--) { - if (++c[carry]) break; // If overflowing, it'll be 0 and we'll have to continue propagating the carry - } - } - return sjcl.bitArray.clamp(d, bl); - } - }; -}; diff --git a/sjcl/core/ecc.js b/sjcl/core/ecc.js deleted file mode 100644 index 9faa05c6..00000000 --- a/sjcl/core/ecc.js +++ /dev/null @@ -1,693 +0,0 @@ -/** - * base class for all ecc operations. - * @namespace - */ -sjcl.ecc = {}; - -/** - * Represents a point on a curve in affine coordinates. - * @constructor - * @param {sjcl.ecc.curve} curve The curve that this point lies on. - * @param {bigInt} x The x coordinate. - * @param {bigInt} y The y coordinate. - */ -sjcl.ecc.point = function(curve,x,y) { - if (x === undefined) { - this.isIdentity = true; - } else { - if (x instanceof sjcl.bn) { - x = new curve.field(x); - } - if (y instanceof sjcl.bn) { - y = new curve.field(y); - } - - this.x = x; - this.y = y; - - this.isIdentity = false; - } - this.curve = curve; -}; - - - -sjcl.ecc.point.prototype = { - toJac: function() { - return new sjcl.ecc.pointJac(this.curve, this.x, this.y, new this.curve.field(1)); - }, - - mult: function(k) { - return this.toJac().mult(k, this).toAffine(); - }, - - /** - * Multiply this point by k, added to affine2*k2, and return the answer in Jacobian coordinates. - * @param {bigInt} k The coefficient to multiply this by. - * @param {bigInt} k2 The coefficient to multiply affine2 this by. - * @param {sjcl.ecc.point} affine The other point in affine coordinates. - * @return {sjcl.ecc.pointJac} The result of the multiplication and addition, in Jacobian coordinates. - */ - mult2: function(k, k2, affine2) { - return this.toJac().mult2(k, this, k2, affine2).toAffine(); - }, - - multiples: function() { - var m, i, j; - if (this._multiples === undefined) { - j = this.toJac().doubl(); - m = [j]; - for (i=3; i<16; i++) { - j = j.add(this); - m.push(j); - } - this._multiples = [new sjcl.ecc.point(this.curve), this].concat(sjcl.ecc.pointJac.toAffineMultiple(m)); - } - return this._multiples; - }, - - negate: function() { - var newY = new this.curve.field(0).sub(this.y).normalize().reduce(); - return new sjcl.ecc.point(this.curve, this.x, newY); - }, - - isValid: function() { - return this.y.square().equals(this.curve.b.add(this.x.mul(this.curve.a.add(this.x.square())))); - }, - - toBits: function() { - return sjcl.bitArray.concat(this.x.toBits(), this.y.toBits()); - } -}; - -/** - * Represents a point on a curve in Jacobian coordinates. Coordinates can be specified as bigInts or strings (which - * will be converted to bigInts). - * - * @constructor - * @param {bigInt/string} x The x coordinate. - * @param {bigInt/string} y The y coordinate. - * @param {bigInt/string} z The z coordinate. - * @param {sjcl.ecc.curve} curve The curve that this point lies on. - */ -sjcl.ecc.pointJac = function(curve, x, y, z) { - if (x === undefined) { - this.isIdentity = true; - } else { - this.x = x; - this.y = y; - this.z = z; - this.isIdentity = false; - } - this.curve = curve; -}; - -/** - * Returns points converted to affine coordinates. - * @param {Array} points An array of {sjcl.ecc.pointJac} to convert. - * @return {Array} An array of {sjcl.ecc.point} that were converted. - */ -sjcl.ecc.pointJac.toAffineMultiple = function (points) { - var i=0, j, ret = new Array(points.length), p, tmp, z, zi, zi2, curve; - for (; i=0; i--) { - p = points[i]; - if (p.isIdentity || p.z.equals(0)) { - ret[i] = new sjcl.ecc.point(p.curve); - } else { - // if not last - if (j >= 0) { - // remove all other inverted z coordinates from product of inverses - // zi is now inverse of p.z - zi = z.mul(tmp[j]); - // remove the inverse of p.z from product of inverses - z = z.mul(p.z); - j--; - } else { - zi = z; - } - zi2 = zi.square(); - ret[i] = new sjcl.ecc.point(p.curve, p.x.mul(zi2).fullReduce(), p.y.mul(zi2.mul(zi)).fullReduce()); - } - } - return ret; -}; - -sjcl.ecc.pointJac.prototype = { - /** - * Adds S and T and returns the result in Jacobian coordinates. Note that S must be in Jacobian coordinates and T must be in affine coordinates. - * @param {sjcl.ecc.pointJac} S One of the points to add, in Jacobian coordinates. - * @param {sjcl.ecc.point} T The other point to add, in affine coordinates. - * @return {sjcl.ecc.pointJac} The sum of the two points, in Jacobian coordinates. - */ - add: function(T) { - var S = this, sz2, c, d, c2, x1, x2, x, y1, y2, y, z; - if (S.curve !== T.curve) { - throw new sjcl.exception.invalid("sjcl.ecc.add(): Points must be on the same curve to add them!"); - } - - if (S.isIdentity) { - return T.toJac(); - } else if (T.isIdentity) { - return S; - } - - sz2 = S.z.square(); - c = T.x.mul(sz2).subM(S.x); - - if (c.equals(0)) { - if (S.y.equals(T.y.mul(sz2.mul(S.z)))) { - // same point - return S.doubl(); - } else { - // inverses - return new sjcl.ecc.pointJac(S.curve); - } - } - - d = T.y.mul(sz2.mul(S.z)).subM(S.y); - c2 = c.square(); - - x1 = d.square(); - x2 = c.square().mul(c).addM( S.x.add(S.x).mul(c2) ); - x = x1.subM(x2); - - y1 = S.x.mul(c2).subM(x).mul(d); - y2 = S.y.mul(c.square().mul(c)); - y = y1.subM(y2); - - z = S.z.mul(c); - - return new sjcl.ecc.pointJac(this.curve,x,y,z); - }, - - /** - * doubles this point. - * @return {sjcl.ecc.pointJac} The doubled point. - */ - doubl: function() { - if (this.isIdentity) { return this; } - - var - y2 = this.y.square(), - a = y2.mul(this.x.mul(4)), - b = y2.square().mul(8), - z2 = this.z.square(), - c = this.curve.a.toString() == (new sjcl.bn(-3)).toString() ? - this.x.sub(z2).mul(3).mul(this.x.add(z2)) : - this.x.square().mul(3).add(z2.square().mul(this.curve.a)), - x = c.square().subM(a).subM(a), - y = a.sub(x).mul(c).subM(b), - z = this.y.add(this.y).mul(this.z); - return new sjcl.ecc.pointJac(this.curve, x, y, z); - }, - - /** - * Returns a copy of this point converted to affine coordinates. - * @return {sjcl.ecc.point} The converted point. - */ - toAffine: function() { - if (this.isIdentity || this.z.equals(0)) { - return new sjcl.ecc.point(this.curve); - } - var zi = this.z.inverse(), zi2 = zi.square(); - return new sjcl.ecc.point(this.curve, this.x.mul(zi2).fullReduce(), this.y.mul(zi2.mul(zi)).fullReduce()); - }, - - /** - * Multiply this point by k and return the answer in Jacobian coordinates. - * @param {bigInt} k The coefficient to multiply by. - * @param {sjcl.ecc.point} affine This point in affine coordinates. - * @return {sjcl.ecc.pointJac} The result of the multiplication, in Jacobian coordinates. - */ - mult: function(k, affine) { - if (typeof(k) === "number") { - k = [k]; - } else if (k.limbs !== undefined) { - k = k.normalize().limbs; - } - - var i, j, out = new sjcl.ecc.point(this.curve).toJac(), multiples = affine.multiples(); - - for (i=k.length-1; i>=0; i--) { - for (j=sjcl.bn.prototype.radix-4; j>=0; j-=4) { - out = out.doubl().doubl().doubl().doubl().add(multiples[k[i]>>j & 0xF]); - } - } - - return out; - }, - - /** - * Multiply this point by k, added to affine2*k2, and return the answer in Jacobian coordinates. - * @param {bigInt} k The coefficient to multiply this by. - * @param {sjcl.ecc.point} affine This point in affine coordinates. - * @param {bigInt} k2 The coefficient to multiply affine2 this by. - * @param {sjcl.ecc.point} affine The other point in affine coordinates. - * @return {sjcl.ecc.pointJac} The result of the multiplication and addition, in Jacobian coordinates. - */ - mult2: function(k1, affine, k2, affine2) { - if (typeof(k1) === "number") { - k1 = [k1]; - } else if (k1.limbs !== undefined) { - k1 = k1.normalize().limbs; - } - - if (typeof(k2) === "number") { - k2 = [k2]; - } else if (k2.limbs !== undefined) { - k2 = k2.normalize().limbs; - } - - var i, j, out = new sjcl.ecc.point(this.curve).toJac(), m1 = affine.multiples(), - m2 = affine2.multiples(), l1, l2; - - for (i=Math.max(k1.length,k2.length)-1; i>=0; i--) { - l1 = k1[i] | 0; - l2 = k2[i] | 0; - for (j=sjcl.bn.prototype.radix-4; j>=0; j-=4) { - out = out.doubl().doubl().doubl().doubl().add(m1[l1>>j & 0xF]).add(m2[l2>>j & 0xF]); - } - } - - return out; - }, - - negate: function() { - return this.toAffine().negate().toJac(); - }, - - isValid: function() { - var z2 = this.z.square(), z4 = z2.square(), z6 = z4.mul(z2); - return this.y.square().equals( - this.curve.b.mul(z6).add(this.x.mul( - this.curve.a.mul(z4).add(this.x.square())))); - } -}; - -/** - * Construct an elliptic curve. Most users will not use this and instead start with one of the NIST curves defined below. - * - * @constructor - * @param {bigInt} p The prime modulus. - * @param {bigInt} r The prime order of the curve. - * @param {bigInt} a The constant a in the equation of the curve y^2 = x^3 + ax + b (for NIST curves, a is always -3). - * @param {bigInt} x The x coordinate of a base point of the curve. - * @param {bigInt} y The y coordinate of a base point of the curve. - */ -sjcl.ecc.curve = function(Field, r, a, b, x, y) { - this.field = Field; - this.r = new sjcl.bn(r); - this.a = new Field(a); - this.b = new Field(b); - this.G = new sjcl.ecc.point(this, new Field(x), new Field(y)); -}; - -sjcl.ecc.curve.prototype.fromBits = function (bits) { - var w = sjcl.bitArray, l = this.field.prototype.exponent + 7 & -8, - p = new sjcl.ecc.point(this, this.field.fromBits(w.bitSlice(bits, 0, l)), - this.field.fromBits(w.bitSlice(bits, l, 2*l))); - if (!p.isValid()) { - throw new sjcl.exception.corrupt("not on the curve!"); - } - return p; -}; - -sjcl.ecc.curves = { - c192: new sjcl.ecc.curve( - sjcl.bn.prime.p192, - "0xffffffffffffffffffffffff99def836146bc9b1b4d22831", - -3, - "0x64210519e59c80e70fa7e9ab72243049feb8deecc146b9b1", - "0x188da80eb03090f67cbf20eb43a18800f4ff0afd82ff1012", - "0x07192b95ffc8da78631011ed6b24cdd573f977a11e794811"), - - c224: new sjcl.ecc.curve( - sjcl.bn.prime.p224, - "0xffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d", - -3, - "0xb4050a850c04b3abf54132565044b0b7d7bfd8ba270b39432355ffb4", - "0xb70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d21", - "0xbd376388b5f723fb4c22dfe6cd4375a05a07476444d5819985007e34"), - - c256: new sjcl.ecc.curve( - sjcl.bn.prime.p256, - "0xffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551", - -3, - "0x5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b", - "0x6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296", - "0x4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5"), - - c384: new sjcl.ecc.curve( - sjcl.bn.prime.p384, - "0xffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973", - -3, - "0xb3312fa7e23ee7e4988e056be3f82d19181d9c6efe8141120314088f5013875ac656398d8a2ed19d2a85c8edd3ec2aef", - "0xaa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab7", - "0x3617de4a96262c6f5d9e98bf9292dc29f8f41dbd289a147ce9da3113b5f0b8c00a60b1ce1d7e819d7a431d7c90ea0e5f"), - - c521: new sjcl.ecc.curve( - sjcl.bn.prime.p521, - "0x1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA51868783BF2F966B7FCC0148F709A5D03BB5C9B8899C47AEBB6FB71E91386409", - -3, - "0x051953EB9618E1C9A1F929A21A0B68540EEA2DA725B99B315F3B8B489918EF109E156193951EC7E937B1652C0BD3BB1BF073573DF883D2C34F1EF451FD46B503F00", - "0xC6858E06B70404E9CD9E3ECB662395B4429C648139053FB521F828AF606B4D3DBAA14B5E77EFE75928FE1DC127A2FFA8DE3348B3C1856A429BF97E7E31C2E5BD66", - "0x11839296A789A3BC0045C8A5FB42C7D1BD998F54449579B446817AFBD17273E662C97EE72995EF42640C550B9013FAD0761353C7086A272C24088BE94769FD16650"), - - k192: new sjcl.ecc.curve( - sjcl.bn.prime.p192k, - "0xfffffffffffffffffffffffe26f2fc170f69466a74defd8d", - 0, - 3, - "0xdb4ff10ec057e9ae26b07d0280b7f4341da5d1b1eae06c7d", - "0x9b2f2f6d9c5628a7844163d015be86344082aa88d95e2f9d"), - - k224: new sjcl.ecc.curve( - sjcl.bn.prime.p224k, - "0x010000000000000000000000000001dce8d2ec6184caf0a971769fb1f7", - 0, - 5, - "0xa1455b334df099df30fc28a169a467e9e47075a90f7e650eb6b7a45c", - "0x7e089fed7fba344282cafbd6f7e319f7c0b0bd59e2ca4bdb556d61a5"), - - k256: new sjcl.ecc.curve( - sjcl.bn.prime.p256k, - "0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141", - 0, - 7, - "0x79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798", - "0x483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8") - -}; - -sjcl.ecc.curveName = function (curve) { - var curcurve; - for (curcurve in sjcl.ecc.curves) { - if (sjcl.ecc.curves.hasOwnProperty(curcurve)) { - if (sjcl.ecc.curves[curcurve] === curve) { - return curcurve; - } - } - } - - throw new sjcl.exception.invalid("no such curve"); -}; - -sjcl.ecc.deserialize = function (key) { - var types = ["elGamal", "ecdsa"]; - - if (!key || !key.curve || !sjcl.ecc.curves[key.curve]) { throw new sjcl.exception.invalid("invalid serialization"); } - if (types.indexOf(key.type) === -1) { throw new sjcl.exception.invalid("invalid type"); } - - var curve = sjcl.ecc.curves[key.curve]; - - if (key.secretKey) { - if (!key.exponent) { throw new sjcl.exception.invalid("invalid exponent"); } - var exponent = new sjcl.bn(key.exponent); - return new sjcl.ecc[key.type].secretKey(curve, exponent); - } else { - if (!key.point) { throw new sjcl.exception.invalid("invalid point"); } - - var point = curve.fromBits(sjcl.codec.hex.toBits(key.point)); - return new sjcl.ecc[key.type].publicKey(curve, point); - } -}; - -/** our basicKey classes -*/ -sjcl.ecc.basicKey = { - /** ecc publicKey. - * @constructor - * @param {curve} curve the elliptic curve - * @param {point} point the point on the curve - */ - publicKey: function(curve, point) { - this._curve = curve; - this._curveBitLength = curve.r.bitLength(); - if (point instanceof Array) { - this._point = curve.fromBits(point); - } else { - this._point = point; - } - - this.serialize = function () { - var curveName = sjcl.ecc.curveName(curve); - return { - type: this.getType(), - secretKey: false, - point: sjcl.codec.hex.fromBits(this._point.toBits()), - curve: curveName - }; - }; - - /** get this keys point data - * @return x and y as bitArrays - */ - this.get = function() { - var pointbits = this._point.toBits(); - var len = sjcl.bitArray.bitLength(pointbits); - var x = sjcl.bitArray.bitSlice(pointbits, 0, len/2); - var y = sjcl.bitArray.bitSlice(pointbits, len/2); - return { x: x, y: y }; - }; - }, - - /** ecc secretKey - * @constructor - * @param {curve} curve the elliptic curve - * @param exponent - */ - secretKey: function(curve, exponent) { - this._curve = curve; - this._curveBitLength = curve.r.bitLength(); - this._exponent = exponent; - - this.serialize = function () { - var exponent = this.get(); - var curveName = sjcl.ecc.curveName(curve); - return { - type: this.getType(), - secretKey: true, - exponent: sjcl.codec.hex.fromBits(exponent), - curve: curveName - }; - }; - - /** get this keys exponent data - * @return {bitArray} exponent - */ - this.get = function () { - return this._exponent.toBits(); - }; - } -}; - -/** @private */ -sjcl.ecc.basicKey.generateKeys = function(cn) { - return function generateKeys(curve, paranoia, sec) { - curve = curve || 256; - - if (typeof curve === "number") { - curve = sjcl.ecc.curves['c'+curve]; - if (curve === undefined) { - throw new sjcl.exception.invalid("no such curve"); - } - } - sec = sec || sjcl.bn.random(curve.r, paranoia); - - var pub = curve.G.mult(sec); - return { pub: new sjcl.ecc[cn].publicKey(curve, pub), - sec: new sjcl.ecc[cn].secretKey(curve, sec) }; - }; -}; - -/** elGamal keys */ -sjcl.ecc.elGamal = { - /** generate keys - * @function - * @param curve - * @param {int} paranoia Paranoia for generation (default 6) - * @param {secretKey} sec secret Key to use. used to get the publicKey for ones secretKey - */ - generateKeys: sjcl.ecc.basicKey.generateKeys("elGamal"), - /** elGamal publicKey. - * @constructor - * @augments sjcl.ecc.basicKey.publicKey - */ - publicKey: function (curve, point) { - sjcl.ecc.basicKey.publicKey.apply(this, arguments); - }, - /** elGamal secretKey - * @constructor - * @augments sjcl.ecc.basicKey.secretKey - */ - secretKey: function (curve, exponent) { - sjcl.ecc.basicKey.secretKey.apply(this, arguments); - } -}; - -sjcl.ecc.elGamal.publicKey.prototype = { - /** Kem function of elGamal Public Key - * @param paranoia paranoia to use for randomization. - * @return {object} key and tag. unkem(tag) with the corresponding secret key results in the key returned. - */ - kem: function(paranoia) { - var sec = sjcl.bn.random(this._curve.r, paranoia), - tag = this._curve.G.mult(sec).toBits(), - key = sjcl.hash.sha256.hash(this._point.mult(sec).toBits()); - return { key: key, tag: tag }; - }, - - getType: function() { - return "elGamal"; - } -}; - -sjcl.ecc.elGamal.secretKey.prototype = { - /** UnKem function of elGamal Secret Key - * @param {bitArray} tag The Tag to decrypt. - * @return {bitArray} decrypted key. - */ - unkem: function(tag) { - return sjcl.hash.sha256.hash(this._curve.fromBits(tag).mult(this._exponent).toBits()); - }, - - /** Diffie-Hellmann function - * @param {elGamal.publicKey} pk The Public Key to do Diffie-Hellmann with - * @return {bitArray} diffie-hellmann result for this key combination. - */ - dh: function(pk) { - return sjcl.hash.sha256.hash(pk._point.mult(this._exponent).toBits()); - }, - - /** Diffie-Hellmann function, compatible with Java generateSecret - * @param {elGamal.publicKey} pk The Public Key to do Diffie-Hellmann with - * @return {bitArray} undigested X value, diffie-hellmann result for this key combination, - * compatible with Java generateSecret(). - */ - dhJavaEc: function(pk) { - return pk._point.mult(this._exponent).x.toBits(); - }, - - getType: function() { - return "elGamal"; - } -}; - -/** ecdsa keys */ -sjcl.ecc.ecdsa = { - /** generate keys - * @function - * @param curve - * @param {int} paranoia Paranoia for generation (default 6) - * @param {secretKey} sec secret Key to use. used to get the publicKey for ones secretKey - */ - generateKeys: sjcl.ecc.basicKey.generateKeys("ecdsa") -}; - -/** ecdsa publicKey. -* @constructor -* @augments sjcl.ecc.basicKey.publicKey -*/ -sjcl.ecc.ecdsa.publicKey = function (curve, point) { - sjcl.ecc.basicKey.publicKey.apply(this, arguments); -}; - -/** specific functions for ecdsa publicKey. */ -sjcl.ecc.ecdsa.publicKey.prototype = { - /** Diffie-Hellmann function - * @param {bitArray} hash hash to verify. - * @param {bitArray} rs signature bitArray. - * @param {boolean} fakeLegacyVersion use old legacy version - */ - verify: function(hash, rs, fakeLegacyVersion) { - if (sjcl.bitArray.bitLength(hash) > this._curveBitLength) { - hash = sjcl.bitArray.clamp(hash, this._curveBitLength); - } - var w = sjcl.bitArray, - R = this._curve.r, - l = this._curveBitLength, - r = sjcl.bn.fromBits(w.bitSlice(rs,0,l)), - ss = sjcl.bn.fromBits(w.bitSlice(rs,l,2*l)), - s = fakeLegacyVersion ? ss : ss.inverseMod(R), - hG = sjcl.bn.fromBits(hash).mul(s).mod(R), - hA = r.mul(s).mod(R), - r2 = this._curve.G.mult2(hG, hA, this._point).x; - if (r.equals(0) || ss.equals(0) || r.greaterEquals(R) || ss.greaterEquals(R) || !r2.equals(r)) { - if (fakeLegacyVersion === undefined) { - return this.verify(hash, rs, true); - } else { - throw (new sjcl.exception.corrupt("signature didn't check out")); - } - } - return true; - }, - - getType: function() { - return "ecdsa"; - } -}; - -/** ecdsa secretKey -* @constructor -* @augments sjcl.ecc.basicKey.publicKey -*/ -sjcl.ecc.ecdsa.secretKey = function (curve, exponent) { - sjcl.ecc.basicKey.secretKey.apply(this, arguments); -}; - -/** specific functions for ecdsa secretKey. */ -sjcl.ecc.ecdsa.secretKey.prototype = { - /** Diffie-Hellmann function - * @param {bitArray} hash hash to sign. - * @param {int} paranoia paranoia for random number generation - * @param {boolean} fakeLegacyVersion use old legacy version - */ - sign: function(hash, paranoia, fakeLegacyVersion, fixedKForTesting) { - if (sjcl.bitArray.bitLength(hash) > this._curveBitLength) { - hash = sjcl.bitArray.clamp(hash, this._curveBitLength); - } - var R = this._curve.r, - l = R.bitLength(), - k = fixedKForTesting || sjcl.bn.random(R.sub(1), paranoia).add(1), - r = this._curve.G.mult(k).x.mod(R), - ss = sjcl.bn.fromBits(hash).add(r.mul(this._exponent)), - s = fakeLegacyVersion ? ss.inverseMod(R).mul(k).mod(R) - : ss.mul(k.inverseMod(R)).mod(R); - return sjcl.bitArray.concat(r.toBits(l), s.toBits(l)); - }, - - getType: function() { - return "ecdsa"; - } -}; diff --git a/sjcl/core/exports.js b/sjcl/core/exports.js deleted file mode 100644 index 84ddfe41..00000000 --- a/sjcl/core/exports.js +++ /dev/null @@ -1,8 +0,0 @@ -if(typeof module !== 'undefined' && module.exports){ - module.exports = sjcl; -} -if (typeof define === "function") { - define([], function () { - return sjcl; - }); -} diff --git a/sjcl/core/gcm.js b/sjcl/core/gcm.js deleted file mode 100644 index be099f08..00000000 --- a/sjcl/core/gcm.js +++ /dev/null @@ -1,187 +0,0 @@ -/** @fileOverview GCM mode implementation. - * - * @author Juho Vähä-Herttua - */ - -/** - * Galois/Counter mode. - * @namespace - */ -sjcl.mode.gcm = { - /** - * The name of the mode. - * @constant - */ - name: "gcm", - - /** Encrypt in GCM mode. - * @static - * @param {Object} prf The pseudorandom function. It must have a block size of 16 bytes. - * @param {bitArray} plaintext The plaintext data. - * @param {bitArray} iv The initialization value. - * @param {bitArray} [adata=[]] The authenticated data. - * @param {Number} [tlen=128] The desired tag length, in bits. - * @return {bitArray} The encrypted data, an array of bytes. - */ - encrypt: function (prf, plaintext, iv, adata, tlen) { - var out, data = plaintext.slice(0), w=sjcl.bitArray; - tlen = tlen || 128; - adata = adata || []; - - // encrypt and tag - out = sjcl.mode.gcm._ctrMode(true, prf, data, adata, iv, tlen); - - return w.concat(out.data, out.tag); - }, - - /** Decrypt in GCM mode. - * @static - * @param {Object} prf The pseudorandom function. It must have a block size of 16 bytes. - * @param {bitArray} ciphertext The ciphertext data. - * @param {bitArray} iv The initialization value. - * @param {bitArray} [adata=[]] The authenticated data. - * @param {Number} [tlen=128] The desired tag length, in bits. - * @return {bitArray} The decrypted data. - */ - decrypt: function (prf, ciphertext, iv, adata, tlen) { - var out, data = ciphertext.slice(0), tag, w=sjcl.bitArray, l=w.bitLength(data); - tlen = tlen || 128; - adata = adata || []; - - // Slice tag out of data - if (tlen <= l) { - tag = w.bitSlice(data, l-tlen); - data = w.bitSlice(data, 0, l-tlen); - } else { - tag = data; - data = []; - } - - // decrypt and tag - out = sjcl.mode.gcm._ctrMode(false, prf, data, adata, iv, tlen); - - if (!w.equal(out.tag, tag)) { - throw new sjcl.exception.corrupt("gcm: tag doesn't match"); - } - return out.data; - }, - - /* Compute the galois multiplication of X and Y - * @private - */ - _galoisMultiply: function (x, y) { - var i, j, xi, Zi, Vi, lsb_Vi, w=sjcl.bitArray, xor=w._xor4; - - Zi = [0,0,0,0]; - Vi = y.slice(0); - - // Block size is 128 bits, run 128 times to get Z_128 - for (i=0; i<128; i++) { - xi = (x[Math.floor(i/32)] & (1 << (31-i%32))) !== 0; - if (xi) { - // Z_i+1 = Z_i ^ V_i - Zi = xor(Zi, Vi); - } - - // Store the value of LSB(V_i) - lsb_Vi = (Vi[3] & 1) !== 0; - - // V_i+1 = V_i >> 1 - for (j=3; j>0; j--) { - Vi[j] = (Vi[j] >>> 1) | ((Vi[j-1]&1) << 31); - } - Vi[0] = Vi[0] >>> 1; - - // If LSB(V_i) is 1, V_i+1 = (V_i >> 1) ^ R - if (lsb_Vi) { - Vi[0] = Vi[0] ^ (0xe1 << 24); - } - } - return Zi; - }, - - _ghash: function(H, Y0, data) { - var Yi, i, l = data.length; - - Yi = Y0.slice(0); - for (i=0; i 255) { - throw new sjcl.exception.invalid("key bit length is too large for hkdf"); - } - - hmac = new sjcl.misc.hmac(key, Hash); - curOut = []; - for (i = 1; i <= loops; i++) { - hmac.update(curOut); - hmac.update(info); - hmac.update([sjcl.bitArray.partial(8, i)]); - curOut = hmac.digest(); - ret = sjcl.bitArray.concat(ret, curOut); - } - return sjcl.bitArray.clamp(ret, keyBitLength); -}; diff --git a/sjcl/core/hmac.js b/sjcl/core/hmac.js deleted file mode 100644 index eb8e86d5..00000000 --- a/sjcl/core/hmac.js +++ /dev/null @@ -1,61 +0,0 @@ -/** @fileOverview HMAC implementation. - * - * @author Emily Stark - * @author Mike Hamburg - * @author Dan Boneh - */ - -/** HMAC with the specified hash function. - * @constructor - * @param {bitArray} key the key for HMAC. - * @param {Object} [Hash=sjcl.hash.sha256] The hash function to use. - */ -sjcl.misc.hmac = function (key, Hash) { - this._hash = Hash = Hash || sjcl.hash.sha256; - var exKey = [[],[]], i, - bs = Hash.prototype.blockSize / 32; - this._baseHash = [new Hash(), new Hash()]; - - if (key.length > bs) { - key = Hash.hash(key); - } - - for (i=0; i>>31, - x[1]<<1 ^ x[2]>>>31, - x[2]<<1 ^ x[3]>>>31, - x[3]<<1 ^ (x[0]>>>31)*0x87]; - } -}; diff --git a/sjcl/core/ocb2progressive.js b/sjcl/core/ocb2progressive.js deleted file mode 100644 index 14246ad2..00000000 --- a/sjcl/core/ocb2progressive.js +++ /dev/null @@ -1,138 +0,0 @@ -/** - * OCB2.0 implementation slightly modified by Yifan Gu - * to support progressive encryption - * @author Yifan Gu - */ - -/** @fileOverview OCB 2.0 implementation - * - * @author Emily Stark - * @author Mike Hamburg - * @author Dan Boneh - */ - -/** - * Phil Rogaway's Offset CodeBook mode, version 2.0. - * May be covered by US and international patents. - * - * @namespace - * @author Emily Stark - * @author Mike Hamburg - * @author Dan Boneh - */ - -sjcl.mode.ocb2progressive = { - createEncryptor: function(prp, iv, adata, tlen, premac) { - if (sjcl.bitArray.bitLength(iv) !== 128) { - throw new sjcl.exception.invalid("ocb iv must be 128 bits"); - } - var i, - times2 = sjcl.mode.ocb2._times2, - w = sjcl.bitArray, - xor = w._xor4, - checksum = [0,0,0,0], - delta = times2(prp.encrypt(iv)), - bi, bl, - datacache = [], - pad; - - adata = adata || []; - tlen = tlen || 64; - - return { - process: function(data){ - var datalen = sjcl.bitArray.bitLength(data); - if (datalen == 0){ // empty input natrually gives empty output - return []; - } - var output = []; - datacache = datacache.concat(data); - for (i=0; i+4 < datacache.length; i+=4) { - /* Encrypt a non-final block */ - bi = datacache.slice(i,i+4); - checksum = xor(checksum, bi); - output = output.concat(xor(delta,prp.encrypt(xor(delta, bi)))); - delta = times2(delta); - } - datacache = datacache.slice(i); // at end of each process we ensure size of datacache is smaller than 4 - return output; //spits out the result. - }, - finalize: function(){ - // the final block - bi = datacache; - bl = w.bitLength(bi); - pad = prp.encrypt(xor(delta,[0,0,0,bl])); - bi = w.clamp(xor(bi.concat([0,0,0]),pad), bl); - - /* Checksum the final block, and finalize the checksum */ - checksum = xor(checksum,xor(bi.concat([0,0,0]),pad)); - checksum = prp.encrypt(xor(checksum,xor(delta,times2(delta)))); - - /* MAC the header */ - if (adata.length) { - checksum = xor(checksum, premac ? adata : sjcl.mode.ocb2.pmac(prp, adata)); - } - - return w.concat(bi, w.clamp(checksum, tlen)); // spits out the last block - } - }; - }, - createDecryptor: function(prp, iv, adata, tlen, premac){ - if (sjcl.bitArray.bitLength(iv) !== 128) { - throw new sjcl.exception.invalid("ocb iv must be 128 bits"); - } - tlen = tlen || 64; - var i, - times2 = sjcl.mode.ocb2._times2, - w = sjcl.bitArray, - xor = w._xor4, - checksum = [0,0,0,0], - delta = times2(prp.encrypt(iv)), - bi, bl, - datacache = [], - pad; - - adata = adata || []; - - return { - process: function(data){ - if (data.length == 0){ // empty input natrually gives empty output - return []; - } - var output = []; - datacache = datacache.concat(data); - var cachelen = sjcl.bitArray.bitLength(datacache); - for (i=0; i+4 < (cachelen-tlen)/32; i+=4) { - /* Decrypt a non-final block */ - bi = xor(delta, prp.decrypt(xor(delta, datacache.slice(i,i+4)))); - checksum = xor(checksum, bi); - output = output.concat(bi); - delta = times2(delta); - } - datacache = datacache.slice(i); - return output; - }, - finalize: function(){ - /* Chop out and decrypt the final block */ - bl = sjcl.bitArray.bitLength(datacache) - tlen; - pad = prp.encrypt(xor(delta,[0,0,0,bl])); - bi = xor(pad, w.clamp(datacache,bl).concat([0,0,0])); - - /* Checksum the final block, and finalize the checksum */ - checksum = xor(checksum, bi); - checksum = prp.encrypt(xor(checksum, xor(delta, times2(delta)))); - - /* MAC the header */ - if (adata.length) { - checksum = xor(checksum, premac ? adata : sjcl.mode.ocb2.pmac(prp, adata)); - } - - if (!w.equal(w.clamp(checksum, tlen), w.bitSlice(datacache, bl))) { - throw new sjcl.exception.corrupt("ocb: tag doesn't match"); - } - - return w.clamp(bi,bl); - } - }; - } -}; diff --git a/sjcl/core/pbkdf2.js b/sjcl/core/pbkdf2.js deleted file mode 100644 index d239f9cb..00000000 --- a/sjcl/core/pbkdf2.js +++ /dev/null @@ -1,58 +0,0 @@ -/** @fileOverview Password-based key-derivation function, version 2.0. - * - * @author Emily Stark - * @author Mike Hamburg - * @author Dan Boneh - */ - -/** Password-Based Key-Derivation Function, version 2.0. - * - * Generate keys from passwords using PBKDF2-HMAC-SHA256. - * - * This is the method specified by RSA's PKCS #5 standard. - * - * @param {bitArray|String} password The password. - * @param {bitArray|String} salt The salt. Should have lots of entropy. - * @param {Number} [count=1000] The number of iterations. Higher numbers make the function slower but more secure. - * @param {Number} [length] The length of the derived key. Defaults to the - output size of the hash function. - * @param {Object} [Prff=sjcl.misc.hmac] The pseudorandom function family. - * @return {bitArray} the derived key. - */ -sjcl.misc.pbkdf2 = function (password, salt, count, length, Prff) { - count = count || 10000; - - if (length < 0 || count < 0) { - throw new sjcl.exception.invalid("invalid params to pbkdf2"); - } - - if (typeof password === "string") { - password = sjcl.codec.utf8String.toBits(password); - } - - if (typeof salt === "string") { - salt = sjcl.codec.utf8String.toBits(salt); - } - - Prff = Prff || sjcl.misc.hmac; - - var prf = new Prff(password), - u, ui, i, j, k, out = [], b = sjcl.bitArray; - - for (k = 1; 32 * out.length < (length || 1); k++) { - u = ui = prf.encrypt(b.concat(salt,[k])); - - for (i=1; iUse sjcl.random as a singleton for this class! - *

- * This random number generator is a derivative of Ferguson and Schneier's - * generator Fortuna. It collects entropy from various events into several - * pools, implemented by streaming SHA-256 instances. It differs from - * ordinary Fortuna in a few ways, though. - *

- * - *

- * Most importantly, it has an entropy estimator. This is present because - * there is a strong conflict here between making the generator available - * as soon as possible, and making sure that it doesn't "run on empty". - * In Fortuna, there is a saved state file, and the system is likely to have - * time to warm up. - *

- * - *

- * Second, because users are unlikely to stay on the page for very long, - * and to speed startup time, the number of pools increases logarithmically: - * a new pool is created when the previous one is actually used for a reseed. - * This gives the same asymptotic guarantees as Fortuna, but gives more - * entropy to early reseeds. - *

- * - *

- * The entire mechanism here feels pretty klunky. Furthermore, there are - * several improvements that should be made, including support for - * dedicated cryptographic functions that may be present in some browsers; - * state files in local storage; cookies containing randomness; etc. So - * look for improvements in future versions. - *

- * @constructor - */ -sjcl.prng = function(defaultParanoia) { - - /* private */ - this._pools = [new sjcl.hash.sha256()]; - this._poolEntropy = [0]; - this._reseedCount = 0; - this._robins = {}; - this._eventId = 0; - - this._collectorIds = {}; - this._collectorIdNext = 0; - - this._strength = 0; - this._poolStrength = 0; - this._nextReseed = 0; - this._key = [0,0,0,0,0,0,0,0]; - this._counter = [0,0,0,0]; - this._cipher = undefined; - this._defaultParanoia = defaultParanoia; - - /* event listener stuff */ - this._collectorsStarted = false; - this._callbacks = {progress: {}, seeded: {}}; - this._callbackI = 0; - - /* constants */ - this._NOT_READY = 0; - this._READY = 1; - this._REQUIRES_RESEED = 2; - - this._MAX_WORDS_PER_BURST = 65536; - this._PARANOIA_LEVELS = [0,48,64,96,128,192,256,384,512,768,1024]; - this._MILLISECONDS_PER_RESEED = 30000; - this._BITS_PER_RESEED = 80; -}; - -sjcl.prng.prototype = { - /** Generate several random words, and return them in an array. - * A word consists of 32 bits (4 bytes) - * @param {Number} nwords The number of words to generate. - */ - randomWords: function (nwords, paranoia) { - var out = [], i, readiness = this.isReady(paranoia), g; - - if (readiness === this._NOT_READY) { - throw new sjcl.exception.notReady("generator isn't seeded"); - } else if (readiness & this._REQUIRES_RESEED) { - this._reseedFromPools(!(readiness & this._READY)); - } - - for (i=0; i0) { - estimatedEntropy++; - tmp = tmp >>> 1; - } - } - } - this._pools[robin].update([id,this._eventId++,2,estimatedEntropy,t,data.length].concat(data)); - } - break; - - case "string": - if (estimatedEntropy === undefined) { - /* English text has just over 1 bit per character of entropy. - * But this might be HTML or something, and have far less - * entropy than English... Oh well, let's just say one bit. - */ - estimatedEntropy = data.length; - } - this._pools[robin].update([id,this._eventId++,3,estimatedEntropy,t,data.length]); - this._pools[robin].update(data); - break; - - default: - err=1; - } - if (err) { - throw new sjcl.exception.bug("random: addEntropy only supports number, array of numbers or string"); - } - - /* record the new strength */ - this._poolEntropy[robin] += estimatedEntropy; - this._poolStrength += estimatedEntropy; - - /* fire off events */ - if (oldReady === this._NOT_READY) { - if (this.isReady() !== this._NOT_READY) { - this._fireEvent("seeded", Math.max(this._strength, this._poolStrength)); - } - this._fireEvent("progress", this.getProgress()); - } - }, - - /** Is the generator ready? */ - isReady: function (paranoia) { - var entropyRequired = this._PARANOIA_LEVELS[ (paranoia !== undefined) ? paranoia : this._defaultParanoia ]; - - if (this._strength && this._strength >= entropyRequired) { - return (this._poolEntropy[0] > this._BITS_PER_RESEED && (new Date()).valueOf() > this._nextReseed) ? - this._REQUIRES_RESEED | this._READY : - this._READY; - } else { - return (this._poolStrength >= entropyRequired) ? - this._REQUIRES_RESEED | this._NOT_READY : - this._NOT_READY; - } - }, - - /** Get the generator's progress toward readiness, as a fraction */ - getProgress: function (paranoia) { - var entropyRequired = this._PARANOIA_LEVELS[ paranoia ? paranoia : this._defaultParanoia ]; - - if (this._strength >= entropyRequired) { - return 1.0; - } else { - return (this._poolStrength > entropyRequired) ? - 1.0 : - this._poolStrength / entropyRequired; - } - }, - - /** start the built-in entropy collectors */ - startCollectors: function () { - if (this._collectorsStarted) { return; } - - this._eventListener = { - loadTimeCollector: this._bind(this._loadTimeCollector), - mouseCollector: this._bind(this._mouseCollector), - keyboardCollector: this._bind(this._keyboardCollector), - accelerometerCollector: this._bind(this._accelerometerCollector), - touchCollector: this._bind(this._touchCollector) - }; - - if (window.addEventListener) { - window.addEventListener("load", this._eventListener.loadTimeCollector, false); - window.addEventListener("mousemove", this._eventListener.mouseCollector, false); - window.addEventListener("keypress", this._eventListener.keyboardCollector, false); - window.addEventListener("devicemotion", this._eventListener.accelerometerCollector, false); - window.addEventListener("touchmove", this._eventListener.touchCollector, false); - } else if (document.attachEvent) { - document.attachEvent("onload", this._eventListener.loadTimeCollector); - document.attachEvent("onmousemove", this._eventListener.mouseCollector); - document.attachEvent("keypress", this._eventListener.keyboardCollector); - } else { - throw new sjcl.exception.bug("can't attach event"); - } - - this._collectorsStarted = true; - }, - - /** stop the built-in entropy collectors */ - stopCollectors: function () { - if (!this._collectorsStarted) { return; } - - if (window.removeEventListener) { - window.removeEventListener("load", this._eventListener.loadTimeCollector, false); - window.removeEventListener("mousemove", this._eventListener.mouseCollector, false); - window.removeEventListener("keypress", this._eventListener.keyboardCollector, false); - window.removeEventListener("devicemotion", this._eventListener.accelerometerCollector, false); - window.removeEventListener("touchmove", this._eventListener.touchCollector, false); - } else if (document.detachEvent) { - document.detachEvent("onload", this._eventListener.loadTimeCollector); - document.detachEvent("onmousemove", this._eventListener.mouseCollector); - document.detachEvent("keypress", this._eventListener.keyboardCollector); - } - - this._collectorsStarted = false; - }, - - /* use a cookie to store entropy. - useCookie: function (all_cookies) { - throw new sjcl.exception.bug("random: useCookie is unimplemented"); - },*/ - - /** add an event listener for progress or seeded-ness. */ - addEventListener: function (name, callback) { - this._callbacks[name][this._callbackI++] = callback; - }, - - /** remove an event listener for progress or seeded-ness */ - removeEventListener: function (name, cb) { - var i, j, cbs=this._callbacks[name], jsTemp=[]; - - /* I'm not sure if this is necessary; in C++, iterating over a - * collection and modifying it at the same time is a no-no. - */ - - for (j in cbs) { - if (cbs.hasOwnProperty(j) && cbs[j] === cb) { - jsTemp.push(j); - } - } - - for (i=0; i= 1 << this._pools.length) { - this._pools.push(new sjcl.hash.sha256()); - this._poolEntropy.push(0); - } - - /* how strong was this reseed? */ - this._poolStrength -= strength; - if (strength > this._strength) { - this._strength = strength; - } - - this._reseedCount ++; - this._reseed(reseedData); - }, - - _keyboardCollector: function () { - this._addCurrentTimeToEntropy(1); - }, - - _mouseCollector: function (ev) { - var x, y; - - try { - x = ev.x || ev.clientX || ev.offsetX || 0; - y = ev.y || ev.clientY || ev.offsetY || 0; - } catch (err) { - // Event originated from a secure element. No mouse position available. - x = 0; - y = 0; - } - - if (x != 0 && y!= 0) { - this.addEntropy([x,y], 2, "mouse"); - } - - this._addCurrentTimeToEntropy(0); - }, - - _touchCollector: function(ev) { - var touch = ev.touches[0] || ev.changedTouches[0]; - var x = touch.pageX || touch.clientX, - y = touch.pageY || touch.clientY; - - this.addEntropy([x,y],1,"touch"); - - this._addCurrentTimeToEntropy(0); - }, - - _loadTimeCollector: function () { - this._addCurrentTimeToEntropy(2); - }, - - _addCurrentTimeToEntropy: function (estimatedEntropy) { - if (typeof window !== 'undefined' && window.performance && typeof window.performance.now === "function") { - //how much entropy do we want to add here? - this.addEntropy(window.performance.now(), estimatedEntropy, "loadtime"); - } else { - this.addEntropy((new Date()).valueOf(), estimatedEntropy, "loadtime"); - } - }, - _accelerometerCollector: function (ev) { - var ac = ev.accelerationIncludingGravity.x||ev.accelerationIncludingGravity.y||ev.accelerationIncludingGravity.z; - if(window.orientation){ - var or = window.orientation; - if (typeof or === "number") { - this.addEntropy(or, 1, "accelerometer"); - } - } - if (ac) { - this.addEntropy(ac, 2, "accelerometer"); - } - this._addCurrentTimeToEntropy(0); - }, - - _fireEvent: function (name, arg) { - var j, cbs=sjcl.random._callbacks[name], cbsTemp=[]; - /* TODO: there is a race condition between removing collectors and firing them */ - - /* I'm not sure if this is necessary; in C++, iterating over a - * collection and modifying it at the same time is a no-no. - */ - - for (j in cbs) { - if (cbs.hasOwnProperty(j)) { - cbsTemp.push(cbs[j]); - } - } - - for (j=0; j - */ -(function() { - -/** - * Context for a RIPEMD-160 operation in progress. - * @constructor - */ -sjcl.hash.ripemd160 = function (hash) { - if (hash) { - this._h = hash._h.slice(0); - this._buffer = hash._buffer.slice(0); - this._length = hash._length; - } else { - this.reset(); - } -}; - -/** - * Hash a string or an array of words. - * @static - * @param {bitArray|String} data the data to hash. - * @return {bitArray} The hash value, an array of 5 big-endian words. - */ -sjcl.hash.ripemd160.hash = function (data) { - return (new sjcl.hash.ripemd160()).update(data).finalize(); -}; - -sjcl.hash.ripemd160.prototype = { - /** - * Reset the hash state. - * @return this - */ - reset: function () { - this._h = _h0.slice(0); - this._buffer = []; - this._length = 0; - return this; - }, - - /** - * Reset the hash state. - * @param {bitArray|String} data the data to hash. - * @return this - */ - update: function (data) { - if ( typeof data === "string" ) - data = sjcl.codec.utf8String.toBits(data); - - var i, b = this._buffer = sjcl.bitArray.concat(this._buffer, data), - ol = this._length, - nl = this._length = ol + sjcl.bitArray.bitLength(data); - if (nl > 9007199254740991){ - throw new sjcl.exception.invalid("Cannot hash more than 2^53 - 1 bits"); - } - for (i = 512+ol - ((512+ol) & 511); i <= nl; i+= 512) { - var words = b.splice(0,16); - for ( var w = 0; w < 16; ++w ) - words[w] = _cvt(words[w]); - - _block.call( this, words ); - } - - return this; - }, - - /** - * Complete hashing and output the hash value. - * @return {bitArray} The hash value, an array of 5 big-endian words. - */ - finalize: function () { - var b = sjcl.bitArray.concat( this._buffer, [ sjcl.bitArray.partial(1,1) ] ), - l = ( this._length + 1 ) % 512, - z = ( l > 448 ? 512 : 448 ) - l % 448, - zp = z % 32; - - if ( zp > 0 ) - b = sjcl.bitArray.concat( b, [ sjcl.bitArray.partial(zp,0) ] ); - for ( ; z >= 32; z -= 32 ) - b.push(0); - - b.push( _cvt( this._length | 0 ) ); - b.push( _cvt( Math.floor(this._length / 0x100000000) ) ); - - while ( b.length ) { - var words = b.splice(0,16); - for ( var w = 0; w < 16; ++w ) - words[w] = _cvt(words[w]); - - _block.call( this, words ); - } - - var h = this._h; - this.reset(); - - for ( var w = 0; w < 5; ++w ) - h[w] = _cvt(h[w]); - - return h; - } -}; - -var _h0 = [ 0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0 ]; - -var _k1 = [ 0x00000000, 0x5a827999, 0x6ed9eba1, 0x8f1bbcdc, 0xa953fd4e ]; -var _k2 = [ 0x50a28be6, 0x5c4dd124, 0x6d703ef3, 0x7a6d76e9, 0x00000000 ]; -for ( var i = 4; i >= 0; --i ) { - for ( var j = 1; j < 16; ++j ) { - _k1.splice(i,0,_k1[i]); - _k2.splice(i,0,_k2[i]); - } -} - -var _r1 = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, - 7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8, - 3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12, - 1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2, - 4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13 ]; -var _r2 = [ 5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12, - 6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2, - 15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13, - 8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14, - 12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11 ]; - -var _s1 = [ 11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8, - 7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12, - 11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5, - 11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12, - 9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6 ]; -var _s2 = [ 8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6, - 9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11, - 9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5, - 15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8, - 8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11 ]; - -function _f0(x,y,z) { - return x ^ y ^ z; -} - -function _f1(x,y,z) { - return (x & y) | (~x & z); -} - -function _f2(x,y,z) { - return (x | ~y) ^ z; -} - -function _f3(x,y,z) { - return (x & z) | (y & ~z); -} - -function _f4(x,y,z) { - return x ^ (y | ~z); -} - -function _rol(n,l) { - return (n << l) | (n >>> (32-l)); -} - -function _cvt(n) { - return ( (n & 0xff << 0) << 24 ) - | ( (n & 0xff << 8) << 8 ) - | ( (n & 0xff << 16) >>> 8 ) - | ( (n & 0xff << 24) >>> 24 ); -} - -function _block(X) { - var A1 = this._h[0], B1 = this._h[1], C1 = this._h[2], D1 = this._h[3], E1 = this._h[4], - A2 = this._h[0], B2 = this._h[1], C2 = this._h[2], D2 = this._h[3], E2 = this._h[4]; - - var j = 0, T; - - for ( ; j < 16; ++j ) { - T = _rol( A1 + _f0(B1,C1,D1) + X[_r1[j]] + _k1[j], _s1[j] ) + E1; - A1 = E1; E1 = D1; D1 = _rol(C1,10); C1 = B1; B1 = T; - T = _rol( A2 + _f4(B2,C2,D2) + X[_r2[j]] + _k2[j], _s2[j] ) + E2; - A2 = E2; E2 = D2; D2 = _rol(C2,10); C2 = B2; B2 = T; } - for ( ; j < 32; ++j ) { - T = _rol( A1 + _f1(B1,C1,D1) + X[_r1[j]] + _k1[j], _s1[j] ) + E1; - A1 = E1; E1 = D1; D1 = _rol(C1,10); C1 = B1; B1 = T; - T = _rol( A2 + _f3(B2,C2,D2) + X[_r2[j]] + _k2[j], _s2[j] ) + E2; - A2 = E2; E2 = D2; D2 = _rol(C2,10); C2 = B2; B2 = T; } - for ( ; j < 48; ++j ) { - T = _rol( A1 + _f2(B1,C1,D1) + X[_r1[j]] + _k1[j], _s1[j] ) + E1; - A1 = E1; E1 = D1; D1 = _rol(C1,10); C1 = B1; B1 = T; - T = _rol( A2 + _f2(B2,C2,D2) + X[_r2[j]] + _k2[j], _s2[j] ) + E2; - A2 = E2; E2 = D2; D2 = _rol(C2,10); C2 = B2; B2 = T; } - for ( ; j < 64; ++j ) { - T = _rol( A1 + _f3(B1,C1,D1) + X[_r1[j]] + _k1[j], _s1[j] ) + E1; - A1 = E1; E1 = D1; D1 = _rol(C1,10); C1 = B1; B1 = T; - T = _rol( A2 + _f1(B2,C2,D2) + X[_r2[j]] + _k2[j], _s2[j] ) + E2; - A2 = E2; E2 = D2; D2 = _rol(C2,10); C2 = B2; B2 = T; } - for ( ; j < 80; ++j ) { - T = _rol( A1 + _f4(B1,C1,D1) + X[_r1[j]] + _k1[j], _s1[j] ) + E1; - A1 = E1; E1 = D1; D1 = _rol(C1,10); C1 = B1; B1 = T; - T = _rol( A2 + _f0(B2,C2,D2) + X[_r2[j]] + _k2[j], _s2[j] ) + E2; - A2 = E2; E2 = D2; D2 = _rol(C2,10); C2 = B2; B2 = T; } - - T = this._h[1] + C1 + D2; - this._h[1] = this._h[2] + D1 + E2; - this._h[2] = this._h[3] + E1 + A2; - this._h[3] = this._h[4] + A1 + B2; - this._h[4] = this._h[0] + B1 + C2; - this._h[0] = T; -} - -})(); diff --git a/sjcl/core/scrypt.js b/sjcl/core/scrypt.js deleted file mode 100644 index 7c77558a..00000000 --- a/sjcl/core/scrypt.js +++ /dev/null @@ -1,146 +0,0 @@ -/** scrypt Password-Based Key-Derivation Function. - * - * @param {bitArray|String} password The password. - * @param {bitArray|String} salt The salt. Should have lots of entropy. - * - * @param {Number} [N=16384] CPU/Memory cost parameter. - * @param {Number} [r=8] Block size parameter. - * @param {Number} [p=1] Parallelization parameter. - * - * @param {Number} [length] The length of the derived key. Defaults to the - * output size of the hash function. - * @param {Object} [Prff=sjcl.misc.hmac] The pseudorandom function family. - * - * @return {bitArray} The derived key. - */ -sjcl.misc.scrypt = function (password, salt, N, r, p, length, Prff) { - var SIZE_MAX = Math.pow(2, 32) - 1, - self = sjcl.misc.scrypt; - - N = N || 16384; - r = r || 8; - p = p || 1; - - if (r * p >= Math.pow(2, 30)) { - throw sjcl.exception.invalid("The parameters r, p must satisfy r * p < 2^30"); - } - - if ((N < 2) || (N & (N - 1) != 0)) { - throw sjcl.exception.invalid("The parameter N must be a power of 2."); - } - - if (N > SIZE_MAX / 128 / r) { - throw sjcl.exception.invalid("N too big."); - } - - if (r > SIZE_MAX / 128 / p) { - throw sjcl.exception.invalid("r too big."); - } - - var blocks = sjcl.misc.pbkdf2(password, salt, 1, p * 128 * r * 8, Prff), - len = blocks.length / p; - - self.reverse(blocks); - - for (var i = 0; i < p; i++) { - var block = blocks.slice(i * len, (i + 1) * len); - self.blockcopy(self.ROMix(block, N), 0, blocks, i * len); - } - - self.reverse(blocks); - - return sjcl.misc.pbkdf2(password, blocks, 1, length, Prff); -}; - -sjcl.misc.scrypt.salsa20Core = function (word, rounds) { - var R = function(a, b) { return (a << b) | (a >>> (32 - b)); }; - var x = word.slice(0); - - for (var i = rounds; i > 0; i -= 2) { - x[ 4] ^= R(x[ 0]+x[12], 7); x[ 8] ^= R(x[ 4]+x[ 0], 9); - x[12] ^= R(x[ 8]+x[ 4],13); x[ 0] ^= R(x[12]+x[ 8],18); - x[ 9] ^= R(x[ 5]+x[ 1], 7); x[13] ^= R(x[ 9]+x[ 5], 9); - x[ 1] ^= R(x[13]+x[ 9],13); x[ 5] ^= R(x[ 1]+x[13],18); - x[14] ^= R(x[10]+x[ 6], 7); x[ 2] ^= R(x[14]+x[10], 9); - x[ 6] ^= R(x[ 2]+x[14],13); x[10] ^= R(x[ 6]+x[ 2],18); - x[ 3] ^= R(x[15]+x[11], 7); x[ 7] ^= R(x[ 3]+x[15], 9); - x[11] ^= R(x[ 7]+x[ 3],13); x[15] ^= R(x[11]+x[ 7],18); - x[ 1] ^= R(x[ 0]+x[ 3], 7); x[ 2] ^= R(x[ 1]+x[ 0], 9); - x[ 3] ^= R(x[ 2]+x[ 1],13); x[ 0] ^= R(x[ 3]+x[ 2],18); - x[ 6] ^= R(x[ 5]+x[ 4], 7); x[ 7] ^= R(x[ 6]+x[ 5], 9); - x[ 4] ^= R(x[ 7]+x[ 6],13); x[ 5] ^= R(x[ 4]+x[ 7],18); - x[11] ^= R(x[10]+x[ 9], 7); x[ 8] ^= R(x[11]+x[10], 9); - x[ 9] ^= R(x[ 8]+x[11],13); x[10] ^= R(x[ 9]+x[ 8],18); - x[12] ^= R(x[15]+x[14], 7); x[13] ^= R(x[12]+x[15], 9); - x[14] ^= R(x[13]+x[12],13); x[15] ^= R(x[14]+x[13],18); - } - - for (i = 0; i < 16; i++) word[i] = x[i]+word[i]; -}; - -sjcl.misc.scrypt.blockMix = function(blocks) { - var X = blocks.slice(-16), - out = [], - len = blocks.length / 16, - self = sjcl.misc.scrypt; - - for (var i = 0; i < len; i++) { - self.blockxor(blocks, 16 * i, X, 0, 16); - self.salsa20Core(X, 8); - - if ((i & 1) == 0) { - self.blockcopy(X, 0, out, 8 * i); - } else { - self.blockcopy(X, 0, out, 8 * (i^1 + len)); - } - } - - return out; -}; - -sjcl.misc.scrypt.ROMix = function(block, N) { - var X = block.slice(0), - V = [], - self = sjcl.misc.scrypt; - - for (var i = 0; i < N; i++) { - V.push(X.slice(0)); - X = self.blockMix(X); - } - - for (i = 0; i < N; i++) { - var j = X[X.length - 16] & (N - 1); - - self.blockxor(V[j], 0, X, 0); - X = self.blockMix(X); - } - - return X; -}; - -sjcl.misc.scrypt.reverse = function (words) { // Converts Big <-> Little Endian words - for (var i in words) { - var out = words[i] & 0xFF; - out = (out << 8) | (words[i] >>> 8) & 0xFF; - out = (out << 8) | (words[i] >>> 16) & 0xFF; - out = (out << 8) | (words[i] >>> 24) & 0xFF; - - words[i] = out; - } -}; - -sjcl.misc.scrypt.blockcopy = function (S, Si, D, Di, len) { - var i; - - len = len || (S.length - Si); - - for (i = 0; i < len; i++) D[Di + i] = S[Si + i] | 0; -}; - -sjcl.misc.scrypt.blockxor = function(S, Si, D, Di, len) { - var i; - - len = len || (S.length - Si); - - for (i = 0; i < len; i++) D[Di + i] = (D[Di + i] ^ S[Si + i]) | 0; -}; diff --git a/sjcl/core/sha1.js b/sjcl/core/sha1.js deleted file mode 100644 index b56d749d..00000000 --- a/sjcl/core/sha1.js +++ /dev/null @@ -1,191 +0,0 @@ -/** @fileOverview Javascript SHA-1 implementation. - * - * Based on the implementation in RFC 3174, method 1, and on the SJCL - * SHA-256 implementation. - * - * @author Quinn Slack - */ - -/** - * Context for a SHA-1 operation in progress. - * @constructor - */ -sjcl.hash.sha1 = function (hash) { - if (hash) { - this._h = hash._h.slice(0); - this._buffer = hash._buffer.slice(0); - this._length = hash._length; - } else { - this.reset(); - } -}; - -/** - * Hash a string or an array of words. - * @static - * @param {bitArray|String} data the data to hash. - * @return {bitArray} The hash value, an array of 5 big-endian words. - */ -sjcl.hash.sha1.hash = function (data) { - return (new sjcl.hash.sha1()).update(data).finalize(); -}; - -sjcl.hash.sha1.prototype = { - /** - * The hash's block size, in bits. - * @constant - */ - blockSize: 512, - - /** - * Reset the hash state. - * @return this - */ - reset:function () { - this._h = this._init.slice(0); - this._buffer = []; - this._length = 0; - return this; - }, - - /** - * Input several words to the hash. - * @param {bitArray|String} data the data to hash. - * @return this - */ - update: function (data) { - if (typeof data === "string") { - data = sjcl.codec.utf8String.toBits(data); - } - var i, b = this._buffer = sjcl.bitArray.concat(this._buffer, data), - ol = this._length, - nl = this._length = ol + sjcl.bitArray.bitLength(data); - if (nl > 9007199254740991){ - throw new sjcl.exception.invalid("Cannot hash more than 2^53 - 1 bits"); - } - - if (typeof Uint32Array !== 'undefined') { - var c = new Uint32Array(b); - var j = 0; - for (i = this.blockSize+ol - ((this.blockSize+ol) & (this.blockSize-1)); i <= nl; - i+= this.blockSize) { - this._block(c.subarray(16 * j, 16 * (j+1))); - j += 1; - } - b.splice(0, 16 * j); - } else { - for (i = this.blockSize+ol - ((this.blockSize+ol) & (this.blockSize-1)); i <= nl; - i+= this.blockSize) { - this._block(b.splice(0,16)); - } - } - return this; - }, - - /** - * Complete hashing and output the hash value. - * @return {bitArray} The hash value, an array of 5 big-endian words. TODO - */ - finalize:function () { - var i, b = this._buffer, h = this._h; - - // Round out and push the buffer - b = sjcl.bitArray.concat(b, [sjcl.bitArray.partial(1,1)]); - // Round out the buffer to a multiple of 16 words, less the 2 length words. - for (i = b.length + 2; i & 15; i++) { - b.push(0); - } - - // append the length - b.push(Math.floor(this._length / 0x100000000)); - b.push(this._length | 0); - - while (b.length) { - this._block(b.splice(0,16)); - } - - this.reset(); - return h; - }, - - /** - * The SHA-1 initialization vector. - * @private - */ - _init:[0x67452301, 0xEFCDAB89, 0x98BADCFE, 0x10325476, 0xC3D2E1F0], - - /** - * The SHA-1 hash key. - * @private - */ - _key:[0x5A827999, 0x6ED9EBA1, 0x8F1BBCDC, 0xCA62C1D6], - - /** - * The SHA-1 logical functions f(0), f(1), ..., f(79). - * @private - */ - _f:function(t, b, c, d) { - if (t <= 19) { - return (b & c) | (~b & d); - } else if (t <= 39) { - return b ^ c ^ d; - } else if (t <= 59) { - return (b & c) | (b & d) | (c & d); - } else if (t <= 79) { - return b ^ c ^ d; - } - }, - - /** - * Circular left-shift operator. - * @private - */ - _S:function(n, x) { - return (x << n) | (x >>> 32-n); - }, - - /** - * Perform one cycle of SHA-1. - * @param {Uint32Array|bitArray} words one block of words. - * @private - */ - _block:function (words) { - var t, tmp, a, b, c, d, e, - h = this._h; - var w; - if (typeof Uint32Array !== 'undefined') { - // When words is passed to _block, it has 16 elements. SHA1 _block - // function extends words with new elements (at the end there are 80 elements). - // The problem is that if we use Uint32Array instead of Array, - // the length of Uint32Array cannot be changed. Thus, we replace words with a - // normal Array here. - w = Array(80); // do not use Uint32Array here as the instantiation is slower - for (var j=0; j<16; j++){ - w[j] = words[j]; - } - } else { - w = words; - } - - a = h[0]; b = h[1]; c = h[2]; d = h[3]; e = h[4]; - - for (t=0; t<=79; t++) { - if (t >= 16) { - w[t] = this._S(1, w[t-3] ^ w[t-8] ^ w[t-14] ^ w[t-16]); - } - tmp = (this._S(5, a) + this._f(t, b, c, d) + e + w[t] + - this._key[Math.floor(t/20)]) | 0; - e = d; - d = c; - c = this._S(30, b); - b = a; - a = tmp; - } - - h[0] = (h[0]+a) |0; - h[1] = (h[1]+b) |0; - h[2] = (h[2]+c) |0; - h[3] = (h[3]+d) |0; - h[4] = (h[4]+e) |0; - } -}; diff --git a/sjcl/core/sha256.js b/sjcl/core/sha256.js deleted file mode 100644 index 22ff4d86..00000000 --- a/sjcl/core/sha256.js +++ /dev/null @@ -1,230 +0,0 @@ -/** @fileOverview Javascript SHA-256 implementation. - * - * An older version of this implementation is available in the public - * domain, but this one is (c) Emily Stark, Mike Hamburg, Dan Boneh, - * Stanford University 2008-2010 and BSD-licensed for liability - * reasons. - * - * Special thanks to Aldo Cortesi for pointing out several bugs in - * this code. - * - * @author Emily Stark - * @author Mike Hamburg - * @author Dan Boneh - */ - -/** - * Context for a SHA-256 operation in progress. - * @constructor - */ -sjcl.hash.sha256 = function (hash) { - if (!this._key[0]) { this._precompute(); } - if (hash) { - this._h = hash._h.slice(0); - this._buffer = hash._buffer.slice(0); - this._length = hash._length; - } else { - this.reset(); - } -}; - -/** - * Hash a string or an array of words. - * @static - * @param {bitArray|String} data the data to hash. - * @return {bitArray} The hash value, an array of 16 big-endian words. - */ -sjcl.hash.sha256.hash = function (data) { - return (new sjcl.hash.sha256()).update(data).finalize(); -}; - -sjcl.hash.sha256.prototype = { - /** - * The hash's block size, in bits. - * @constant - */ - blockSize: 512, - - /** - * Reset the hash state. - * @return this - */ - reset:function () { - this._h = this._init.slice(0); - this._buffer = []; - this._length = 0; - return this; - }, - - /** - * Input several words to the hash. - * @param {bitArray|String} data the data to hash. - * @return this - */ - update: function (data) { - if (typeof data === "string") { - data = sjcl.codec.utf8String.toBits(data); - } - var i, b = this._buffer = sjcl.bitArray.concat(this._buffer, data), - ol = this._length, - nl = this._length = ol + sjcl.bitArray.bitLength(data); - if (nl > 9007199254740991){ - throw new sjcl.exception.invalid("Cannot hash more than 2^53 - 1 bits"); - } - - if (typeof Uint32Array !== 'undefined') { - var c = new Uint32Array(b); - var j = 0; - for (i = 512+ol - ((512+ol) & 511); i <= nl; i+= 512) { - this._block(c.subarray(16 * j, 16 * (j+1))); - j += 1; - } - b.splice(0, 16 * j); - } else { - for (i = 512+ol - ((512+ol) & 511); i <= nl; i+= 512) { - this._block(b.splice(0,16)); - } - } - return this; - }, - - /** - * Complete hashing and output the hash value. - * @return {bitArray} The hash value, an array of 8 big-endian words. - */ - finalize:function () { - var i, b = this._buffer, h = this._h; - - // Round out and push the buffer - b = sjcl.bitArray.concat(b, [sjcl.bitArray.partial(1,1)]); - - // Round out the buffer to a multiple of 16 words, less the 2 length words. - for (i = b.length + 2; i & 15; i++) { - b.push(0); - } - - // append the length - b.push(Math.floor(this._length / 0x100000000)); - b.push(this._length | 0); - - while (b.length) { - this._block(b.splice(0,16)); - } - - this.reset(); - return h; - }, - - /** - * The SHA-256 initialization vector, to be precomputed. - * @private - */ - _init:[], - /* - _init:[0x6a09e667,0xbb67ae85,0x3c6ef372,0xa54ff53a,0x510e527f,0x9b05688c,0x1f83d9ab,0x5be0cd19], - */ - - /** - * The SHA-256 hash key, to be precomputed. - * @private - */ - _key:[], - /* - _key: - [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], - */ - - - /** - * Function to precompute _init and _key. - * @private - */ - _precompute: function () { - var i = 0, prime = 2, factor, isPrime; - - function frac(x) { return (x-Math.floor(x)) * 0x100000000 | 0; } - - for (; i<64; prime++) { - isPrime = true; - for (factor=2; factor*factor <= prime; factor++) { - if (prime % factor === 0) { - isPrime = false; - break; - } - } - if (isPrime) { - if (i<8) { - this._init[i] = frac(Math.pow(prime, 1/2)); - } - this._key[i] = frac(Math.pow(prime, 1/3)); - i++; - } - } - }, - - /** - * Perform one cycle of SHA-256. - * @param {Uint32Array|bitArray} w one block of words. - * @private - */ - _block:function (w) { - var i, tmp, a, b, - h = this._h, - k = this._key, - h0 = h[0], h1 = h[1], h2 = h[2], h3 = h[3], - h4 = h[4], h5 = h[5], h6 = h[6], h7 = h[7]; - - /* Rationale for placement of |0 : - * If a value can overflow is original 32 bits by a factor of more than a few - * million (2^23 ish), there is a possibility that it might overflow the - * 53-bit mantissa and lose precision. - * - * To avoid this, we clamp back to 32 bits by |'ing with 0 on any value that - * propagates around the loop, and on the hash state h[]. I don't believe - * that the clamps on h4 and on h0 are strictly necessary, but it's close - * (for h4 anyway), and better safe than sorry. - * - * The clamps on h[] are necessary for the output to be correct even in the - * common case and for short inputs. - */ - for (i=0; i<64; i++) { - // load up the input word for this round - if (i<16) { - tmp = w[i]; - } else { - a = w[(i+1 ) & 15]; - b = w[(i+14) & 15]; - tmp = w[i&15] = ((a>>>7 ^ a>>>18 ^ a>>>3 ^ a<<25 ^ a<<14) + - (b>>>17 ^ b>>>19 ^ b>>>10 ^ b<<15 ^ b<<13) + - w[i&15] + w[(i+9) & 15]) | 0; - } - - tmp = (tmp + h7 + (h4>>>6 ^ h4>>>11 ^ h4>>>25 ^ h4<<26 ^ h4<<21 ^ h4<<7) + (h6 ^ h4&(h5^h6)) + k[i]); // | 0; - - // shift register - h7 = h6; h6 = h5; h5 = h4; - h4 = h3 + tmp | 0; - h3 = h2; h2 = h1; h1 = h0; - - h0 = (tmp + ((h1&h2) ^ (h3&(h1^h2))) + (h1>>>2 ^ h1>>>13 ^ h1>>>22 ^ h1<<30 ^ h1<<19 ^ h1<<10)) | 0; - } - - h[0] = h[0]+h0 | 0; - h[1] = h[1]+h1 | 0; - h[2] = h[2]+h2 | 0; - h[3] = h[3]+h3 | 0; - h[4] = h[4]+h4 | 0; - h[5] = h[5]+h5 | 0; - h[6] = h[6]+h6 | 0; - h[7] = h[7]+h7 | 0; - } -}; - - diff --git a/sjcl/core/sha512.js b/sjcl/core/sha512.js deleted file mode 100644 index 32da101a..00000000 --- a/sjcl/core/sha512.js +++ /dev/null @@ -1,376 +0,0 @@ -/** @fileOverview Javascript SHA-512 implementation. - * - * This implementation was written for CryptoJS by Jeff Mott and adapted for - * SJCL by Stefan Thomas. - * - * CryptoJS (c) 2009–2012 by Jeff Mott. All rights reserved. - * Released with New BSD License - * - * @author Emily Stark - * @author Mike Hamburg - * @author Dan Boneh - * @author Jeff Mott - * @author Stefan Thomas - */ - -/** - * Context for a SHA-512 operation in progress. - * @constructor - */ -sjcl.hash.sha512 = function (hash) { - if (!this._key[0]) { this._precompute(); } - if (hash) { - this._h = hash._h.slice(0); - this._buffer = hash._buffer.slice(0); - this._length = hash._length; - } else { - this.reset(); - } -}; - -/** - * Hash a string or an array of words. - * @static - * @param {bitArray|String} data the data to hash. - * @return {bitArray} The hash value, an array of 16 big-endian words. - */ -sjcl.hash.sha512.hash = function (data) { - return (new sjcl.hash.sha512()).update(data).finalize(); -}; - -sjcl.hash.sha512.prototype = { - /** - * The hash's block size, in bits. - * @constant - */ - blockSize: 1024, - - /** - * Reset the hash state. - * @return this - */ - reset:function () { - this._h = this._init.slice(0); - this._buffer = []; - this._length = 0; - return this; - }, - - /** - * Input several words to the hash. - * @param {bitArray|String} data the data to hash. - * @return this - */ - update: function (data) { - if (typeof data === "string") { - data = sjcl.codec.utf8String.toBits(data); - } - var i, b = this._buffer = sjcl.bitArray.concat(this._buffer, data), - ol = this._length, - nl = this._length = ol + sjcl.bitArray.bitLength(data); - if (nl > 9007199254740991){ - throw new sjcl.exception.invalid("Cannot hash more than 2^53 - 1 bits"); - } - - if (typeof Uint32Array !== 'undefined') { - var c = new Uint32Array(b); - var j = 0; - for (i = 1024+ol - ((1024+ol) & 1023); i <= nl; i+= 1024) { - this._block(c.subarray(32 * j, 32 * (j+1))); - j += 1; - } - b.splice(0, 32 * j); - } else { - for (i = 1024+ol - ((1024+ol) & 1023); i <= nl; i+= 1024) { - this._block(b.splice(0,32)); - } - } - return this; - }, - - /** - * Complete hashing and output the hash value. - * @return {bitArray} The hash value, an array of 16 big-endian words. - */ - finalize:function () { - var i, b = this._buffer, h = this._h; - - // Round out and push the buffer - b = sjcl.bitArray.concat(b, [sjcl.bitArray.partial(1,1)]); - - // Round out the buffer to a multiple of 32 words, less the 4 length words. - for (i = b.length + 4; i & 31; i++) { - b.push(0); - } - - // append the length - b.push(0); - b.push(0); - b.push(Math.floor(this._length / 0x100000000)); - b.push(this._length | 0); - - while (b.length) { - this._block(b.splice(0,32)); - } - - this.reset(); - return h; - }, - - /** - * The SHA-512 initialization vector, to be precomputed. - * @private - */ - _init:[], - - /** - * Least significant 24 bits of SHA512 initialization values. - * - * Javascript only has 53 bits of precision, so we compute the 40 most - * significant bits and add the remaining 24 bits as constants. - * - * @private - */ - _initr: [ 0xbcc908, 0xcaa73b, 0x94f82b, 0x1d36f1, 0xe682d1, 0x3e6c1f, 0x41bd6b, 0x7e2179 ], - - /* - _init: - [0x6a09e667, 0xf3bcc908, 0xbb67ae85, 0x84caa73b, 0x3c6ef372, 0xfe94f82b, 0xa54ff53a, 0x5f1d36f1, - 0x510e527f, 0xade682d1, 0x9b05688c, 0x2b3e6c1f, 0x1f83d9ab, 0xfb41bd6b, 0x5be0cd19, 0x137e2179], - */ - - /** - * The SHA-512 hash key, to be precomputed. - * @private - */ - _key:[], - - /** - * Least significant 24 bits of SHA512 key values. - * @private - */ - _keyr: - [0x28ae22, 0xef65cd, 0x4d3b2f, 0x89dbbc, 0x48b538, 0x05d019, 0x194f9b, 0x6d8118, - 0x030242, 0x706fbe, 0xe4b28c, 0xffb4e2, 0x7b896f, 0x1696b1, 0xc71235, 0x692694, - 0xf14ad2, 0x4f25e3, 0x8cd5b5, 0xac9c65, 0x2b0275, 0xa6e483, 0x41fbd4, 0x1153b5, - 0x66dfab, 0xb43210, 0xfb213f, 0xef0ee4, 0xa88fc2, 0x0aa725, 0x03826f, 0x0e6e70, - 0xd22ffc, 0x26c926, 0xc42aed, 0x95b3df, 0xaf63de, 0x77b2a8, 0xedaee6, 0x82353b, - 0xf10364, 0x423001, 0xf89791, 0x54be30, 0xef5218, 0x65a910, 0x71202a, 0xbbd1b8, - 0xd2d0c8, 0x41ab53, 0x8eeb99, 0x9b48a8, 0xc95a63, 0x418acb, 0x63e373, 0xb2b8a3, - 0xefb2fc, 0x172f60, 0xf0ab72, 0x6439ec, 0x631e28, 0x82bde9, 0xc67915, 0x72532b, - 0x26619c, 0xc0c207, 0xe0eb1e, 0x6ed178, 0x176fba, 0xc898a6, 0xf90dae, 0x1c471b, - 0x047d84, 0xc72493, 0xc9bebc, 0x100d4c, 0x3e42b6, 0x657e2a, 0xd6faec, 0x475817], - - /* - _key: - [0x428a2f98, 0xd728ae22, 0x71374491, 0x23ef65cd, 0xb5c0fbcf, 0xec4d3b2f, 0xe9b5dba5, 0x8189dbbc, - 0x3956c25b, 0xf348b538, 0x59f111f1, 0xb605d019, 0x923f82a4, 0xaf194f9b, 0xab1c5ed5, 0xda6d8118, - 0xd807aa98, 0xa3030242, 0x12835b01, 0x45706fbe, 0x243185be, 0x4ee4b28c, 0x550c7dc3, 0xd5ffb4e2, - 0x72be5d74, 0xf27b896f, 0x80deb1fe, 0x3b1696b1, 0x9bdc06a7, 0x25c71235, 0xc19bf174, 0xcf692694, - 0xe49b69c1, 0x9ef14ad2, 0xefbe4786, 0x384f25e3, 0x0fc19dc6, 0x8b8cd5b5, 0x240ca1cc, 0x77ac9c65, - 0x2de92c6f, 0x592b0275, 0x4a7484aa, 0x6ea6e483, 0x5cb0a9dc, 0xbd41fbd4, 0x76f988da, 0x831153b5, - 0x983e5152, 0xee66dfab, 0xa831c66d, 0x2db43210, 0xb00327c8, 0x98fb213f, 0xbf597fc7, 0xbeef0ee4, - 0xc6e00bf3, 0x3da88fc2, 0xd5a79147, 0x930aa725, 0x06ca6351, 0xe003826f, 0x14292967, 0x0a0e6e70, - 0x27b70a85, 0x46d22ffc, 0x2e1b2138, 0x5c26c926, 0x4d2c6dfc, 0x5ac42aed, 0x53380d13, 0x9d95b3df, - 0x650a7354, 0x8baf63de, 0x766a0abb, 0x3c77b2a8, 0x81c2c92e, 0x47edaee6, 0x92722c85, 0x1482353b, - 0xa2bfe8a1, 0x4cf10364, 0xa81a664b, 0xbc423001, 0xc24b8b70, 0xd0f89791, 0xc76c51a3, 0x0654be30, - 0xd192e819, 0xd6ef5218, 0xd6990624, 0x5565a910, 0xf40e3585, 0x5771202a, 0x106aa070, 0x32bbd1b8, - 0x19a4c116, 0xb8d2d0c8, 0x1e376c08, 0x5141ab53, 0x2748774c, 0xdf8eeb99, 0x34b0bcb5, 0xe19b48a8, - 0x391c0cb3, 0xc5c95a63, 0x4ed8aa4a, 0xe3418acb, 0x5b9cca4f, 0x7763e373, 0x682e6ff3, 0xd6b2b8a3, - 0x748f82ee, 0x5defb2fc, 0x78a5636f, 0x43172f60, 0x84c87814, 0xa1f0ab72, 0x8cc70208, 0x1a6439ec, - 0x90befffa, 0x23631e28, 0xa4506ceb, 0xde82bde9, 0xbef9a3f7, 0xb2c67915, 0xc67178f2, 0xe372532b, - 0xca273ece, 0xea26619c, 0xd186b8c7, 0x21c0c207, 0xeada7dd6, 0xcde0eb1e, 0xf57d4f7f, 0xee6ed178, - 0x06f067aa, 0x72176fba, 0x0a637dc5, 0xa2c898a6, 0x113f9804, 0xbef90dae, 0x1b710b35, 0x131c471b, - 0x28db77f5, 0x23047d84, 0x32caab7b, 0x40c72493, 0x3c9ebe0a, 0x15c9bebc, 0x431d67c4, 0x9c100d4c, - 0x4cc5d4be, 0xcb3e42b6, 0x597f299c, 0xfc657e2a, 0x5fcb6fab, 0x3ad6faec, 0x6c44198c, 0x4a475817], - */ - - /** - * Function to precompute _init and _key. - * @private - */ - _precompute: function () { - // XXX: This code is for precomputing the SHA256 constants, change for - // SHA512 and re-enable. - var i = 0, prime = 2, factor , isPrime; - - function frac(x) { return (x-Math.floor(x)) * 0x100000000 | 0; } - function frac2(x) { return (x-Math.floor(x)) * 0x10000000000 & 0xff; } - - for (; i<80; prime++) { - isPrime = true; - for (factor=2; factor*factor <= prime; factor++) { - if (prime % factor === 0) { - isPrime = false; - break; - } - } - if (isPrime) { - if (i<8) { - this._init[i*2] = frac(Math.pow(prime, 1/2)); - this._init[i*2+1] = (frac2(Math.pow(prime, 1/2)) << 24) | this._initr[i]; - } - this._key[i*2] = frac(Math.pow(prime, 1/3)); - this._key[i*2+1] = (frac2(Math.pow(prime, 1/3)) << 24) | this._keyr[i]; - i++; - } - } - }, - - /** - * Perform one cycle of SHA-512. - * @param {Uint32Array|bitArray} words one block of words. - * @private - */ - _block:function (words) { - var i, wrh, wrl, - h = this._h, - k = this._key, - h0h = h[ 0], h0l = h[ 1], h1h = h[ 2], h1l = h[ 3], - h2h = h[ 4], h2l = h[ 5], h3h = h[ 6], h3l = h[ 7], - h4h = h[ 8], h4l = h[ 9], h5h = h[10], h5l = h[11], - h6h = h[12], h6l = h[13], h7h = h[14], h7l = h[15]; - var w; - if (typeof Uint32Array !== 'undefined') { - // When words is passed to _block, it has 32 elements. SHA512 _block - // function extends words with new elements (at the end there are 160 elements). - // The problem is that if we use Uint32Array instead of Array, - // the length of Uint32Array cannot be changed. Thus, we replace words with a - // normal Array here. - w = Array(160); // do not use Uint32Array here as the instantiation is slower - for (var j=0; j<32; j++){ - w[j] = words[j]; - } - } else { - w = words; - } - - // Working variables - var ah = h0h, al = h0l, bh = h1h, bl = h1l, - ch = h2h, cl = h2l, dh = h3h, dl = h3l, - eh = h4h, el = h4l, fh = h5h, fl = h5l, - gh = h6h, gl = h6l, hh = h7h, hl = h7l; - - for (i=0; i<80; i++) { - // load up the input word for this round - if (i<16) { - wrh = w[i * 2]; - wrl = w[i * 2 + 1]; - } else { - // Gamma0 - var gamma0xh = w[(i-15) * 2]; - var gamma0xl = w[(i-15) * 2 + 1]; - var gamma0h = - ((gamma0xl << 31) | (gamma0xh >>> 1)) ^ - ((gamma0xl << 24) | (gamma0xh >>> 8)) ^ - (gamma0xh >>> 7); - var gamma0l = - ((gamma0xh << 31) | (gamma0xl >>> 1)) ^ - ((gamma0xh << 24) | (gamma0xl >>> 8)) ^ - ((gamma0xh << 25) | (gamma0xl >>> 7)); - - // Gamma1 - var gamma1xh = w[(i-2) * 2]; - var gamma1xl = w[(i-2) * 2 + 1]; - var gamma1h = - ((gamma1xl << 13) | (gamma1xh >>> 19)) ^ - ((gamma1xh << 3) | (gamma1xl >>> 29)) ^ - (gamma1xh >>> 6); - var gamma1l = - ((gamma1xh << 13) | (gamma1xl >>> 19)) ^ - ((gamma1xl << 3) | (gamma1xh >>> 29)) ^ - ((gamma1xh << 26) | (gamma1xl >>> 6)); - - // Shortcuts - var wr7h = w[(i-7) * 2]; - var wr7l = w[(i-7) * 2 + 1]; - - var wr16h = w[(i-16) * 2]; - var wr16l = w[(i-16) * 2 + 1]; - - // W(round) = gamma0 + W(round - 7) + gamma1 + W(round - 16) - wrl = gamma0l + wr7l; - wrh = gamma0h + wr7h + ((wrl >>> 0) < (gamma0l >>> 0) ? 1 : 0); - wrl += gamma1l; - wrh += gamma1h + ((wrl >>> 0) < (gamma1l >>> 0) ? 1 : 0); - wrl += wr16l; - wrh += wr16h + ((wrl >>> 0) < (wr16l >>> 0) ? 1 : 0); - } - - w[i*2] = wrh |= 0; - w[i*2 + 1] = wrl |= 0; - - // Ch - var chh = (eh & fh) ^ (~eh & gh); - var chl = (el & fl) ^ (~el & gl); - - // Maj - var majh = (ah & bh) ^ (ah & ch) ^ (bh & ch); - var majl = (al & bl) ^ (al & cl) ^ (bl & cl); - - // Sigma0 - var sigma0h = ((al << 4) | (ah >>> 28)) ^ ((ah << 30) | (al >>> 2)) ^ ((ah << 25) | (al >>> 7)); - var sigma0l = ((ah << 4) | (al >>> 28)) ^ ((al << 30) | (ah >>> 2)) ^ ((al << 25) | (ah >>> 7)); - - // Sigma1 - var sigma1h = ((el << 18) | (eh >>> 14)) ^ ((el << 14) | (eh >>> 18)) ^ ((eh << 23) | (el >>> 9)); - var sigma1l = ((eh << 18) | (el >>> 14)) ^ ((eh << 14) | (el >>> 18)) ^ ((el << 23) | (eh >>> 9)); - - // K(round) - var krh = k[i*2]; - var krl = k[i*2+1]; - - // t1 = h + sigma1 + ch + K(round) + W(round) - var t1l = hl + sigma1l; - var t1h = hh + sigma1h + ((t1l >>> 0) < (hl >>> 0) ? 1 : 0); - t1l += chl; - t1h += chh + ((t1l >>> 0) < (chl >>> 0) ? 1 : 0); - t1l += krl; - t1h += krh + ((t1l >>> 0) < (krl >>> 0) ? 1 : 0); - t1l = t1l + wrl|0; // FF32..FF34 perf issue https://bugzilla.mozilla.org/show_bug.cgi?id=1054972 - t1h += wrh + ((t1l >>> 0) < (wrl >>> 0) ? 1 : 0); - - // t2 = sigma0 + maj - var t2l = sigma0l + majl; - var t2h = sigma0h + majh + ((t2l >>> 0) < (sigma0l >>> 0) ? 1 : 0); - - // Update working variables - hh = gh; - hl = gl; - gh = fh; - gl = fl; - fh = eh; - fl = el; - el = (dl + t1l) | 0; - eh = (dh + t1h + ((el >>> 0) < (dl >>> 0) ? 1 : 0)) | 0; - dh = ch; - dl = cl; - ch = bh; - cl = bl; - bh = ah; - bl = al; - al = (t1l + t2l) | 0; - ah = (t1h + t2h + ((al >>> 0) < (t1l >>> 0) ? 1 : 0)) | 0; - } - - // Intermediate hash - h0l = h[1] = (h0l + al) | 0; - h[0] = (h0h + ah + ((h0l >>> 0) < (al >>> 0) ? 1 : 0)) | 0; - h1l = h[3] = (h1l + bl) | 0; - h[2] = (h1h + bh + ((h1l >>> 0) < (bl >>> 0) ? 1 : 0)) | 0; - h2l = h[5] = (h2l + cl) | 0; - h[4] = (h2h + ch + ((h2l >>> 0) < (cl >>> 0) ? 1 : 0)) | 0; - h3l = h[7] = (h3l + dl) | 0; - h[6] = (h3h + dh + ((h3l >>> 0) < (dl >>> 0) ? 1 : 0)) | 0; - h4l = h[9] = (h4l + el) | 0; - h[8] = (h4h + eh + ((h4l >>> 0) < (el >>> 0) ? 1 : 0)) | 0; - h5l = h[11] = (h5l + fl) | 0; - h[10] = (h5h + fh + ((h5l >>> 0) < (fl >>> 0) ? 1 : 0)) | 0; - h6l = h[13] = (h6l + gl) | 0; - h[12] = (h6h + gh + ((h6l >>> 0) < (gl >>> 0) ? 1 : 0)) | 0; - h7l = h[15] = (h7l + hl) | 0; - h[14] = (h7h + hh + ((h7l >>> 0) < (hl >>> 0) ? 1 : 0)) | 0; - } -}; - - diff --git a/sjcl/core/sjcl.js b/sjcl/core/sjcl.js deleted file mode 100644 index 199faf8c..00000000 --- a/sjcl/core/sjcl.js +++ /dev/null @@ -1,103 +0,0 @@ -/** @fileOverview Javascript cryptography implementation. - * - * Crush to remove comments, shorten variable names and - * generally reduce transmission size. - * - * @author Emily Stark - * @author Mike Hamburg - * @author Dan Boneh - */ - -"use strict"; -/*jslint indent: 2, bitwise: false, nomen: false, plusplus: false, white: false, regexp: false */ -/*global document, window, escape, unescape, module, require, Uint32Array */ - -/** - * The Stanford Javascript Crypto Library, top-level namespace. - * @namespace - */ -var sjcl = { - /** - * Symmetric ciphers. - * @namespace - */ - cipher: {}, - - /** - * Hash functions. Right now only SHA256 is implemented. - * @namespace - */ - hash: {}, - - /** - * Key exchange functions. Right now only SRP is implemented. - * @namespace - */ - keyexchange: {}, - - /** - * Cipher modes of operation. - * @namespace - */ - mode: {}, - - /** - * Miscellaneous. HMAC and PBKDF2. - * @namespace - */ - misc: {}, - - /** - * Bit array encoders and decoders. - * @namespace - * - * @description - * The members of this namespace are functions which translate between - * SJCL's bitArrays and other objects (usually strings). Because it - * isn't always clear which direction is encoding and which is decoding, - * the method names are "fromBits" and "toBits". - */ - codec: {}, - - /** - * Exceptions. - * @namespace - */ - exception: { - /** - * Ciphertext is corrupt. - * @constructor - */ - corrupt: function(message) { - this.toString = function() { return "CORRUPT: "+this.message; }; - this.message = message; - }, - - /** - * Invalid parameter. - * @constructor - */ - invalid: function(message) { - this.toString = function() { return "INVALID: "+this.message; }; - this.message = message; - }, - - /** - * Bug or missing feature in SJCL. - * @constructor - */ - bug: function(message) { - this.toString = function() { return "BUG: "+this.message; }; - this.message = message; - }, - - /** - * Something isn't ready. - * @constructor - */ - notReady: function(message) { - this.toString = function() { return "NOT READY: "+this.message; }; - this.message = message; - } - } -}; diff --git a/sjcl/core/srp.js b/sjcl/core/srp.js deleted file mode 100644 index 84876321..00000000 --- a/sjcl/core/srp.js +++ /dev/null @@ -1,226 +0,0 @@ -/** @fileOverview Javascript SRP implementation. - * - * This file contains a partial implementation of the SRP (Secure Remote - * Password) password-authenticated key exchange protocol. Given a user - * identity, salt, and SRP group, it generates the SRP verifier that may - * be sent to a remote server to establish and SRP account. - * - * For more information, see http://srp.stanford.edu/. - * - * @author Quinn Slack - */ - -/** - * Compute the SRP verifier from the username, password, salt, and group. - * @namespace - */ -sjcl.keyexchange.srp = { - /** - * Calculates SRP v, the verifier. - * v = g^x mod N [RFC 5054] - * @param {String} I The username. - * @param {String} P The password. - * @param {Object} s A bitArray of the salt. - * @param {Object} group The SRP group. Use sjcl.keyexchange.srp.knownGroup - to obtain this object. - * @return {Object} A bitArray of SRP v. - */ - makeVerifier: function(I, P, s, group) { - var x; - x = sjcl.keyexchange.srp.makeX(I, P, s); - x = sjcl.bn.fromBits(x); - return group.g.powermod(x, group.N); - }, - - /** - * Calculates SRP x. - * x = SHA1( | SHA( | ":" | )) [RFC 2945] - * @param {String} I The username. - * @param {String} P The password. - * @param {Object} s A bitArray of the salt. - * @return {Object} A bitArray of SRP x. - */ - makeX: function(I, P, s) { - var inner = sjcl.hash.sha1.hash(I + ':' + P); - return sjcl.hash.sha1.hash(sjcl.bitArray.concat(s, inner)); - }, - - /** - * Returns the known SRP group with the given size (in bits). - * @param {String} i The size of the known SRP group. - * @return {Object} An object with "N" and "g" properties. - */ - knownGroup:function(i) { - if (typeof i !== "string") { i = i.toString(); } - if (!sjcl.keyexchange.srp._didInitKnownGroups) { sjcl.keyexchange.srp._initKnownGroups(); } - return sjcl.keyexchange.srp._knownGroups[i]; - }, - - /** - * Initializes bignum objects for known group parameters. - * @private - */ - _didInitKnownGroups: false, - _initKnownGroups:function() { - var i, size, group; - for (i=0; i < sjcl.keyexchange.srp._knownGroupSizes.length; i++) { - size = sjcl.keyexchange.srp._knownGroupSizes[i].toString(); - group = sjcl.keyexchange.srp._knownGroups[size]; - group.N = new sjcl.bn(group.N); - group.g = new sjcl.bn(group.g); - } - sjcl.keyexchange.srp._didInitKnownGroups = true; - }, - - _knownGroupSizes: [1024, 1536, 2048, 3072, 4096, 6144, 8192], - _knownGroups: { - 1024: { - N: "EEAF0AB9ADB38DD69C33F80AFA8FC5E86072618775FF3C0B9EA2314C" + - "9C256576D674DF7496EA81D3383B4813D692C6E0E0D5D8E250B98BE4" + - "8E495C1D6089DAD15DC7D7B46154D6B6CE8EF4AD69B15D4982559B29" + - "7BCF1885C529F566660E57EC68EDBC3C05726CC02FD4CBF4976EAA9A" + - "FD5138FE8376435B9FC61D2FC0EB06E3", - g:2 - }, - - 1536: { - N: "9DEF3CAFB939277AB1F12A8617A47BBBDBA51DF499AC4C80BEEEA961" + - "4B19CC4D5F4F5F556E27CBDE51C6A94BE4607A291558903BA0D0F843" + - "80B655BB9A22E8DCDF028A7CEC67F0D08134B1C8B97989149B609E0B" + - "E3BAB63D47548381DBC5B1FC764E3F4B53DD9DA1158BFD3E2B9C8CF5" + - "6EDF019539349627DB2FD53D24B7C48665772E437D6C7F8CE442734A" + - "F7CCB7AE837C264AE3A9BEB87F8A2FE9B8B5292E5A021FFF5E91479E" + - "8CE7A28C2442C6F315180F93499A234DCF76E3FED135F9BB", - g: 2 - }, - - 2048: { - N: "AC6BDB41324A9A9BF166DE5E1389582FAF72B6651987EE07FC319294" + - "3DB56050A37329CBB4A099ED8193E0757767A13DD52312AB4B03310D" + - "CD7F48A9DA04FD50E8083969EDB767B0CF6095179A163AB3661A05FB" + - "D5FAAAE82918A9962F0B93B855F97993EC975EEAA80D740ADBF4FF74" + - "7359D041D5C33EA71D281E446B14773BCA97B43A23FB801676BD207A" + - "436C6481F1D2B9078717461A5B9D32E688F87748544523B524B0D57D" + - "5EA77A2775D2ECFA032CFBDBF52FB3786160279004E57AE6AF874E73" + - "03CE53299CCC041C7BC308D82A5698F3A8D0C38271AE35F8E9DBFBB6" + - "94B5C803D89F7AE435DE236D525F54759B65E372FCD68EF20FA7111F" + - "9E4AFF73", - g: 2 - }, - - 3072: { - N: "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E08" + - "8A67CC74020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B" + - "302B0A6DF25F14374FE1356D6D51C245E485B576625E7EC6F44C42E9" + - "A637ED6B0BFF5CB6F406B7EDEE386BFB5A899FA5AE9F24117C4B1FE6" + - "49286651ECE45B3DC2007CB8A163BF0598DA48361C55D39A69163FA8" + - "FD24CF5F83655D23DCA3AD961C62F356208552BB9ED529077096966D" + - "670C354E4ABC9804F1746C08CA18217C32905E462E36CE3BE39E772C" + - "180E86039B2783A2EC07A28FB5C55DF06F4C52C9DE2BCBF695581718" + - "3995497CEA956AE515D2261898FA051015728E5A8AAAC42DAD33170D" + - "04507A33A85521ABDF1CBA64ECFB850458DBEF0A8AEA71575D060C7D" + - "B3970F85A6E1E4C7ABF5AE8CDB0933D71E8C94E04A25619DCEE3D226" + - "1AD2EE6BF12FFA06D98A0864D87602733EC86A64521F2B18177B200C" + - "BBE117577A615D6C770988C0BAD946E208E24FA074E5AB3143DB5BFC" + - "E0FD108E4B82D120A93AD2CAFFFFFFFFFFFFFFFF", - g: 5 - }, - - 4096: { - N: "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E08" + - "8A67CC74020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B" + - "302B0A6DF25F14374FE1356D6D51C245E485B576625E7EC6F44C42E9" + - "A637ED6B0BFF5CB6F406B7EDEE386BFB5A899FA5AE9F24117C4B1FE6" + - "49286651ECE45B3DC2007CB8A163BF0598DA48361C55D39A69163FA8" + - "FD24CF5F83655D23DCA3AD961C62F356208552BB9ED529077096966D" + - "670C354E4ABC9804F1746C08CA18217C32905E462E36CE3BE39E772C" + - "180E86039B2783A2EC07A28FB5C55DF06F4C52C9DE2BCBF695581718" + - "3995497CEA956AE515D2261898FA051015728E5A8AAAC42DAD33170D" + - "04507A33A85521ABDF1CBA64ECFB850458DBEF0A8AEA71575D060C7D" + - "B3970F85A6E1E4C7ABF5AE8CDB0933D71E8C94E04A25619DCEE3D226" + - "1AD2EE6BF12FFA06D98A0864D87602733EC86A64521F2B18177B200C" + - "BBE117577A615D6C770988C0BAD946E208E24FA074E5AB3143DB5BFC" + - "E0FD108E4B82D120A92108011A723C12A787E6D788719A10BDBA5B26" + - "99C327186AF4E23C1A946834B6150BDA2583E9CA2AD44CE8DBBBC2DB" + - "04DE8EF92E8EFC141FBECAA6287C59474E6BC05D99B2964FA090C3A2" + - "233BA186515BE7ED1F612970CEE2D7AFB81BDD762170481CD0069127" + - "D5B05AA993B4EA988D8FDDC186FFB7DC90A6C08F4DF435C934063199" + - "FFFFFFFFFFFFFFFF", - g: 5 - }, - - 6144: { - N: "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E08" + - "8A67CC74020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B" + - "302B0A6DF25F14374FE1356D6D51C245E485B576625E7EC6F44C42E9" + - "A637ED6B0BFF5CB6F406B7EDEE386BFB5A899FA5AE9F24117C4B1FE6" + - "49286651ECE45B3DC2007CB8A163BF0598DA48361C55D39A69163FA8" + - "FD24CF5F83655D23DCA3AD961C62F356208552BB9ED529077096966D" + - "670C354E4ABC9804F1746C08CA18217C32905E462E36CE3BE39E772C" + - "180E86039B2783A2EC07A28FB5C55DF06F4C52C9DE2BCBF695581718" + - "3995497CEA956AE515D2261898FA051015728E5A8AAAC42DAD33170D" + - "04507A33A85521ABDF1CBA64ECFB850458DBEF0A8AEA71575D060C7D" + - "B3970F85A6E1E4C7ABF5AE8CDB0933D71E8C94E04A25619DCEE3D226" + - "1AD2EE6BF12FFA06D98A0864D87602733EC86A64521F2B18177B200C" + - "BBE117577A615D6C770988C0BAD946E208E24FA074E5AB3143DB5BFC" + - "E0FD108E4B82D120A92108011A723C12A787E6D788719A10BDBA5B26" + - "99C327186AF4E23C1A946834B6150BDA2583E9CA2AD44CE8DBBBC2DB" + - "04DE8EF92E8EFC141FBECAA6287C59474E6BC05D99B2964FA090C3A2" + - "233BA186515BE7ED1F612970CEE2D7AFB81BDD762170481CD0069127" + - "D5B05AA993B4EA988D8FDDC186FFB7DC90A6C08F4DF435C934028492" + - "36C3FAB4D27C7026C1D4DCB2602646DEC9751E763DBA37BDF8FF9406" + - "AD9E530EE5DB382F413001AEB06A53ED9027D831179727B0865A8918" + - "DA3EDBEBCF9B14ED44CE6CBACED4BB1BDB7F1447E6CC254B33205151" + - "2BD7AF426FB8F401378CD2BF5983CA01C64B92ECF032EA15D1721D03" + - "F482D7CE6E74FEF6D55E702F46980C82B5A84031900B1C9E59E7C97F" + - "BEC7E8F323A97A7E36CC88BE0F1D45B7FF585AC54BD407B22B4154AA" + - "CC8F6D7EBF48E1D814CC5ED20F8037E0A79715EEF29BE32806A1D58B" + - "B7C5DA76F550AA3D8A1FBFF0EB19CCB1A313D55CDA56C9EC2EF29632" + - "387FE8D76E3C0468043E8F663F4860EE12BF2D5B0B7474D6E694F91E" + - "6DCC4024FFFFFFFFFFFFFFFF", - g: 5 - }, - - 8192: { - N:"FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E08" + - "8A67CC74020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B" + - "302B0A6DF25F14374FE1356D6D51C245E485B576625E7EC6F44C42E9" + - "A637ED6B0BFF5CB6F406B7EDEE386BFB5A899FA5AE9F24117C4B1FE6" + - "49286651ECE45B3DC2007CB8A163BF0598DA48361C55D39A69163FA8" + - "FD24CF5F83655D23DCA3AD961C62F356208552BB9ED529077096966D" + - "670C354E4ABC9804F1746C08CA18217C32905E462E36CE3BE39E772C" + - "180E86039B2783A2EC07A28FB5C55DF06F4C52C9DE2BCBF695581718" + - "3995497CEA956AE515D2261898FA051015728E5A8AAAC42DAD33170D" + - "04507A33A85521ABDF1CBA64ECFB850458DBEF0A8AEA71575D060C7D" + - "B3970F85A6E1E4C7ABF5AE8CDB0933D71E8C94E04A25619DCEE3D226" + - "1AD2EE6BF12FFA06D98A0864D87602733EC86A64521F2B18177B200C" + - "BBE117577A615D6C770988C0BAD946E208E24FA074E5AB3143DB5BFC" + - "E0FD108E4B82D120A92108011A723C12A787E6D788719A10BDBA5B26" + - "99C327186AF4E23C1A946834B6150BDA2583E9CA2AD44CE8DBBBC2DB" + - "04DE8EF92E8EFC141FBECAA6287C59474E6BC05D99B2964FA090C3A2" + - "233BA186515BE7ED1F612970CEE2D7AFB81BDD762170481CD0069127" + - "D5B05AA993B4EA988D8FDDC186FFB7DC90A6C08F4DF435C934028492" + - "36C3FAB4D27C7026C1D4DCB2602646DEC9751E763DBA37BDF8FF9406" + - "AD9E530EE5DB382F413001AEB06A53ED9027D831179727B0865A8918" + - "DA3EDBEBCF9B14ED44CE6CBACED4BB1BDB7F1447E6CC254B33205151" + - "2BD7AF426FB8F401378CD2BF5983CA01C64B92ECF032EA15D1721D03" + - "F482D7CE6E74FEF6D55E702F46980C82B5A84031900B1C9E59E7C97F" + - "BEC7E8F323A97A7E36CC88BE0F1D45B7FF585AC54BD407B22B4154AA" + - "CC8F6D7EBF48E1D814CC5ED20F8037E0A79715EEF29BE32806A1D58B" + - "B7C5DA76F550AA3D8A1FBFF0EB19CCB1A313D55CDA56C9EC2EF29632" + - "387FE8D76E3C0468043E8F663F4860EE12BF2D5B0B7474D6E694F91E" + - "6DBE115974A3926F12FEE5E438777CB6A932DF8CD8BEC4D073B931BA" + - "3BC832B68D9DD300741FA7BF8AFC47ED2576F6936BA424663AAB639C" + - "5AE4F5683423B4742BF1C978238F16CBE39D652DE3FDB8BEFC848AD9" + - "22222E04A4037C0713EB57A81A23F0C73473FC646CEA306B4BCBC886" + - "2F8385DDFA9D4B7FA2C087E879683303ED5BDD3A062B3CF5B3A278A6" + - "6D2A13F83F44F82DDF310EE074AB6A364597E899A0255DC164F31CC5" + - "0846851DF9AB48195DED7EA1B1D510BD7EE74D73FAF36BC31ECFA268" + - "359046F4EB879F924009438B481C6CD7889A002ED5EE382BC9190DA6" + - "FC026E479558E4475677E9AA9E3050E2765694DFC81F56E880B96E71" + - "60C980DD98EDD3DFFFFFFFFFFFFFFFFF", - g: 19 - } - } - -}; diff --git a/sjcl/demo/alpha-arrow.png b/sjcl/demo/alpha-arrow.png deleted file mode 100644 index e4334a7d..00000000 Binary files a/sjcl/demo/alpha-arrow.png and /dev/null differ diff --git a/sjcl/demo/example.css b/sjcl/demo/example.css deleted file mode 100644 index 7fcfb737..00000000 --- a/sjcl/demo/example.css +++ /dev/null @@ -1,179 +0,0 @@ -* { - margin: 0px; - padding: 0px; - font-family: Arial, Helvetica, FreeSans, sans; -} - -h1 { - text-align: center; - background: #eee; - padding: 5px; - margin-bottom: 0.6em; - font-size: 1.5em; -} - -.header { - width: 650px; - margin: 0px auto 1em; -} - -p+p { - margin-top: 1em; -} - -.explanation { - color: #555; - margin-top: 0.3em; -} - -.section+.section, .explanation+.section { - margin-top: 1.5em; -} - -.hex { - text-transform: uppercase; -} - -.hex, .base64, #ciphertext { - font-family: 'Courier', mono; -} - -.wide, textarea { - width: 100%; - margin: 0px -4px; - font-size: inherit; - text-align: left; -} - -textarea+*, .wide+* { - margin-top: 0.3em; -} - -/* bulk object placement */ -#theForm { - position: relative; - width: 940px; - margin: 0px auto; - font-size: 0.8em; -} - -.column { - top: 0px; - width: 300px; -} - -.box { - border: 2px solid #999; - padding: 7px; - margin-bottom: 20px; - -moz-border-radius: 7px; - -webkit-border-radius: 7px; -} - -#cmode { position: absolute; left: 640px; } -#ctexts { position: absolute; left: 320px; } - -.floatright { - float: right; - text-align: right; -} - -a { - cursor: pointer; - color: #282; -} - -a.random, #buttons a { text-decoration: none; } -a.random:hover, a.random:focus { text-decoration: underline; } - -h2 { - margin: -7px -7px 3px -7px; - text-align: center; - font-size: 1.2em; - color: white; - background: #999; -} - -#pplaintext { border-color: #f65; } -#pplaintext h2 { background: #f65; } - -#ppassword { border-color: #4a4; } -#ppassword h2 { background: #4a4; } - -#pciphertext { border-color: #78f; } -#pciphertext h2 { background: #78f; } - -#buttons { text-align: center; margin-top: -20px; } - -a#doPbkdf2, a#encrypt, a#decrypt { - display: inline-block; - text-align: center; - height: 43px; - padding-top: 20px; - width: 50px; - background: url('alpha-arrow.png') no-repeat bottom center; - vertical-align: middle; - border: none; - color: white; - overflow: hidden; -} - -.turnDown { - display: inline-block; - padding-bottom: 3px; - -moz-transform: rotate(90deg); - -webkit-transform: rotate(90deg); - transform: rotate(90deg); - background-color: inherit; -} - -.turnUp { - display: inline-block; - padding-bottom: 3px; - -moz-transform: rotate(-90deg); - -webkit-transform: rotate(-90deg); - transform: rotate(-90deg); - background-color: inherit; -} - -.buttons a.disabled { - background-color: #ccc ! important; - cursor: inherit ! important; -} - -a#encrypt { background-color: #f65; margin-bottom: 2px; } -a#encrypt:hover, a#encrypt:focus { background-color: #f76; } -a#encrypt:active { background-color: #f87; } - -a#decrypt { - height: 36px; - padding-top: 27px; - background: url('alpha-arrow.png') no-repeat top center; - background-color: #78f; - margin-top: 2px; -} -a#decrypt:hover { background-color: #89f; } -a#decrypt:focus { background-color: #89f; } -a#decrypt:active { background-color: #9af; } - -#ppassword, #pkey, #pmode, #pplaintext, #pciphertext { - -moz-border-radius: 7px; - -webkit-border-radius: 7px; -} -input[type='text'], input[type='password'], textarea { - -moz-border-radius: 3px; - -webkit-border-radius: 3px; - font-size: inherit; - border: 1px solid #444; - padding: 3px; -} - -input[type='text']:focus, input[type='password']:focus, textarea:focus { - border-color: red; -} - -input[type="radio"], input[type="checkbox"] { - position: relative; - top: 0.15em; - margin-right: -0.15em; -} diff --git a/sjcl/demo/example.js b/sjcl/demo/example.js deleted file mode 100644 index 42b1c0eb..00000000 --- a/sjcl/demo/example.js +++ /dev/null @@ -1,153 +0,0 @@ -/* keep track of which salts have been used. */ -var form, usedIvs = {'':1}, usedSalts = {'':1}; - -/* enter actions */ -var enterActions = { - password: doPbkdf2, - salt: doPbkdf2, - iter: doPbkdf2 -}; - -function loaded() { - form = new formHandler('theForm', enterActions); - form._extendedKey = []; - sjcl.random.startCollectors(); - document.getElementById("password").focus(); -} - -/* there's probaby a better way to tell the user something, but oh well */ -function error(x) { - alert(x); -} - -/* compute PBKDF2 on the password. */ -function doPbkdf2(decrypting) { - var v = form.get(), salt=v.salt, key, hex = sjcl.codec.hex.fromBits, p={}, - password = v.password; - - p.iter = v.iter; - - if (password.length == 0) { - if (decrypting) { error("Can't decrypt: need a password!"); } - return; - } - - if (salt.length === 0 && decrypting) { - error("Can't decrypt: need a salt for PBKDF2!"); - return; - } - - if (decrypting || !v.freshsalt || !usedSalts[v.salt]) { - p.salt = v.salt; - } - - p = sjcl.misc.cachedPbkdf2(password, p); - form._extendedKey = p.key; - v.key = p.key.slice(0, v.keysize/32); - v.salt = p.salt; - - form.set(v); - form.plaintext.el.select(); -} -/* Encrypt a message */ -function doEncrypt() { - var v = form.get(), iv = v.iv, password = v.password, key = v.key, adata = v.adata, aes, plaintext=v.plaintext, rp = {}, ct, p; - - if (plaintext === '' && v.ciphertext.length) { return; } - if (key.length == 0 && password.length == 0) { - error("need a password or key!"); - return; - } - - p = { adata:v.adata, - iter:v.iter, - mode:v.mode, - ts:parseInt(v.tag), - ks:parseInt(v.keysize) }; - if (!v.freshiv || !usedIvs[v.iv]) { p.iv = v.iv; } - if (!v.freshsalt || !usedSalts[v.salt]) { p.salt = v.salt; } - ct = sjcl.encrypt(password || key, plaintext, p, rp).replace(/,/g,",\n"); - - v.iv = rp.iv; - usedIvs[rp.iv] = 1; - if (rp.salt) { - v.salt = rp.salt; - usedSalts[rp.salt] = 1; - } - v.key = rp.key; - - if (v.json) { - v.ciphertext = ct; - v.adata = ''; - } else { - v.ciphertext = ct.match(/"ct":"([^"]*)"/)[1]; //" - } - - v.plaintext = ''; - - form.set(v); - form.ciphertext.el.select(); -} - -/* Decrypt a message */ -function doDecrypt() { - var v = form.get(), iv = v.iv, key = v.key, adata = v.adata, aes, ciphertext=v.ciphertext, rp = {}; - - if (ciphertext.length === 0) { return; } - if (!v.password && !v.key.length) { - error("Can't decrypt: need a password or key!"); return; - } - - if (ciphertext.match("{")) { - /* it's jsonized */ - try { - v.plaintext = sjcl.decrypt(v.password || v.key, ciphertext, {}, rp); - } catch(e) { - error("Can't decrypt: "+e); - return; - } - v.mode = rp.mode; - v.iv = rp.iv; - v.adata = sjcl.codec.utf8String.fromBits(rp.adata); - if (v.password) { - v.salt = rp.salt; - v.iter = rp.iter; - v.keysize = rp.ks; - v.tag = rp.ts; - } - v.key = rp.key; - v.ciphertext = ""; - document.getElementById('plaintext').select(); - } else { - /* it's raw */ - ciphertext = sjcl.codec.base64.toBits(ciphertext); - if (iv.length === 0) { - error("Can't decrypt: need an IV!"); return; - } - if (key.length === 0) { - if (v.password.length) { - doPbkdf2(true); - key = v.key; - } - } - aes = new sjcl.cipher.aes(key); - - try { - v.plaintext = sjcl.codec.utf8String.fromBits(sjcl.mode[v.mode].decrypt(aes, ciphertext, iv, v.adata, v.tag)); - v.ciphertext = ""; - document.getElementById('plaintext').select(); - } catch (e) { - error("Can't decrypt: " + e); - } - } - form.set(v); -} - -function extendKey(size) { - form.key.set(form._extendedKey.slice(0,size)); -} - -function randomize(field, words, paranoia) { - form[field].set(sjcl.random.randomWords(words, paranoia)); - if (field == 'salt') { form.key.set([]); } -} diff --git a/sjcl/demo/form.js b/sjcl/demo/form.js deleted file mode 100644 index c949238c..00000000 --- a/sjcl/demo/form.js +++ /dev/null @@ -1,137 +0,0 @@ -/* Hackish form handling system. */ -function hasClass(e, cl) { - return (" "+e.className+" ").match(" "+cl+" "); -} - -function stopPropagation(e) { - e.preventDefault && e.preventDefault(); - e.cancelBubble = true; -} - -/* proxy for a form object, with appropriate encoder/decoder */ -function formElement(el) { - this.el = el; -} -formElement.prototype = { - get: function() { - var el = this.el; - if (el.type == "checkbox") { - return el.checked; - } else if (hasClass(el, "numeric")) { - return parseInt(el.value); - } else if (hasClass(el, "hex")) { - return sjcl.codec.hex.toBits(el.value); - } else if (hasClass(el, "base64")) { - return sjcl.codec.base64.toBits(el.value); - } else { - return el.value; - } - }, - - set: function(x) { - var el = this.el; - if (el.type == "checkbox") { - el.checked = x; return; - } else if (hasClass(el, "hex")) { - if (typeof x !== 'string') { - x = sjcl.codec.hex.fromBits(x); - } - x = x.toUpperCase().replace(/ /g,'').replace(/(.{8})/g, "$1 ").replace(/ $/, ''); - } else if (hasClass(el, "base64")) { - if (typeof x !== 'string') { - x = sjcl.codec.base64.fromBits(x); - } - x = x.replace(/\s/g,'').replace(/(.{32})/g, "$1\n").replace(/\n$/, ''); - } - el.value = x; - } -}; - -function radioGroup(name) { - this.name = name; -} -radioGroup.prototype = { - get: function() { - var els = document.getElementsByName(this.name), i; - for (i=0; i - - - - SJCL demo - - - - - - -

SJCL demo

- -
-

This page is a demo of the Stanford Javascript Crypto Library. To get started, just type in a password in the left pane and a secret message in the middle pane, then click "encrypt". Encryption takes place in your browser and we never see the plaintext.

- -

SJCL has lots of other options, many of which are shown in the grey boxes.

-
- -
-
- -
-

Password

-
- - -

- Choose a strong, random password. -

-
-
- -
-

Key Derivation

-
-
- - random -
- - - -

- Salt adds more variability to your key, and prevents attackers - from using rainbow tables to attack it. -

-
- -
- - -

- Strengthening makes it slower to compute the key corresponding to your - password. This makes it take much longer for an attacker to guess it. -

-
- -
- Key size: - - - - - - -

- 128 bits should be secure enough, but you can generate a longer - key if you wish. -

-
- - -
-
- - -
- -

- This key is computed from your password, salt and strengthening factor. It - will be used internally by the cipher. Instead of using a password, you can - enter a key here directly. If you do, it should be 32, 48 or 64 hexadecimal - digits (128, 192 or 256 bits). -

-
- -
-
- - -
-
-

Cipher Parameters

-

- SJCL encrypts your data with the AES block cipher. -

-
- Cipher mode: - - - - - - -

- The cipher mode is a standard for how to use AES and other - algorithms to encrypt and authenticate your message. - OCB2 mode (patented) and - GCM mode (unencumbered) - are slightly faster and have more features than - CCM mode. -

-
- -
-
- - random -
- - - -

- The IV needs to be different for every message you send. It adds - randomness to your message, so that the same message will look - different each time you send it. -

-

- Be careful: CCM mode and GCM mode don't use - the whole IV, so changing just part of it isn't enough. -

-
- -
- Authentication strength: - - - - - - -

- SJCL adds a an authentication tag to your message to make sure - nobody changes it. The longer the authentication tag, the harder it is - for somebody to change your encrypted message without you noticing. 64 - bits is probably enough. -

-
- -
- - -

- These parameters are required to decrypt your message later. If the - person you're sending the message to knows them, you don't need to send - them so your message will be shorter. -

-

- Default parameters won't be sent. Your password won't be sent, either. - The salt and iv will be encoded in base64 instead of hex, so they'll - look different from what's in the box. -

-
-
-
- -
-
-

Plaintext

-
- - -
- This message will be encrypted, so that nobody can read it or change it - without your password. -
-
- -
- - -
- This auxilliary message isn't secret, but its integrity will be checked - along with the integrity of the message. -
-
-
- - - -
-

Ciphertext

- - -
- Your message, encrypted and authenticated so that nobody can read it - or change it without your password. -
-
- - - diff --git a/sjcl/index.js b/sjcl/index.js deleted file mode 100644 index f170ea10..00000000 --- a/sjcl/index.js +++ /dev/null @@ -1,38 +0,0 @@ -var native = require('crypto') - -var checkParameters = require('./lib/precondition') -var defaultEncoding = require('./lib/default-encoding') -var toBuffer = require('./lib/to-buffer') - -function nativePBKDF2 (password, salt, iterations, keylen, digest, callback) { - checkParameters(iterations, keylen) - password = toBuffer(password, defaultEncoding, 'Password') - salt = toBuffer(salt, defaultEncoding, 'Salt') - - if (typeof digest === 'function') { - callback = digest - digest = 'sha1' - } - if (typeof callback !== 'function') throw new Error('No callback provided to pbkdf2') - - return native.pbkdf2(password, salt, iterations, keylen, digest, callback) -} - -function nativePBKDF2Sync (password, salt, iterations, keylen, digest) { - checkParameters(iterations, keylen) - password = toBuffer(password, defaultEncoding, 'Password') - salt = toBuffer(salt, defaultEncoding, 'Salt') - digest = digest || 'sha1' - return native.pbkdf2Sync(password, salt, iterations, keylen, digest) -} - -/* istanbul ignore next */ -if (!native.pbkdf2Sync || native.pbkdf2Sync.toString().indexOf('keylen, digest') === -1) { - exports.pbkdf2Sync = require('./lib/sync') - exports.pbkdf2 = require('./lib/async') - -// native -} else { - exports.pbkdf2Sync = nativePBKDF2Sync - exports.pbkdf2 = nativePBKDF2 -} diff --git a/sjcl/jsdoc.conf.json b/sjcl/jsdoc.conf.json deleted file mode 100644 index 85768428..00000000 --- a/sjcl/jsdoc.conf.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "templates": { - "default": { - "useLongnameInNav": true - } - } -} diff --git a/sjcl/lib/async.js b/sjcl/lib/async.js deleted file mode 100644 index 9ef67c3c..00000000 --- a/sjcl/lib/async.js +++ /dev/null @@ -1,102 +0,0 @@ -var Buffer = require('safe-buffer').Buffer - -var checkParameters = require('./precondition') -var defaultEncoding = require('./default-encoding') -var sync = require('./sync') -var toBuffer = require('./to-buffer') - -var ZERO_BUF -var subtle = global.crypto && global.crypto.subtle -var toBrowser = { - sha: 'SHA-1', - 'sha-1': 'SHA-1', - sha1: 'SHA-1', - sha256: 'SHA-256', - 'sha-256': 'SHA-256', - sha384: 'SHA-384', - 'sha-384': 'SHA-384', - 'sha-512': 'SHA-512', - sha512: 'SHA-512' -} -var checks = [] -function checkNative (algo) { - if (global.process && !global.process.browser) { - return Promise.resolve(false) - } - if (!subtle || !subtle.importKey || !subtle.deriveBits) { - return Promise.resolve(false) - } - if (checks[algo] !== undefined) { - return checks[algo] - } - ZERO_BUF = ZERO_BUF || Buffer.alloc(8) - var prom = browserPbkdf2(ZERO_BUF, ZERO_BUF, 10, 128, algo) - .then(function () { - return true - }).catch(function () { - return false - }) - checks[algo] = prom - return prom -} - -function browserPbkdf2 (password, salt, iterations, length, algo) { - return subtle.importKey( - 'raw', password, { name: 'PBKDF2' }, false, ['deriveBits'] - ).then(function (key) { - return subtle.deriveBits({ - name: 'PBKDF2', - salt: salt, - iterations: iterations, - hash: { - name: algo - } - }, key, length << 3) - }).then(function (res) { - return Buffer.from(res) - }) -} - -function resolvePromise (promise, callback) { - promise.then(function (out) { - process.nextTick(function () { - callback(null, out) - }) - }, function (e) { - process.nextTick(function () { - callback(e) - }) - }) -} -module.exports = function (password, salt, iterations, keylen, digest, callback) { - if (typeof digest === 'function') { - callback = digest - digest = undefined - } - - digest = digest || 'sha1' - var algo = toBrowser[digest.toLowerCase()] - - if (!algo || typeof global.Promise !== 'function') { - return process.nextTick(function () { - var out - try { - out = sync(password, salt, iterations, keylen, digest) - } catch (e) { - return callback(e) - } - callback(null, out) - }) - } - - checkParameters(iterations, keylen) - password = toBuffer(password, defaultEncoding, 'Password') - salt = toBuffer(salt, defaultEncoding, 'Salt') - if (typeof callback !== 'function') throw new Error('No callback provided to pbkdf2') - - resolvePromise(checkNative(algo).then(function (resp) { - if (resp) return browserPbkdf2(password, salt, iterations, keylen, algo) - - return sync(password, salt, iterations, keylen, digest) - }), callback) -} diff --git a/sjcl/lib/default-encoding.js b/sjcl/lib/default-encoding.js deleted file mode 100644 index 4404fd21..00000000 --- a/sjcl/lib/default-encoding.js +++ /dev/null @@ -1,12 +0,0 @@ -var defaultEncoding -/* istanbul ignore next */ -if (process.browser) { - defaultEncoding = 'utf-8' -} else if (process.version) { - var pVersionMajor = parseInt(process.version.split('.')[0].slice(1), 10) - - defaultEncoding = pVersionMajor >= 6 ? 'utf-8' : 'binary' -} else { - defaultEncoding = 'utf-8' -} -module.exports = defaultEncoding diff --git a/sjcl/lib/precondition.js b/sjcl/lib/precondition.js deleted file mode 100644 index 0cac5b35..00000000 --- a/sjcl/lib/precondition.js +++ /dev/null @@ -1,19 +0,0 @@ -var MAX_ALLOC = Math.pow(2, 30) - 1 // default in iojs - -module.exports = function (iterations, keylen) { - if (typeof iterations !== 'number') { - throw new TypeError('Iterations not a number') - } - - if (iterations < 0) { - throw new TypeError('Bad iterations') - } - - if (typeof keylen !== 'number') { - throw new TypeError('Key length not a number') - } - - if (keylen < 0 || keylen > MAX_ALLOC || keylen !== keylen) { /* eslint no-self-compare: 0 */ - throw new TypeError('Bad key length') - } -} diff --git a/sjcl/lib/sync-browser.js b/sjcl/lib/sync-browser.js deleted file mode 100644 index 20a64b45..00000000 --- a/sjcl/lib/sync-browser.js +++ /dev/null @@ -1,105 +0,0 @@ -var md5 = require('create-hash/md5') -var RIPEMD160 = require('ripemd160') -var sha = require('sha.js') -var Buffer = require('safe-buffer').Buffer - -var checkParameters = require('./precondition') -var defaultEncoding = require('./default-encoding') -var toBuffer = require('./to-buffer') - -var ZEROS = Buffer.alloc(128) -var sizes = { - md5: 16, - sha1: 20, - sha224: 28, - sha256: 32, - sha384: 48, - sha512: 64, - rmd160: 20, - ripemd160: 20 -} - -function Hmac (alg, key, saltLen) { - var hash = getDigest(alg) - var blocksize = (alg === 'sha512' || alg === 'sha384') ? 128 : 64 - - if (key.length > blocksize) { - key = hash(key) - } else if (key.length < blocksize) { - key = Buffer.concat([key, ZEROS], blocksize) - } - - var ipad = Buffer.allocUnsafe(blocksize + sizes[alg]) - var opad = Buffer.allocUnsafe(blocksize + sizes[alg]) - for (var i = 0; i < blocksize; i++) { - ipad[i] = key[i] ^ 0x36 - opad[i] = key[i] ^ 0x5C - } - - var ipad1 = Buffer.allocUnsafe(blocksize + saltLen + 4) - ipad.copy(ipad1, 0, 0, blocksize) - this.ipad1 = ipad1 - this.ipad2 = ipad - this.opad = opad - this.alg = alg - this.blocksize = blocksize - this.hash = hash - this.size = sizes[alg] -} - -Hmac.prototype.run = function (data, ipad) { - data.copy(ipad, this.blocksize) - var h = this.hash(ipad) - h.copy(this.opad, this.blocksize) - return this.hash(this.opad) -} - -function getDigest (alg) { - function shaFunc (data) { - return sha(alg).update(data).digest() - } - function rmd160Func (data) { - return new RIPEMD160().update(data).digest() - } - - if (alg === 'rmd160' || alg === 'ripemd160') return rmd160Func - if (alg === 'md5') return md5 - return shaFunc -} - -function pbkdf2 (password, salt, iterations, keylen, digest) { - checkParameters(iterations, keylen) - password = toBuffer(password, defaultEncoding, 'Password') - salt = toBuffer(salt, defaultEncoding, 'Salt') - - digest = digest || 'sha1' - - var hmac = new Hmac(digest, password, salt.length) - - var DK = Buffer.allocUnsafe(keylen) - var block1 = Buffer.allocUnsafe(salt.length + 4) - salt.copy(block1, 0, 0, salt.length) - - var destPos = 0 - var hLen = sizes[digest] - var l = Math.ceil(keylen / hLen) - - for (var i = 1; i <= l; i++) { - block1.writeUInt32BE(i, salt.length) - - var T = hmac.run(block1, hmac.ipad1) - var U = T - - for (var j = 1; j < iterations; j++) { - U = hmac.run(U, hmac.ipad2) - for (var k = 0; k < hLen; k++) T[k] ^= U[k] - } - - T.copy(DK, destPos) - destPos += hLen - } - - return DK -} - -module.exports = pbkdf2 diff --git a/sjcl/lib/sync.js b/sjcl/lib/sync.js deleted file mode 100644 index 9eeca481..00000000 --- a/sjcl/lib/sync.js +++ /dev/null @@ -1,52 +0,0 @@ -var sizes = { - md5: 16, - sha1: 20, - sha224: 28, - sha256: 32, - sha384: 48, - sha512: 64, - rmd160: 20, - ripemd160: 20 -} - -var createHmac = require('create-hmac') -var Buffer = require('safe-buffer').Buffer - -var checkParameters = require('./precondition') -var defaultEncoding = require('./default-encoding') -var toBuffer = require('./to-buffer') - -function pbkdf2 (password, salt, iterations, keylen, digest) { - checkParameters(iterations, keylen) - password = toBuffer(password, defaultEncoding, 'Password') - salt = toBuffer(salt, defaultEncoding, 'Salt') - - digest = digest || 'sha1' - - var DK = Buffer.allocUnsafe(keylen) - var block1 = Buffer.allocUnsafe(salt.length + 4) - salt.copy(block1, 0, 0, salt.length) - - var destPos = 0 - var hLen = sizes[digest] - var l = Math.ceil(keylen / hLen) - - for (var i = 1; i <= l; i++) { - block1.writeUInt32BE(i, salt.length) - - var T = createHmac(digest, password).update(block1).digest() - var U = T - - for (var j = 1; j < iterations; j++) { - U = createHmac(digest, password).update(U).digest() - for (var k = 0; k < hLen; k++) T[k] ^= U[k] - } - - T.copy(DK, destPos) - destPos += hLen - } - - return DK -} - -module.exports = pbkdf2 diff --git a/sjcl/lib/to-buffer.js b/sjcl/lib/to-buffer.js deleted file mode 100644 index ef0d4d4a..00000000 --- a/sjcl/lib/to-buffer.js +++ /dev/null @@ -1,13 +0,0 @@ -var Buffer = require('safe-buffer').Buffer - -module.exports = function (thing, encoding, name) { - if (Buffer.isBuffer(thing)) { - return thing - } else if (typeof thing === 'string') { - return Buffer.from(thing, encoding) - } else if (ArrayBuffer.isView(thing)) { - return Buffer.from(thing.buffer) - } else { - throw new TypeError(name + ' must be a string, a Buffer, a typed array or a DataView') - } -} diff --git a/sjcl/package.json b/sjcl/package.json deleted file mode 100644 index 5026f8bd..00000000 --- a/sjcl/package.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "name": "sjcl", - "version": "1.0.8", - "description": "Stanford Javascript Crypto Library", - "main": "sjcl.js", - "author": "bitwiseshiftleft", - "license": "(BSD-2-Clause OR GPL-2.0-only)", - "homepage": "https://github.com/bitwiseshiftleft/sjcl", - "keywords": [ - "encryption", - "high-level", - "crypto" - ], - "repository": { - "type": "git", - "url": "https://github.com/bitwiseshiftleft/sjcl.git" - }, - "scripts": { - "test": "make test", - "jsdoc": "jsdoc -c jsdoc.conf.json", - "lint": "eslint . || true" - }, - "browser": { - "crypto": false - }, - "engines": { - "node": "*" - }, - "devDependencies": { - "eslint": "^2.11.1", - "jsdoc": "3.4.0" - } -} diff --git a/sjcl/sjcl.js b/sjcl/sjcl.js deleted file mode 100644 index c3c3ea97..00000000 --- a/sjcl/sjcl.js +++ /dev/null @@ -1,60 +0,0 @@ -"use strict";var sjcl={cipher:{},hash:{},keyexchange:{},mode:{},misc:{},codec:{},exception:{corrupt:function(a){this.toString=function(){return"CORRUPT: "+this.message};this.message=a},invalid:function(a){this.toString=function(){return"INVALID: "+this.message};this.message=a},bug:function(a){this.toString=function(){return"BUG: "+this.message};this.message=a},notReady:function(a){this.toString=function(){return"NOT READY: "+this.message};this.message=a}}}; -sjcl.cipher.aes=function(a){this.s[0][0][0]||this.O();var b,c,d,e,f=this.s[0][4],g=this.s[1];b=a.length;var h=1;if(4!==b&&6!==b&&8!==b)throw new sjcl.exception.invalid("invalid aes key size");this.b=[d=a.slice(0),e=[]];for(a=b;a<4*b+28;a++){c=d[a-1];if(0===a%b||8===b&&4===a%b)c=f[c>>>24]<<24^f[c>>16&255]<<16^f[c>>8&255]<<8^f[c&255],0===a%b&&(c=c<<8^c>>>24^h<<24,h=h<<1^283*(h>>7));d[a]=d[a-b]^c}for(b=0;a;b++,a--)c=d[b&3?a:a-4],e[b]=4>=a||4>b?c:g[0][f[c>>>24]]^g[1][f[c>>16&255]]^g[2][f[c>>8&255]]^g[3][f[c& -255]]}; -sjcl.cipher.aes.prototype={encrypt:function(a){return t(this,a,0)},decrypt:function(a){return t(this,a,1)},s:[[[],[],[],[],[]],[[],[],[],[],[]]],O:function(){var a=this.s[0],b=this.s[1],c=a[4],d=b[4],e,f,g,h=[],k=[],l,n,m,p;for(e=0;0x100>e;e++)k[(h[e]=e<<1^283*(e>>7))^e]=e;for(f=g=0;!c[f];f^=l||1,g=k[g]||1)for(m=g^g<<1^g<<2^g<<3^g<<4,m=m>>8^m&255^99,c[f]=m,d[m]=f,n=h[e=h[l=h[f]]],p=0x1010101*n^0x10001*e^0x101*l^0x1010100*f,n=0x101*h[m]^0x1010100*m,e=0;4>e;e++)a[e][f]=n=n<<24^n>>>8,b[e][m]=p=p<<24^p>>>8;for(e= -0;5>e;e++)a[e]=a[e].slice(0),b[e]=b[e].slice(0)}}; -function t(a,b,c){if(4!==b.length)throw new sjcl.exception.invalid("invalid aes block size");var d=a.b[c],e=b[0]^d[0],f=b[c?3:1]^d[1],g=b[2]^d[2];b=b[c?1:3]^d[3];var h,k,l,n=d.length/4-2,m,p=4,r=[0,0,0,0];h=a.s[c];a=h[0];var q=h[1],v=h[2],w=h[3],x=h[4];for(m=0;m>>24]^q[f>>16&255]^v[g>>8&255]^w[b&255]^d[p],k=a[f>>>24]^q[g>>16&255]^v[b>>8&255]^w[e&255]^d[p+1],l=a[g>>>24]^q[b>>16&255]^v[e>>8&255]^w[f&255]^d[p+2],b=a[b>>>24]^q[e>>16&255]^v[f>>8&255]^w[g&255]^d[p+3],p+=4,e=h,f=k,g=l;for(m= -0;4>m;m++)r[c?3&-m:m]=x[e>>>24]<<24^x[f>>16&255]<<16^x[g>>8&255]<<8^x[b&255]^d[p++],h=e,e=f,f=g,g=b,b=h;return r} -sjcl.bitArray={bitSlice:function(a,b,c){a=sjcl.bitArray.$(a.slice(b/32),32-(b&31)).slice(1);return void 0===c?a:sjcl.bitArray.clamp(a,c-b)},extract:function(a,b,c){var d=Math.floor(-b-c&31);return((b+c-1^b)&-32?a[b/32|0]<<32-d^a[b/32+1|0]>>>d:a[b/32|0]>>>d)&(1<>b-1,1));return a},partial:function(a,b,c){return 32===a?b:(c?b|0:b<<32-a)+0x10000000000*a},getPartial:function(a){return Math.round(a/0x10000000000)||32},equal:function(a,b){if(sjcl.bitArray.bitLength(a)!==sjcl.bitArray.bitLength(b))return!1;var c=0,d;for(d=0;d>>b),c=a[e]<<32-b;e=a.length?a[a.length-1]:0;a=sjcl.bitArray.getPartial(e);d.push(sjcl.bitArray.partial(b+a&31,32>>24|c>>>8&0xff00|(c&0xff00)<<8|c<<24;return a}}; -sjcl.codec.utf8String={fromBits:function(a){var b="",c=sjcl.bitArray.bitLength(a),d,e;for(d=0;d>>8>>>8>>>8),e<<=8;return decodeURIComponent(escape(b))},toBits:function(a){a=unescape(encodeURIComponent(a));var b=[],c,d=0;for(c=0;c>>g)>>>e),gn){if(!b)try{return sjcl.codec.base32hex.toBits(a)}catch(p){}throw new sjcl.exception.invalid("this isn't "+m+"!");}h>e?(h-=e,f.push(l^n>>>h),l=n<>>e)>>>26),6>e?(g=a[c]<<6-e,e+=26,c++):(g<<=6,e-=6);for(;d.length&3&&!b;)d+="=";return d},toBits:function(a,b){a=a.replace(/\s|=/g,"");var c=[],d,e=0,f=sjcl.codec.base64.B,g=0,h;b&&(f=f.substr(0,62)+"-_");for(d=0;dh)throw new sjcl.exception.invalid("this isn't base64!");26>>e),g=h<<32-e):(e+=6,g^=h<<32-e)}e&56&&c.push(sjcl.bitArray.partial(e&56,g,1));return c}};sjcl.codec.base64url={fromBits:function(a){return sjcl.codec.base64.fromBits(a,1,1)},toBits:function(a){return sjcl.codec.base64.toBits(a,1)}};sjcl.hash.sha256=function(a){this.b[0]||this.O();a?(this.F=a.F.slice(0),this.A=a.A.slice(0),this.l=a.l):this.reset()};sjcl.hash.sha256.hash=function(a){return(new sjcl.hash.sha256).update(a).finalize()}; -sjcl.hash.sha256.prototype={blockSize:512,reset:function(){this.F=this.Y.slice(0);this.A=[];this.l=0;return this},update:function(a){"string"===typeof a&&(a=sjcl.codec.utf8String.toBits(a));var b,c=this.A=sjcl.bitArray.concat(this.A,a);b=this.l;a=this.l=b+sjcl.bitArray.bitLength(a);if(0x1fffffffffffffb;c++){e=!0;for(d=2;d*d<=c;d++)if(0===c%d){e= -!1;break}e&&(8>b&&(this.Y[b]=a(Math.pow(c,.5))),this.b[b]=a(Math.pow(c,1/3)),b++)}}}; -function u(a,b){var c,d,e,f=a.F,g=a.b,h=f[0],k=f[1],l=f[2],n=f[3],m=f[4],p=f[5],r=f[6],q=f[7];for(c=0;64>c;c++)16>c?d=b[c]:(d=b[c+1&15],e=b[c+14&15],d=b[c&15]=(d>>>7^d>>>18^d>>>3^d<<25^d<<14)+(e>>>17^e>>>19^e>>>10^e<<15^e<<13)+b[c&15]+b[c+9&15]|0),d=d+q+(m>>>6^m>>>11^m>>>25^m<<26^m<<21^m<<7)+(r^m&(p^r))+g[c],q=r,r=p,p=m,m=n+d|0,n=l,l=k,k=h,h=d+(k&l^n&(k^l))+(k>>>2^k>>>13^k>>>22^k<<30^k<<19^k<<10)|0;f[0]=f[0]+h|0;f[1]=f[1]+k|0;f[2]=f[2]+l|0;f[3]=f[3]+n|0;f[4]=f[4]+m|0;f[5]=f[5]+p|0;f[6]=f[6]+r|0;f[7]= -f[7]+q|0} -sjcl.mode.ccm={name:"ccm",G:[],listenProgress:function(a){sjcl.mode.ccm.G.push(a)},unListenProgress:function(a){a=sjcl.mode.ccm.G.indexOf(a);-1k)throw new sjcl.exception.invalid("ccm: iv must be at least 7 bytes");for(f=2;4>f&&l>>>8*f;f++);f<15-k&&(f=15-k);c=h.clamp(c, -8*(15-f));b=sjcl.mode.ccm.V(a,b,c,d,e,f);g=sjcl.mode.ccm.C(a,g,c,b,e,f);return h.concat(g.data,g.tag)},decrypt:function(a,b,c,d,e){e=e||64;d=d||[];var f=sjcl.bitArray,g=f.bitLength(c)/8,h=f.bitLength(b),k=f.clamp(b,h-e),l=f.bitSlice(b,h-e),h=(h-e)/8;if(7>g)throw new sjcl.exception.invalid("ccm: iv must be at least 7 bytes");for(b=2;4>b&&h>>>8*b;b++);b<15-g&&(b=15-g);c=f.clamp(c,8*(15-b));k=sjcl.mode.ccm.C(a,k,c,l,e,b);a=sjcl.mode.ccm.V(a,k.data,c,d,e,b);if(!f.equal(k.tag,a))throw new sjcl.exception.corrupt("ccm: tag doesn't match"); -return k.data},na:function(a,b,c,d,e,f){var g=[],h=sjcl.bitArray,k=h.i;d=[h.partial(8,(b.length?64:0)|d-2<<2|f-1)];d=h.concat(d,c);d[3]|=e;d=a.encrypt(d);if(b.length)for(c=h.bitLength(b)/8,65279>=c?g=[h.partial(16,c)]:0xffffffff>=c&&(g=h.concat([h.partial(16,65534)],[c])),g=h.concat(g,b),b=0;be||16n&&(sjcl.mode.ccm.fa(g/ -k),n+=m),c[3]++,e=a.encrypt(c),b[g]^=e[0],b[g+1]^=e[1],b[g+2]^=e[2],b[g+3]^=e[3];return{tag:d,data:h.clamp(b,l)}}}; -sjcl.mode.ocb2={name:"ocb2",encrypt:function(a,b,c,d,e,f){if(128!==sjcl.bitArray.bitLength(c))throw new sjcl.exception.invalid("ocb iv must be 128 bits");var g,h=sjcl.mode.ocb2.S,k=sjcl.bitArray,l=k.i,n=[0,0,0,0];c=h(a.encrypt(c));var m,p=[];d=d||[];e=e||64;for(g=0;g+4e.bitLength(c)&&(h=f(h,d(h)),c=e.concat(c,[-2147483648,0,0,0]));g=f(g,c); -return a.encrypt(f(d(f(h,d(h))),g))},S:function(a){return[a[0]<<1^a[1]>>>31,a[1]<<1^a[2]>>>31,a[2]<<1^a[3]>>>31,a[3]<<1^135*(a[0]>>>31)]}}; -sjcl.mode.gcm={name:"gcm",encrypt:function(a,b,c,d,e){var f=b.slice(0);b=sjcl.bitArray;d=d||[];a=sjcl.mode.gcm.C(!0,a,f,d,c,e||128);return b.concat(a.data,a.tag)},decrypt:function(a,b,c,d,e){var f=b.slice(0),g=sjcl.bitArray,h=g.bitLength(f);e=e||128;d=d||[];e<=h?(b=g.bitSlice(f,h-e),f=g.bitSlice(f,0,h-e)):(b=f,f=[]);a=sjcl.mode.gcm.C(!1,a,f,d,c,e);if(!g.equal(a.tag,b))throw new sjcl.exception.corrupt("gcm: tag doesn't match");return a.data},ka:function(a,b){var c,d,e,f,g,h=sjcl.bitArray.i;e=[0,0, -0,0];f=b.slice(0);for(c=0;128>c;c++){(d=0!==(a[Math.floor(c/32)]&1<<31-c%32))&&(e=h(e,f));g=0!==(f[3]&1);for(d=3;0>>1|(f[d-1]&1)<<31;f[0]>>>=1;g&&(f[0]^=-0x1f000000)}return e},j:function(a,b,c){var d,e=c.length;b=b.slice(0);for(d=0;de&&(a=b.hash(a));for(d=0;dd||0>c)throw new sjcl.exception.invalid("invalid params to pbkdf2");"string"===typeof a&&(a=sjcl.codec.utf8String.toBits(a));"string"===typeof b&&(b=sjcl.codec.utf8String.toBits(b));e=e||sjcl.misc.hmac;a=new e(a);var f,g,h,k,l=[],n=sjcl.bitArray;for(k=1;32*l.length<(d||1);k++){e=f=a.encrypt(n.concat(b,[k]));for(g=1;gg;g++)e.push(0x100000000*Math.random()|0);for(g=0;g=1<this.o&&(this.o= -f);this.P++;this.b=sjcl.hash.sha256.hash(this.b.concat(e));this.L=new sjcl.cipher.aes(this.b);for(d=0;4>d&&(this.h[d]=this.h[d]+1|0,!this.h[d]);d++);}for(d=0;d>>1;this.c[g].update([d,this.N++,2,b,f,a.length].concat(a))}break;case "string":void 0===b&&(b=a.length);this.c[g].update([d,this.N++,3,b,f,a.length]);this.c[g].update(a);break;default:k=1}if(k)throw new sjcl.exception.bug("random: addEntropy only supports number, array of numbers or string");this.m[g]+=b;this.f+=b;h===this.u&&(this.isReady()!==this.u&&A("seeded",Math.max(this.o,this.f)),A("progress",this.getProgress()))}, -isReady:function(a){a=this.T[void 0!==a?a:this.M];return this.o&&this.o>=a?this.m[0]>this.ba&&(new Date).valueOf()>this.Z?this.J|this.I:this.I:this.f>=a?this.J|this.u:this.u},getProgress:function(a){a=this.T[a?a:this.M];return this.o>=a?1:this.f>a?1:this.f/a},startCollectors:function(){if(!this.D){this.a={loadTimeCollector:B(this,this.ma),mouseCollector:B(this,this.oa),keyboardCollector:B(this,this.la),accelerometerCollector:B(this,this.ea),touchCollector:B(this,this.qa)};if(window.addEventListener)window.addEventListener("load", -this.a.loadTimeCollector,!1),window.addEventListener("mousemove",this.a.mouseCollector,!1),window.addEventListener("keypress",this.a.keyboardCollector,!1),window.addEventListener("devicemotion",this.a.accelerometerCollector,!1),window.addEventListener("touchmove",this.a.touchCollector,!1);else if(document.attachEvent)document.attachEvent("onload",this.a.loadTimeCollector),document.attachEvent("onmousemove",this.a.mouseCollector),document.attachEvent("keypress",this.a.keyboardCollector);else throw new sjcl.exception.bug("can't attach event"); -this.D=!0}},stopCollectors:function(){this.D&&(window.removeEventListener?(window.removeEventListener("load",this.a.loadTimeCollector,!1),window.removeEventListener("mousemove",this.a.mouseCollector,!1),window.removeEventListener("keypress",this.a.keyboardCollector,!1),window.removeEventListener("devicemotion",this.a.accelerometerCollector,!1),window.removeEventListener("touchmove",this.a.touchCollector,!1)):document.detachEvent&&(document.detachEvent("onload",this.a.loadTimeCollector),document.detachEvent("onmousemove", -this.a.mouseCollector),document.detachEvent("keypress",this.a.keyboardCollector)),this.D=!1)},addEventListener:function(a,b){this.K[a][this.ga++]=b},removeEventListener:function(a,b){var c,d,e=this.K[a],f=[];for(d in e)e.hasOwnProperty(d)&&e[d]===b&&f.push(d);for(c=0;cb&&(a.h[b]=a.h[b]+1|0,!a.h[b]);b++);return a.L.encrypt(a.h)} -function B(a,b){return function(){b.apply(a,arguments)}}sjcl.random=new sjcl.prng(6); -a:try{var D,E,F,G;if(G="undefined"!==typeof module&&module.exports){var H;try{H=require("crypto")}catch(a){H=null}G=E=H}if(G&&E.randomBytes)D=E.randomBytes(128),D=new Uint32Array((new Uint8Array(D)).buffer),sjcl.random.addEntropy(D,1024,"crypto['randomBytes']");else if("undefined"!==typeof window&&"undefined"!==typeof Uint32Array){F=new Uint32Array(32);if(window.crypto&&window.crypto.getRandomValues)window.crypto.getRandomValues(F);else if(window.msCrypto&&window.msCrypto.getRandomValues)window.msCrypto.getRandomValues(F); -else break a;sjcl.random.addEntropy(F,1024,"crypto['getRandomValues']")}}catch(a){"undefined"!==typeof window&&window.console&&(console.log("There was an error collecting entropy from the browser:"),console.log(a))} -sjcl.json={defaults:{v:1,iter:1E4,ks:128,ts:64,mode:"ccm",adata:"",cipher:"aes"},ja:function(a,b,c,d){c=c||{};d=d||{};var e=sjcl.json,f=e.g({iv:sjcl.random.randomWords(4,0)},e.defaults),g;e.g(f,c);c=f.adata;"string"===typeof f.salt&&(f.salt=sjcl.codec.base64.toBits(f.salt));"string"===typeof f.iv&&(f.iv=sjcl.codec.base64.toBits(f.iv));if(!sjcl.mode[f.mode]||!sjcl.cipher[f.cipher]||"string"===typeof a&&100>=f.iter||64!==f.ts&&96!==f.ts&&128!==f.ts||128!==f.ks&&192!==f.ks&&0x100!==f.ks||2>f.iv.length|| -4=b.iter||64!==b.ts&&96!==b.ts&&128!==b.ts||128!==b.ks&&192!==b.ks&&0x100!==b.ks||!b.iv||2>b.iv.length||4>> (32 - tv[0].length)); // unsigned shift, convert to signed word - this.require(b === (tv[1]|0), t + "array entry shifted is number: " + word2hex(b) + " == " + word2hex(tv[1])); - } - - cb && cb(); - }); - - - new sjcl.test.TestCase("bitArray concat, slicing, shifting and clamping", function (cb) { - if (!sjcl.bitArray) { - this.unimplemented(); - cb && cb(); - return; - } - - var i, j, kat = sjcl.test.vector.bitArray.slices, tv, a, a1, b, bitlen, t; - for (i=0; i}U?@Lns47E1%kR.o@n%FcmmsL/@{H8]yf7"], -["8e0bdd697628b91d8f245587ee95c5b04d48963f79259877b49cd9063aead3b7", - "JTKVSB%%)wK0E.X)V>+}o?pNmC{O&4W4b!Ni{Lh6"], -/** - * Thomas Hobbes' "Leviathan", Part I, Chapter VI: - * (The "classic" Base85 example, also the second Wikipedia logo): - * - * "Man is distinguished, not only by his reason, but by this singular passion from other animals, which is a lust of the mind, that by a perseverance of delight in the continued and indefatigable generation of knowledge, exceeds the short vehemence of any carnal pleasure" - * - * The period at the end of the sentence has been omitted, - * since keeping it requires padding the Hex string to align to 4-bytes. - */ - ["4d616e2069732064697374696e677569736865642c206e6f74206f6e6c792062792068697320726561736f6e2c2062757420627920746869732073696e67756c61722070617373696f6e2066726f6d206f7468657220616e696d616c732c2077686963682069732061206c757374206f6620746865206d696e642c20746861742062792061207065727365766572616e6365206f662064656c6967687420696e2074686520636f6e74696e75656420616e6420696e6465666174696761626c652067656e65726174696f6e206f66206b6e6f776c656467652c2065786365656473207468652073686f727420766568656d656e6365206f6620616e79206361726e616c20706c656173757265", - "o<}]Zx(+zcx(!xgzFa9aB7/b}efF?GBrCHty