mirror of
https://github.com/zoogie/TADpole-Online.git
synced 2025-06-18 10:45:35 -04:00
initial commit
This commit is contained in:
commit
f15c86296e
437
LICENSE
Normal file
437
LICENSE
Normal file
@ -0,0 +1,437 @@
|
|||||||
|
Attribution-NonCommercial-ShareAlike 4.0 International
|
||||||
|
|
||||||
|
=======================================================================
|
||||||
|
|
||||||
|
Creative Commons Corporation ("Creative Commons") is not a law firm and
|
||||||
|
does not provide legal services or legal advice. Distribution of
|
||||||
|
Creative Commons public licenses does not create a lawyer-client or
|
||||||
|
other relationship. Creative Commons makes its licenses and related
|
||||||
|
information available on an "as-is" basis. Creative Commons gives no
|
||||||
|
warranties regarding its licenses, any material licensed under their
|
||||||
|
terms and conditions, or any related information. Creative Commons
|
||||||
|
disclaims all liability for damages resulting from their use to the
|
||||||
|
fullest extent possible.
|
||||||
|
|
||||||
|
Using Creative Commons Public Licenses
|
||||||
|
|
||||||
|
Creative Commons public licenses provide a standard set of terms and
|
||||||
|
conditions that creators and other rights holders may use to share
|
||||||
|
original works of authorship and other material subject to copyright
|
||||||
|
and certain other rights specified in the public license below. The
|
||||||
|
following considerations are for informational purposes only, are not
|
||||||
|
exhaustive, and do not form part of our licenses.
|
||||||
|
|
||||||
|
Considerations for licensors: Our public licenses are
|
||||||
|
intended for use by those authorized to give the public
|
||||||
|
permission to use material in ways otherwise restricted by
|
||||||
|
copyright and certain other rights. Our licenses are
|
||||||
|
irrevocable. Licensors should read and understand the terms
|
||||||
|
and conditions of the license they choose before applying it.
|
||||||
|
Licensors should also secure all rights necessary before
|
||||||
|
applying our licenses so that the public can reuse the
|
||||||
|
material as expected. Licensors should clearly mark any
|
||||||
|
material not subject to the license. This includes other CC-
|
||||||
|
licensed material, or material used under an exception or
|
||||||
|
limitation to copyright. More considerations for licensors:
|
||||||
|
wiki.creativecommons.org/Considerations_for_licensors
|
||||||
|
|
||||||
|
Considerations for the public: By using one of our public
|
||||||
|
licenses, a licensor grants the public permission to use the
|
||||||
|
licensed material under specified terms and conditions. If
|
||||||
|
the licensor's permission is not necessary for any reason--for
|
||||||
|
example, because of any applicable exception or limitation to
|
||||||
|
copyright--then that use is not regulated by the license. Our
|
||||||
|
licenses grant only permissions under copyright and certain
|
||||||
|
other rights that a licensor has authority to grant. Use of
|
||||||
|
the licensed material may still be restricted for other
|
||||||
|
reasons, including because others have copyright or other
|
||||||
|
rights in the material. A licensor may make special requests,
|
||||||
|
such as asking that all changes be marked or described.
|
||||||
|
Although not required by our licenses, you are encouraged to
|
||||||
|
respect those requests where reasonable. More considerations
|
||||||
|
for the public:
|
||||||
|
wiki.creativecommons.org/Considerations_for_licensees
|
||||||
|
|
||||||
|
=======================================================================
|
||||||
|
|
||||||
|
Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International
|
||||||
|
Public License
|
||||||
|
|
||||||
|
By exercising the Licensed Rights (defined below), You accept and agree
|
||||||
|
to be bound by the terms and conditions of this Creative Commons
|
||||||
|
Attribution-NonCommercial-ShareAlike 4.0 International Public License
|
||||||
|
("Public License"). To the extent this Public License may be
|
||||||
|
interpreted as a contract, You are granted the Licensed Rights in
|
||||||
|
consideration of Your acceptance of these terms and conditions, and the
|
||||||
|
Licensor grants You such rights in consideration of benefits the
|
||||||
|
Licensor receives from making the Licensed Material available under
|
||||||
|
these terms and conditions.
|
||||||
|
|
||||||
|
|
||||||
|
Section 1 -- Definitions.
|
||||||
|
|
||||||
|
a. Adapted Material means material subject to Copyright and Similar
|
||||||
|
Rights that is derived from or based upon the Licensed Material
|
||||||
|
and in which the Licensed Material is translated, altered,
|
||||||
|
arranged, transformed, or otherwise modified in a manner requiring
|
||||||
|
permission under the Copyright and Similar Rights held by the
|
||||||
|
Licensor. For purposes of this Public License, where the Licensed
|
||||||
|
Material is a musical work, performance, or sound recording,
|
||||||
|
Adapted Material is always produced where the Licensed Material is
|
||||||
|
synched in timed relation with a moving image.
|
||||||
|
|
||||||
|
b. Adapter's License means the license You apply to Your Copyright
|
||||||
|
and Similar Rights in Your contributions to Adapted Material in
|
||||||
|
accordance with the terms and conditions of this Public License.
|
||||||
|
|
||||||
|
c. BY-NC-SA Compatible License means a license listed at
|
||||||
|
creativecommons.org/compatiblelicenses, approved by Creative
|
||||||
|
Commons as essentially the equivalent of this Public License.
|
||||||
|
|
||||||
|
d. Copyright and Similar Rights means copyright and/or similar rights
|
||||||
|
closely related to copyright including, without limitation,
|
||||||
|
performance, broadcast, sound recording, and Sui Generis Database
|
||||||
|
Rights, without regard to how the rights are labeled or
|
||||||
|
categorized. For purposes of this Public License, the rights
|
||||||
|
specified in Section 2(b)(1)-(2) are not Copyright and Similar
|
||||||
|
Rights.
|
||||||
|
|
||||||
|
e. Effective Technological Measures means those measures that, in the
|
||||||
|
absence of proper authority, may not be circumvented under laws
|
||||||
|
fulfilling obligations under Article 11 of the WIPO Copyright
|
||||||
|
Treaty adopted on December 20, 1996, and/or similar international
|
||||||
|
agreements.
|
||||||
|
|
||||||
|
f. Exceptions and Limitations means fair use, fair dealing, and/or
|
||||||
|
any other exception or limitation to Copyright and Similar Rights
|
||||||
|
that applies to Your use of the Licensed Material.
|
||||||
|
|
||||||
|
g. License Elements means the license attributes listed in the name
|
||||||
|
of a Creative Commons Public License. The License Elements of this
|
||||||
|
Public License are Attribution, NonCommercial, and ShareAlike.
|
||||||
|
|
||||||
|
h. Licensed Material means the artistic or literary work, database,
|
||||||
|
or other material to which the Licensor applied this Public
|
||||||
|
License.
|
||||||
|
|
||||||
|
i. Licensed Rights means the rights granted to You subject to the
|
||||||
|
terms and conditions of this Public License, which are limited to
|
||||||
|
all Copyright and Similar Rights that apply to Your use of the
|
||||||
|
Licensed Material and that the Licensor has authority to license.
|
||||||
|
|
||||||
|
j. Licensor means the individual(s) or entity(ies) granting rights
|
||||||
|
under this Public License.
|
||||||
|
|
||||||
|
k. NonCommercial means not primarily intended for or directed towards
|
||||||
|
commercial advantage or monetary compensation. For purposes of
|
||||||
|
this Public License, the exchange of the Licensed Material for
|
||||||
|
other material subject to Copyright and Similar Rights by digital
|
||||||
|
file-sharing or similar means is NonCommercial provided there is
|
||||||
|
no payment of monetary compensation in connection with the
|
||||||
|
exchange.
|
||||||
|
|
||||||
|
l. Share means to provide material to the public by any means or
|
||||||
|
process that requires permission under the Licensed Rights, such
|
||||||
|
as reproduction, public display, public performance, distribution,
|
||||||
|
dissemination, communication, or importation, and to make material
|
||||||
|
available to the public including in ways that members of the
|
||||||
|
public may access the material from a place and at a time
|
||||||
|
individually chosen by them.
|
||||||
|
|
||||||
|
m. Sui Generis Database Rights means rights other than copyright
|
||||||
|
resulting from Directive 96/9/EC of the European Parliament and of
|
||||||
|
the Council of 11 March 1996 on the legal protection of databases,
|
||||||
|
as amended and/or succeeded, as well as other essentially
|
||||||
|
equivalent rights anywhere in the world.
|
||||||
|
|
||||||
|
n. You means the individual or entity exercising the Licensed Rights
|
||||||
|
under this Public License. Your has a corresponding meaning.
|
||||||
|
|
||||||
|
|
||||||
|
Section 2 -- Scope.
|
||||||
|
|
||||||
|
a. License grant.
|
||||||
|
|
||||||
|
1. Subject to the terms and conditions of this Public License,
|
||||||
|
the Licensor hereby grants You a worldwide, royalty-free,
|
||||||
|
non-sublicensable, non-exclusive, irrevocable license to
|
||||||
|
exercise the Licensed Rights in the Licensed Material to:
|
||||||
|
|
||||||
|
a. reproduce and Share the Licensed Material, in whole or
|
||||||
|
in part, for NonCommercial purposes only; and
|
||||||
|
|
||||||
|
b. produce, reproduce, and Share Adapted Material for
|
||||||
|
NonCommercial purposes only.
|
||||||
|
|
||||||
|
2. Exceptions and Limitations. For the avoidance of doubt, where
|
||||||
|
Exceptions and Limitations apply to Your use, this Public
|
||||||
|
License does not apply, and You do not need to comply with
|
||||||
|
its terms and conditions.
|
||||||
|
|
||||||
|
3. Term. The term of this Public License is specified in Section
|
||||||
|
6(a).
|
||||||
|
|
||||||
|
4. Media and formats; technical modifications allowed. The
|
||||||
|
Licensor authorizes You to exercise the Licensed Rights in
|
||||||
|
all media and formats whether now known or hereafter created,
|
||||||
|
and to make technical modifications necessary to do so. The
|
||||||
|
Licensor waives and/or agrees not to assert any right or
|
||||||
|
authority to forbid You from making technical modifications
|
||||||
|
necessary to exercise the Licensed Rights, including
|
||||||
|
technical modifications necessary to circumvent Effective
|
||||||
|
Technological Measures. For purposes of this Public License,
|
||||||
|
simply making modifications authorized by this Section 2(a)
|
||||||
|
(4) never produces Adapted Material.
|
||||||
|
|
||||||
|
5. Downstream recipients.
|
||||||
|
|
||||||
|
a. Offer from the Licensor -- Licensed Material. Every
|
||||||
|
recipient of the Licensed Material automatically
|
||||||
|
receives an offer from the Licensor to exercise the
|
||||||
|
Licensed Rights under the terms and conditions of this
|
||||||
|
Public License.
|
||||||
|
|
||||||
|
b. Additional offer from the Licensor -- Adapted Material.
|
||||||
|
Every recipient of Adapted Material from You
|
||||||
|
automatically receives an offer from the Licensor to
|
||||||
|
exercise the Licensed Rights in the Adapted Material
|
||||||
|
under the conditions of the Adapter's License You apply.
|
||||||
|
|
||||||
|
c. No downstream restrictions. You may not offer or impose
|
||||||
|
any additional or different terms or conditions on, or
|
||||||
|
apply any Effective Technological Measures to, the
|
||||||
|
Licensed Material if doing so restricts exercise of the
|
||||||
|
Licensed Rights by any recipient of the Licensed
|
||||||
|
Material.
|
||||||
|
|
||||||
|
6. No endorsement. Nothing in this Public License constitutes or
|
||||||
|
may be construed as permission to assert or imply that You
|
||||||
|
are, or that Your use of the Licensed Material is, connected
|
||||||
|
with, or sponsored, endorsed, or granted official status by,
|
||||||
|
the Licensor or others designated to receive attribution as
|
||||||
|
provided in Section 3(a)(1)(A)(i).
|
||||||
|
|
||||||
|
b. Other rights.
|
||||||
|
|
||||||
|
1. Moral rights, such as the right of integrity, are not
|
||||||
|
licensed under this Public License, nor are publicity,
|
||||||
|
privacy, and/or other similar personality rights; however, to
|
||||||
|
the extent possible, the Licensor waives and/or agrees not to
|
||||||
|
assert any such rights held by the Licensor to the limited
|
||||||
|
extent necessary to allow You to exercise the Licensed
|
||||||
|
Rights, but not otherwise.
|
||||||
|
|
||||||
|
2. Patent and trademark rights are not licensed under this
|
||||||
|
Public License.
|
||||||
|
|
||||||
|
3. To the extent possible, the Licensor waives any right to
|
||||||
|
collect royalties from You for the exercise of the Licensed
|
||||||
|
Rights, whether directly or through a collecting society
|
||||||
|
under any voluntary or waivable statutory or compulsory
|
||||||
|
licensing scheme. In all other cases the Licensor expressly
|
||||||
|
reserves any right to collect such royalties, including when
|
||||||
|
the Licensed Material is used other than for NonCommercial
|
||||||
|
purposes.
|
||||||
|
|
||||||
|
|
||||||
|
Section 3 -- License Conditions.
|
||||||
|
|
||||||
|
Your exercise of the Licensed Rights is expressly made subject to the
|
||||||
|
following conditions.
|
||||||
|
|
||||||
|
a. Attribution.
|
||||||
|
|
||||||
|
1. If You Share the Licensed Material (including in modified
|
||||||
|
form), You must:
|
||||||
|
|
||||||
|
a. retain the following if it is supplied by the Licensor
|
||||||
|
with the Licensed Material:
|
||||||
|
|
||||||
|
i. identification of the creator(s) of the Licensed
|
||||||
|
Material and any others designated to receive
|
||||||
|
attribution, in any reasonable manner requested by
|
||||||
|
the Licensor (including by pseudonym if
|
||||||
|
designated);
|
||||||
|
|
||||||
|
ii. a copyright notice;
|
||||||
|
|
||||||
|
iii. a notice that refers to this Public License;
|
||||||
|
|
||||||
|
iv. a notice that refers to the disclaimer of
|
||||||
|
warranties;
|
||||||
|
|
||||||
|
v. a URI or hyperlink to the Licensed Material to the
|
||||||
|
extent reasonably practicable;
|
||||||
|
|
||||||
|
b. indicate if You modified the Licensed Material and
|
||||||
|
retain an indication of any previous modifications; and
|
||||||
|
|
||||||
|
c. indicate the Licensed Material is licensed under this
|
||||||
|
Public License, and include the text of, or the URI or
|
||||||
|
hyperlink to, this Public License.
|
||||||
|
|
||||||
|
2. You may satisfy the conditions in Section 3(a)(1) in any
|
||||||
|
reasonable manner based on the medium, means, and context in
|
||||||
|
which You Share the Licensed Material. For example, it may be
|
||||||
|
reasonable to satisfy the conditions by providing a URI or
|
||||||
|
hyperlink to a resource that includes the required
|
||||||
|
information.
|
||||||
|
3. If requested by the Licensor, You must remove any of the
|
||||||
|
information required by Section 3(a)(1)(A) to the extent
|
||||||
|
reasonably practicable.
|
||||||
|
|
||||||
|
b. ShareAlike.
|
||||||
|
|
||||||
|
In addition to the conditions in Section 3(a), if You Share
|
||||||
|
Adapted Material You produce, the following conditions also apply.
|
||||||
|
|
||||||
|
1. The Adapter's License You apply must be a Creative Commons
|
||||||
|
license with the same License Elements, this version or
|
||||||
|
later, or a BY-NC-SA Compatible License.
|
||||||
|
|
||||||
|
2. You must include the text of, or the URI or hyperlink to, the
|
||||||
|
Adapter's License You apply. You may satisfy this condition
|
||||||
|
in any reasonable manner based on the medium, means, and
|
||||||
|
context in which You Share Adapted Material.
|
||||||
|
|
||||||
|
3. You may not offer or impose any additional or different terms
|
||||||
|
or conditions on, or apply any Effective Technological
|
||||||
|
Measures to, Adapted Material that restrict exercise of the
|
||||||
|
rights granted under the Adapter's License You apply.
|
||||||
|
|
||||||
|
|
||||||
|
Section 4 -- Sui Generis Database Rights.
|
||||||
|
|
||||||
|
Where the Licensed Rights include Sui Generis Database Rights that
|
||||||
|
apply to Your use of the Licensed Material:
|
||||||
|
|
||||||
|
a. for the avoidance of doubt, Section 2(a)(1) grants You the right
|
||||||
|
to extract, reuse, reproduce, and Share all or a substantial
|
||||||
|
portion of the contents of the database for NonCommercial purposes
|
||||||
|
only;
|
||||||
|
|
||||||
|
b. if You include all or a substantial portion of the database
|
||||||
|
contents in a database in which You have Sui Generis Database
|
||||||
|
Rights, then the database in which You have Sui Generis Database
|
||||||
|
Rights (but not its individual contents) is Adapted Material,
|
||||||
|
including for purposes of Section 3(b); and
|
||||||
|
|
||||||
|
c. You must comply with the conditions in Section 3(a) if You Share
|
||||||
|
all or a substantial portion of the contents of the database.
|
||||||
|
|
||||||
|
For the avoidance of doubt, this Section 4 supplements and does not
|
||||||
|
replace Your obligations under this Public License where the Licensed
|
||||||
|
Rights include other Copyright and Similar Rights.
|
||||||
|
|
||||||
|
|
||||||
|
Section 5 -- Disclaimer of Warranties and Limitation of Liability.
|
||||||
|
|
||||||
|
a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE
|
||||||
|
EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS
|
||||||
|
AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF
|
||||||
|
ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS,
|
||||||
|
IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION,
|
||||||
|
WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR
|
||||||
|
PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS,
|
||||||
|
ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT
|
||||||
|
KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT
|
||||||
|
ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU.
|
||||||
|
|
||||||
|
b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE
|
||||||
|
TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION,
|
||||||
|
NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT,
|
||||||
|
INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES,
|
||||||
|
COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR
|
||||||
|
USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN
|
||||||
|
ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR
|
||||||
|
DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR
|
||||||
|
IN PART, THIS LIMITATION MAY NOT APPLY TO YOU.
|
||||||
|
|
||||||
|
c. The disclaimer of warranties and limitation of liability provided
|
||||||
|
above shall be interpreted in a manner that, to the extent
|
||||||
|
possible, most closely approximates an absolute disclaimer and
|
||||||
|
waiver of all liability.
|
||||||
|
|
||||||
|
|
||||||
|
Section 6 -- Term and Termination.
|
||||||
|
|
||||||
|
a. This Public License applies for the term of the Copyright and
|
||||||
|
Similar Rights licensed here. However, if You fail to comply with
|
||||||
|
this Public License, then Your rights under this Public License
|
||||||
|
terminate automatically.
|
||||||
|
|
||||||
|
b. Where Your right to use the Licensed Material has terminated under
|
||||||
|
Section 6(a), it reinstates:
|
||||||
|
|
||||||
|
1. automatically as of the date the violation is cured, provided
|
||||||
|
it is cured within 30 days of Your discovery of the
|
||||||
|
violation; or
|
||||||
|
|
||||||
|
2. upon express reinstatement by the Licensor.
|
||||||
|
|
||||||
|
For the avoidance of doubt, this Section 6(b) does not affect any
|
||||||
|
right the Licensor may have to seek remedies for Your violations
|
||||||
|
of this Public License.
|
||||||
|
|
||||||
|
c. For the avoidance of doubt, the Licensor may also offer the
|
||||||
|
Licensed Material under separate terms or conditions or stop
|
||||||
|
distributing the Licensed Material at any time; however, doing so
|
||||||
|
will not terminate this Public License.
|
||||||
|
|
||||||
|
d. Sections 1, 5, 6, 7, and 8 survive termination of this Public
|
||||||
|
License.
|
||||||
|
|
||||||
|
|
||||||
|
Section 7 -- Other Terms and Conditions.
|
||||||
|
|
||||||
|
a. The Licensor shall not be bound by any additional or different
|
||||||
|
terms or conditions communicated by You unless expressly agreed.
|
||||||
|
|
||||||
|
b. Any arrangements, understandings, or agreements regarding the
|
||||||
|
Licensed Material not stated herein are separate from and
|
||||||
|
independent of the terms and conditions of this Public License.
|
||||||
|
|
||||||
|
|
||||||
|
Section 8 -- Interpretation.
|
||||||
|
|
||||||
|
a. For the avoidance of doubt, this Public License does not, and
|
||||||
|
shall not be interpreted to, reduce, limit, restrict, or impose
|
||||||
|
conditions on any use of the Licensed Material that could lawfully
|
||||||
|
be made without permission under this Public License.
|
||||||
|
|
||||||
|
b. To the extent possible, if any provision of this Public License is
|
||||||
|
deemed unenforceable, it shall be automatically reformed to the
|
||||||
|
minimum extent necessary to make it enforceable. If the provision
|
||||||
|
cannot be reformed, it shall be severed from this Public License
|
||||||
|
without affecting the enforceability of the remaining terms and
|
||||||
|
conditions.
|
||||||
|
|
||||||
|
c. No term or condition of this Public License will be waived and no
|
||||||
|
failure to comply consented to unless expressly agreed to by the
|
||||||
|
Licensor.
|
||||||
|
|
||||||
|
d. Nothing in this Public License constitutes or may be interpreted
|
||||||
|
as a limitation upon, or waiver of, any privileges and immunities
|
||||||
|
that apply to the Licensor or You, including from the legal
|
||||||
|
processes of any jurisdiction or authority.
|
||||||
|
|
||||||
|
=======================================================================
|
||||||
|
|
||||||
|
Creative Commons is not a party to its public
|
||||||
|
licenses. Notwithstanding, Creative Commons may elect to apply one of
|
||||||
|
its public licenses to material it publishes and in those instances
|
||||||
|
will be considered the “Licensor.” The text of the Creative Commons
|
||||||
|
public licenses is dedicated to the public domain under the CC0 Public
|
||||||
|
Domain Dedication. Except for the limited purpose of indicating that
|
||||||
|
material is shared under a Creative Commons public license or as
|
||||||
|
otherwise permitted by the Creative Commons policies published at
|
||||||
|
creativecommons.org/policies, Creative Commons does not authorize the
|
||||||
|
use of the trademark "Creative Commons" or any other trademark or logo
|
||||||
|
of Creative Commons without its prior written consent including,
|
||||||
|
without limitation, in connection with any unauthorized modifications
|
||||||
|
to any of its public licenses or any other arrangements,
|
||||||
|
understandings, or agreements concerning use of licensed material. For
|
||||||
|
the avoidance of doubt, this paragraph does not form part of the
|
||||||
|
public licenses.
|
||||||
|
|
||||||
|
Creative Commons may be contacted at creativecommons.org.
|
12
README.md
Normal file
12
README.md
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
# TADpole Online
|
||||||
|
|
||||||
|
A (nearly) pure client-side javascript implementation of [TADpole](https://github.com/zoogie/TADpole). Only the signing step is done on a server. The only requirement is a somewhat recent browser (list on the [website](######################)).
|
||||||
|
|
||||||
|
# Credits
|
||||||
|
|
||||||
|
- [zoogie](https://github.com/zoogie) for creating the original TADpole
|
||||||
|
- [olliz0r](https://github.com/olliz0r) for helping with developing & debugging
|
||||||
|
|
||||||
|
# License
|
||||||
|
|
||||||
|
This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International license. For more information see the LICENSE text.
|
126
index.html
Normal file
126
index.html
Normal file
@ -0,0 +1,126 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
||||||
|
<title>TADpole Online</title>
|
||||||
|
<link rel="shortcut icon" href="https://i.imgur.com/CVSu1zc.png" type="image/x-icon" />
|
||||||
|
<link rel="icon" href="https://i.imgur.com/CVSu1zc.png" type="image/x-icon" />
|
||||||
|
|
||||||
|
<script src="public/js/libs/jquery.min.js"></script>
|
||||||
|
<script src="public/js/libs/bootstrap.bundle.min.js"></script>
|
||||||
|
<script src="public/js/libs/crc32.js"></script>
|
||||||
|
<script src="public/js/libs/biginteger.min.js"></script>
|
||||||
|
<script src="public/js/libs/aes.js"></script>
|
||||||
|
<script src="public/js/libs/sha256.js"></script>
|
||||||
|
<script src="public/js/libs/cryptojs-aes.min.js"></script>
|
||||||
|
<script src="public/js/libs/cmac.min.js"></script>
|
||||||
|
|
||||||
|
<script src="public/js/custom/main.js"></script>
|
||||||
|
<script src="public/js/custom/constants.js"></script>
|
||||||
|
<script src="public/js/custom/util.js"></script>
|
||||||
|
<script src="public/js/custom/fileAccess.js"></script>
|
||||||
|
<script src="public/js/custom/validation.js"></script>
|
||||||
|
<script src="public/js/custom/extraction.js"></script>
|
||||||
|
<script src="public/js/custom/injection.js"></script>
|
||||||
|
<script src="public/js/custom/building.js"></script>
|
||||||
|
<script src="public/js/custom/msed.js"></script>
|
||||||
|
|
||||||
|
<link href="public/stylesheets/bootstrap.min.css" rel="stylesheet" type="text/css">
|
||||||
|
<link href="public/stylesheets/style.css" rel="stylesheet" type="text/css">
|
||||||
|
|
||||||
|
<meta name="description" content="DSiWare Injector for Seedminer.">
|
||||||
|
<meta property="og:image" content="https://i.imgur.com/CVSu1zc.png">
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<div class="row text-center">
|
||||||
|
<div class="col-lg-12">
|
||||||
|
<h1>TADpole Online</h1>
|
||||||
|
<br/>
|
||||||
|
<br/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-lg-2"></div>
|
||||||
|
<div class="col-lg-4">
|
||||||
|
<h5>What you need:</h5>
|
||||||
|
<ul>
|
||||||
|
<li>A compatible dsiware game</li>
|
||||||
|
<li>Your movable.sed</li>
|
||||||
|
<li>The following files.
|
||||||
|
<strong>You will need a torrent client like deluge or qbittorent to download the files!</strong>
|
||||||
|
</li>
|
||||||
|
<ul>
|
||||||
|
<li>A ctcert.bin</li>
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<a href="magnet:?xt=urn:btih:24e6e304dde87e3b6381fe10e8b21ed326b3f445&dn=ctcert.bin">ctcert.bin</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
<li>The injection archive for your region
|
||||||
|
<strong>(extract after download!)</strong>
|
||||||
|
</li>
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<a href="magnet:?xt=urn:btih:3c5965b3d2e97ec10b0d9585e99380088043563d&dn=USA.zip">USA</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a href="magnet:?xt=urn:btih:e42bc14b44b8422e4c3c7ccd67ab58294cd38aff&dn=EUR.zip">Europe</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a href="magnet:?xt=urn:btih:819b73e27facb48dce3cbb35e1104f79ae550841&dn=JPN.zip">Japan</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</ul>
|
||||||
|
</ul>
|
||||||
|
<br/>
|
||||||
|
<h5>Compatible Browsers</h5>
|
||||||
|
<p>
|
||||||
|
<u>green:</u> recommended,
|
||||||
|
<u>orange:</u> probably works,
|
||||||
|
<u>red:</u> dont even try</p>
|
||||||
|
<ul>
|
||||||
|
<li class="li-browser-good">Chrome >= 60</li>
|
||||||
|
<li class="li-browser-good">Firefox >= 50</li>
|
||||||
|
<li class="li-browser-maybe">Opera >= 45</li>
|
||||||
|
<li class="li-browser-maybe">Edge >= 15</li>
|
||||||
|
<li class="li-browser-maybe">Safari >= 10</li>
|
||||||
|
<li class="li-browser-bad">Internet Explorer</li>
|
||||||
|
<li class="li-browser-bad">Any other browser not listed above</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="col-lg-5">
|
||||||
|
<h5>Files:</h5>
|
||||||
|
<form action="javascript:start();" id="uploadForm" ref="uploadForm" encType="multipart/form-data">
|
||||||
|
<div class="form-group">
|
||||||
|
<label>DSiWare.bin:</label>
|
||||||
|
<input class="form-control" id="dsiware" type="file" accept=".bin">
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label>movable.sed:</label>
|
||||||
|
<input class="form-control" id="movable" type="file" accept=".sed">
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label>ctcert.bin:</label>
|
||||||
|
<input class="form-control" id="ctcert" type="file" accept=".bin">
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label>game_XXX.app:</label>
|
||||||
|
<input class="form-control" id="game" type="file" accept=".app">
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label>public_XXX.sav:</label>
|
||||||
|
<input class="form-control" id="save" type="file" accept=".sav">
|
||||||
|
</div>
|
||||||
|
<button class="btn btn-primary btn-startInjection" type="submit">Start!</button>
|
||||||
|
<br/>
|
||||||
|
<p id="p-error"></p>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
<div class="col-lg-1"></div>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
37
public/js/custom/building.js
Normal file
37
public/js/custom/building.js
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
function buildDsiware(dsiwareData, len) {
|
||||||
|
let content = constants.dsiwareContent;
|
||||||
|
let data = [
|
||||||
|
dsiwareData.banner,
|
||||||
|
dsiwareData.header,
|
||||||
|
dsiwareData.footer,
|
||||||
|
];
|
||||||
|
content.forEach(c => {
|
||||||
|
if (dsiwareData.other.hasOwnProperty(c)) data.push(dsiwareData.other[c]);;
|
||||||
|
});
|
||||||
|
|
||||||
|
let offset = 0;
|
||||||
|
let dsiwareFinal = new Uint8Array(len);
|
||||||
|
for (let i = 0; i < data.length; i++) {
|
||||||
|
let d = data[i];
|
||||||
|
let metaData = metaGen(d, dsiwareData.keys.movableKeyY);
|
||||||
|
let iv = sliceArr(metaData, 0x10, 0x10);
|
||||||
|
let key = dsiwareData.keys.normalKey;
|
||||||
|
let encryptedData = new aesjs.ModeOfOperation.cbc(key, new Uint8Array(0x10)).encrypt(d);
|
||||||
|
dsiwareFinal.set(encryptedData, offset);
|
||||||
|
dsiwareFinal.set(metaData, offset + encryptedData.length);
|
||||||
|
offset += (encryptedData.length + metaData.length)
|
||||||
|
}
|
||||||
|
|
||||||
|
return dsiwareFinal;
|
||||||
|
}
|
||||||
|
|
||||||
|
function metaGen(data, movableKeyY) {
|
||||||
|
let dataHash = sha256.array(data);
|
||||||
|
let normalKeyCmac = extractNormalKey(movableKeyY, constants.keys.cmac);
|
||||||
|
let key = CryptoJS.enc.Hex.parse(byteArrToHexStr(normalKeyCmac));
|
||||||
|
let msg = CryptoJS.enc.Hex.parse(byteArrToHexStr(dataHash));
|
||||||
|
let enc = CryptoJS.CMAC(key, msg);
|
||||||
|
let metaData = new Uint8Array(0x20);
|
||||||
|
metaData.set(parseHexString(enc.toString()));
|
||||||
|
return metaData;
|
||||||
|
}
|
30
public/js/custom/constants.js
Normal file
30
public/js/custom/constants.js
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
var constants = {
|
||||||
|
hashes: {
|
||||||
|
all: ['7E5EA8C7', '378AAF3A', 'C42B9288', '3DA4FC37', '4899E282', '0CBC2C50'],
|
||||||
|
},
|
||||||
|
keys: {
|
||||||
|
keyX: '6FBB01F872CAF9C01834EEC04065EE53',
|
||||||
|
c: '1FF9E9AAC5FE0408024591DC5D52768A',
|
||||||
|
cmac: 'B529221CDDB5DB5A1BF26EFF2041E875',
|
||||||
|
},
|
||||||
|
dataLocations: {
|
||||||
|
ctcert: {
|
||||||
|
publicKeyR: { off: 0x108, len: 0x1E },
|
||||||
|
publicKeyS: { off: 0x126, len: 0x1E },
|
||||||
|
privateKey: { off: 0x180, len: 0x1E },
|
||||||
|
},
|
||||||
|
movable: {
|
||||||
|
keyY: { off: 0x110, len: 0x10 },
|
||||||
|
},
|
||||||
|
dsiware: {
|
||||||
|
banner: { off: 0x0, len: 0x4000 },
|
||||||
|
header: { off: 0x4020, len: 0xF0 },
|
||||||
|
footer: { off: 0x4130, len: 0x4E0 },
|
||||||
|
other: { off: 0x4630 },
|
||||||
|
},
|
||||||
|
},
|
||||||
|
dsiwareContent: [
|
||||||
|
'tmd', 'srl.nds', '2.bin', '3.bin', '4.bin', '5.bin',
|
||||||
|
'6.bin', '7.bin', '8.bin', 'public.sav', 'banner.sav',
|
||||||
|
],
|
||||||
|
};
|
53
public/js/custom/extraction.js
Normal file
53
public/js/custom/extraction.js
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
function extractNormalKey(movableKeyY, keyXHex) {
|
||||||
|
let keyX = bigInt(keyXHex, 0x10);
|
||||||
|
let c = bigInt(constants.keys.c, 0x10);
|
||||||
|
let f128 = bigInt('FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF', 0x10);
|
||||||
|
let keyY = bigInt(byteArrToHexStr(movableKeyY), 0x10);
|
||||||
|
let n = keyX.shiftLeft(2).or(keyX.shiftRight(128 - 2)).and(f128);
|
||||||
|
n = n.xor(keyY).add(c).and(f128);
|
||||||
|
n = n.shiftLeft(87).or(n.shiftRight(128 - 87)).and(f128);
|
||||||
|
let arr = n.toArray(256).value;
|
||||||
|
return (arr[0] === 0) ? arr.slice(1) : arr;
|
||||||
|
}
|
||||||
|
|
||||||
|
function extractDsiware(dsiware, normalKey) {
|
||||||
|
/* banner/header/footer extr & decrypt */
|
||||||
|
let locB = constants.dataLocations.dsiware.banner;
|
||||||
|
let locH = constants.dataLocations.dsiware.header;
|
||||||
|
let locF = constants.dataLocations.dsiware.footer;
|
||||||
|
let banner = dump(dsiware, normalKey, locB.off, locB.len);
|
||||||
|
let header = dump(dsiware, normalKey, locH.off, locH.len);
|
||||||
|
let footer = dump(dsiware, normalKey, locF.off, locF.len);
|
||||||
|
|
||||||
|
/* hash check */
|
||||||
|
if (!validateDsiwareComponents(banner, header, footer)) return;
|
||||||
|
|
||||||
|
/* content list extr & decrypt */
|
||||||
|
let buffer = sliceArr(header, 0x48, 0x2C).buffer;
|
||||||
|
let sizes = new Int32Array(buffer)
|
||||||
|
sizes.forEach((s, i) => { if (s === 0xB34) sizes[i] = 0xB40 });
|
||||||
|
|
||||||
|
let other = {};
|
||||||
|
let offset = constants.dataLocations.dsiware.other.off;
|
||||||
|
let otherNames = constants.dsiwareContent;
|
||||||
|
for (let i = 0; i < 11; i++) {
|
||||||
|
if (sizes[i] === 0) continue;
|
||||||
|
other[otherNames[i]] = dump(dsiware, normalKey, offset, sizes[i]);
|
||||||
|
offset += sizes[i] + 0x20;
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
banner: banner,
|
||||||
|
header: header,
|
||||||
|
footer: footer,
|
||||||
|
other: other,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function dump(dsiware, normalKey, off, len) {
|
||||||
|
let encrypted = sliceArr(dsiware, off, len);
|
||||||
|
let iv = sliceArr(dsiware, off + len + 0x10, 0x10);
|
||||||
|
let aesCbc = new aesjs.ModeOfOperation.cbc(normalKey, iv);
|
||||||
|
let decryptedBytes = aesCbc.decrypt(encrypted);
|
||||||
|
return decryptedBytes;
|
||||||
|
}
|
44
public/js/custom/fileAccess.js
Normal file
44
public/js/custom/fileAccess.js
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
function loadFiles() {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
let fileDsiware = document.getElementById("dsiware");
|
||||||
|
let fileMovable = document.getElementById("movable");
|
||||||
|
let fileGame = document.getElementById("game");
|
||||||
|
let fileSave = document.getElementById("save");
|
||||||
|
let fileCtcert = document.getElementById("ctcert");
|
||||||
|
|
||||||
|
if (!fileDsiware.files.length || !fileMovable.files.length || !fileGame.files.length
|
||||||
|
|| !fileSave.files.length || !fileCtcert.files.length)
|
||||||
|
return resolve('Not all files provided');
|
||||||
|
|
||||||
|
let promises = [];
|
||||||
|
promises.push(loadFile(fileDsiware));
|
||||||
|
promises.push(loadFile(fileMovable));
|
||||||
|
promises.push(loadFile(fileGame));
|
||||||
|
promises.push(loadFile(fileSave));
|
||||||
|
promises.push(loadFile(fileCtcert));
|
||||||
|
Promise.all(promises).then(data => {
|
||||||
|
resolve(data);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function loadFile(input) {
|
||||||
|
return new Promise(resolve => {
|
||||||
|
let reader = new FileReader();
|
||||||
|
reader.onload = function () {
|
||||||
|
resolve(new Uint8Array(reader.result));
|
||||||
|
};
|
||||||
|
reader.readAsArrayBuffer(input.files[0]);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function download(dsiwareFinal) {
|
||||||
|
let dsiwareName = $('#dsiware')[0].files[0].name || 'dsiware.bin';
|
||||||
|
dsiwareName = dsiwareName.substr(0, dsiwareName.length - 4).substr(0, 25).concat('.bin');
|
||||||
|
let a = window.document.createElement('a');
|
||||||
|
a.href = window.URL.createObjectURL(new Blob([dsiwareFinal], { type: 'application/octet-stream' }));
|
||||||
|
a.download = `${dsiwareName}.patched`;
|
||||||
|
document.body.appendChild(a);
|
||||||
|
a.click();
|
||||||
|
document.body.removeChild(a);
|
||||||
|
}
|
65
public/js/custom/injection.js
Normal file
65
public/js/custom/injection.js
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
function rebuildFooter(dsiwareData, ctcert) {
|
||||||
|
let {
|
||||||
|
banner,
|
||||||
|
header,
|
||||||
|
footer,
|
||||||
|
other,
|
||||||
|
} = dsiwareData;
|
||||||
|
|
||||||
|
/* calc hashes */
|
||||||
|
let hashBanner = sha256.array(banner);
|
||||||
|
let hashHeader = sha256.array(header);
|
||||||
|
let hashes = [];
|
||||||
|
hashes[0] = hashBanner;
|
||||||
|
hashes[1] = hashHeader;
|
||||||
|
|
||||||
|
let names = constants.dsiwareContent;
|
||||||
|
names.forEach((n, i) => {
|
||||||
|
if (other[n]) hashes[i + 2] = sha256.array(other[n]);
|
||||||
|
else hashes[i + 2] = new Uint8Array(32);
|
||||||
|
});
|
||||||
|
|
||||||
|
let hashesBlock = new Uint8Array(13 * 32);
|
||||||
|
hashes.forEach((h, i) => hashesBlock.set(h, i * 0x20));
|
||||||
|
|
||||||
|
/* inject hashesBlock */
|
||||||
|
let footerNew = new Uint8Array(footer.length);
|
||||||
|
footerNew = insertIntoArray(footer, hashesBlock, 0);
|
||||||
|
|
||||||
|
/* inject ctcert */
|
||||||
|
let ctcertNoPrivKey = sliceArr(ctcert, 0, 0x180);
|
||||||
|
footerNew = insertIntoArray(footerNew, ctcertNoPrivKey, hashesBlock.length + 0x1BC);
|
||||||
|
|
||||||
|
/* inject pubkey */
|
||||||
|
let pubKey = sliceArr(ctcert, 0x108, 0x3C);
|
||||||
|
footerNew = insertIntoArray(footerNew, pubKey, hashesBlock.length + 0x3C + 0x108);
|
||||||
|
|
||||||
|
/* create & inject apcertIssuer */
|
||||||
|
let issuer = getByteArray('Nintendo CA - G3_NintendoCTR2prod-'); // len: 0x22
|
||||||
|
let keyId = sliceArr(ctcert, 0xC4, 0x1E); // len: 0x40-0x22=0x1E
|
||||||
|
let apcertIssuer = new Uint8Array(0x40);
|
||||||
|
apcertIssuer.set(issuer);
|
||||||
|
apcertIssuer.set(keyId, issuer.length);
|
||||||
|
footerNew = insertIntoArray(footerNew, apcertIssuer, hashesBlock.length + 0x3C + 0x80);
|
||||||
|
|
||||||
|
/* update data */
|
||||||
|
dsiwareData.footer = footerNew;
|
||||||
|
dsiwareData.hashesBlock = hashesBlock;
|
||||||
|
dsiwareData.apcert = sliceArr(footerNew, hashesBlock.length + 0x3C + 0x80, 0x100);
|
||||||
|
|
||||||
|
return dsiwareData;
|
||||||
|
}
|
||||||
|
|
||||||
|
function injectSignatures(dsiwareData, sigHashesBlock, sigApcert) {
|
||||||
|
let hashesBlock = dsiwareData.hashesBlock;
|
||||||
|
let footer = dsiwareData.footer;
|
||||||
|
let footerNew = new Uint8Array(footer.length);
|
||||||
|
|
||||||
|
/* inject hashesBlock & apcert */
|
||||||
|
footerNew = insertIntoArray(footer, sigHashesBlock, hashesBlock.length);
|
||||||
|
footerNew = insertIntoArray(footerNew, sigApcert, hashesBlock.length + 0x3C + 0x4);
|
||||||
|
|
||||||
|
dsiwareData.footer = footerNew;
|
||||||
|
|
||||||
|
return dsiwareData;
|
||||||
|
}
|
94
public/js/custom/main.js
Normal file
94
public/js/custom/main.js
Normal file
@ -0,0 +1,94 @@
|
|||||||
|
function start() {
|
||||||
|
$('.btn-startInjection')[0].disabled = true;
|
||||||
|
document.getElementById("p-error").innerHTML = '';
|
||||||
|
loadFiles().then(data => {
|
||||||
|
if (typeof data !== 'object') return abort(data);
|
||||||
|
let dsiware = data[0];
|
||||||
|
let movable = data[1];
|
||||||
|
let game = data[2];
|
||||||
|
let save = data[3];
|
||||||
|
let ctcert = data[4];
|
||||||
|
|
||||||
|
/* Validation */
|
||||||
|
if (movable.length !== 0x140) return abort('movable.sed not valid');
|
||||||
|
if (ctcert.length !== 0x19E) return abort('ctcert.bin not valid');
|
||||||
|
|
||||||
|
let crcGame = getCrc(game);
|
||||||
|
if (!constants.hashes.all.includes(crcGame)) return abort('game_XXX.app is not valid');
|
||||||
|
let crcSave = getCrc(save);
|
||||||
|
if (!constants.hashes.all.includes(crcSave)) return abort('public_XXX.sav is not valid');
|
||||||
|
|
||||||
|
/* Data Extraction */
|
||||||
|
let locC = constants.dataLocations.ctcert;
|
||||||
|
let publicKeyR = sliceArr(ctcert, locC.publicKeyR.off, locC.publicKeyR.len);
|
||||||
|
let publicKeyS = sliceArr(ctcert, locC.publicKeyS.off, locC.publicKeyS.len);
|
||||||
|
let privateKey = sliceArr(ctcert, locC.privateKey.off, locC.privateKey.len);
|
||||||
|
|
||||||
|
let locM = constants.dataLocations.movable;
|
||||||
|
let movableKeyY = sliceArr(movable, locM.keyY.off, locM.keyY.len);
|
||||||
|
let normalKey = extractNormalKey(movableKeyY, constants.keys.keyX);
|
||||||
|
let dsiwareData = extractDsiware(dsiware, normalKey);
|
||||||
|
if (!dsiwareData) return abort('Wrong movable.sed provided');
|
||||||
|
|
||||||
|
/* msed_data extraction */
|
||||||
|
let msedDataHex = extractMsedData(movable);
|
||||||
|
let movableCrc = getCrc(movable);
|
||||||
|
|
||||||
|
/* app replacing */
|
||||||
|
let srl = dsiwareData.other['srl.nds'];
|
||||||
|
if (game.length > srl.length) return abort('Game not compatible');
|
||||||
|
let end = sliceArr(srl, game.length, srl.length - game.length);
|
||||||
|
let newApp = new Uint8Array(game.length + end.length);
|
||||||
|
newApp.set(game);
|
||||||
|
newApp.set(end, game.length);
|
||||||
|
|
||||||
|
/* sav replacing */
|
||||||
|
let sav = dsiwareData.other['public.sav'];
|
||||||
|
if (save.length > sav.length) return abort('Save not compatible with this game');
|
||||||
|
end = sliceArr(sav, save.length, sav.length - save.length);
|
||||||
|
let newSav = new Uint8Array(save.length + end.length);
|
||||||
|
newSav.set(save);
|
||||||
|
newSav.set(end, save.length);
|
||||||
|
|
||||||
|
/* update data */
|
||||||
|
dsiwareData.other['srl.nds'] = newApp;
|
||||||
|
dsiwareData.other['public.sav'] = newSav;
|
||||||
|
|
||||||
|
/* update footer hashes & add ctcert/pubkey */
|
||||||
|
dsiwareData = rebuildFooter(dsiwareData, ctcert);
|
||||||
|
|
||||||
|
/* signing */
|
||||||
|
let body = {
|
||||||
|
publicKeyR: byteArrToHexStr(publicKeyR),
|
||||||
|
publicKeyS: byteArrToHexStr(publicKeyS),
|
||||||
|
privateKey: byteArrToHexStr(privateKey),
|
||||||
|
hashesBlock: byteArrToHexStr(sha256.array(dsiwareData.hashesBlock)),
|
||||||
|
apcert: byteArrToHexStr(sha256.array(dsiwareData.apcert)),
|
||||||
|
msedDataHex: msedDataHex,
|
||||||
|
movableCrc: movableCrc,
|
||||||
|
};
|
||||||
|
$.post('https://tsign.jisagi.net/sign', body, data => {
|
||||||
|
data = JSON.parse(data);
|
||||||
|
if (data.error) return abort(`Signature Error: ${data.error}`);
|
||||||
|
let { sigHashesBlock, sigApcert } = JSON.parse(data.response);
|
||||||
|
|
||||||
|
sigHashesBlock = parseHexString(sigHashesBlock);
|
||||||
|
sigApcert = parseHexString(sigApcert);
|
||||||
|
|
||||||
|
/* inject signatures */
|
||||||
|
dsiwareData = injectSignatures(dsiwareData, sigHashesBlock, sigApcert);
|
||||||
|
|
||||||
|
/* rebuild dsiware */
|
||||||
|
dsiwareData.keys = { movableKeyY: movableKeyY, normalKey: normalKey };
|
||||||
|
let dsiwareFinal = buildDsiware(dsiwareData, dsiware.length);
|
||||||
|
|
||||||
|
/* offer file to download */
|
||||||
|
download(dsiwareFinal);
|
||||||
|
|
||||||
|
/* End */
|
||||||
|
console.log('Done');
|
||||||
|
}).always(() => {
|
||||||
|
$('.btn-startInjection')[0].disabled = false;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
22
public/js/custom/msed.js
Normal file
22
public/js/custom/msed.js
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
function extractMsedData(movable) {
|
||||||
|
let data = sliceArr(movable, 0x110, 0x10);
|
||||||
|
let lfcs = new DataView(sliceArr(data, 0x0, 0x4).reverse().buffer).getUint32();
|
||||||
|
let msed1 = new DataView(sliceArr(data, 0x4, 0x4).reverse().buffer).getUint32();
|
||||||
|
let msed3 = new DataView(sliceArr(data, 0xC, 0x4).reverse().buffer).getUint32() & 0x7FFFFFFF;
|
||||||
|
|
||||||
|
let est = Math.floor(lfcs / 5) - msed3;
|
||||||
|
let isNew = Boolean(msed1) ? 1 : 0;
|
||||||
|
lfcs = lfcs >> 12;
|
||||||
|
|
||||||
|
let lfcsFinal = new Uint8Array(0x4);
|
||||||
|
lfcsFinal.set(parseHexString(Number(lfcs).toString(16)).reverse());
|
||||||
|
let estFinal = new Uint8Array(0x4);
|
||||||
|
if (est < 0) est += (0xFFFFFFFF + 1);
|
||||||
|
estFinal.set(parseHexString(Number(est).toString(16)).reverse());
|
||||||
|
let isNewFinal = new Uint8Array(0x4);
|
||||||
|
isNewFinal.set(parseHexString(`0${isNew}`).reverse());
|
||||||
|
|
||||||
|
let msedDataHex = `${byteArrToHexStr(lfcsFinal)}${byteArrToHexStr(estFinal)}${byteArrToHexStr(isNewFinal)}`;
|
||||||
|
|
||||||
|
return msedDataHex;
|
||||||
|
}
|
40
public/js/custom/util.js
Normal file
40
public/js/custom/util.js
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
function sliceArr(arr, offset, length) {
|
||||||
|
return arr.slice(offset, offset + length);
|
||||||
|
}
|
||||||
|
|
||||||
|
function getCrc(buffer) {
|
||||||
|
return (CRC32.buf(buffer) >>> 0).toString(16).padStart(8, '0').toUpperCase();
|
||||||
|
}
|
||||||
|
|
||||||
|
function abort(message = 'Error') {
|
||||||
|
$('.btn-startInjection')[0].disabled = false;
|
||||||
|
document.getElementById("p-error").innerHTML = message;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getByteArray(text) {
|
||||||
|
let arr = [];
|
||||||
|
for (let i = 0; i < text.length; i++) { arr[i] = text.charCodeAt(i); }
|
||||||
|
return arr;
|
||||||
|
}
|
||||||
|
|
||||||
|
function byteArrToHexStr(byteArr) {
|
||||||
|
return Array.from(byteArr, b => `0${(b & 0xFF).toString(16)}`.slice(-2)).join('').toUpperCase();
|
||||||
|
}
|
||||||
|
|
||||||
|
function parseHexString(str) {
|
||||||
|
if (str.length % 2 !== 0) str = `0${str}`;
|
||||||
|
var result = [];
|
||||||
|
while (str.length >= 2) {
|
||||||
|
result.push(parseInt(str.substring(0, 2), 16));
|
||||||
|
str = str.substring(2, str.length);
|
||||||
|
}
|
||||||
|
return new Uint8Array(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
function insertIntoArray(originalArr, toInsert, offset) {
|
||||||
|
// Uint8Array conversion to JS Array
|
||||||
|
let orig = Array.from(originalArr);
|
||||||
|
let insert = Array.from(toInsert);
|
||||||
|
orig.splice(offset, insert.length, ...insert);
|
||||||
|
return new Uint8Array(orig);
|
||||||
|
}
|
10
public/js/custom/validation.js
Normal file
10
public/js/custom/validation.js
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
function validateDsiwareComponents(banner, header, footer) {
|
||||||
|
let hashBanner = sha256.array(banner);
|
||||||
|
let hashHeader = sha256.array(header);
|
||||||
|
let correctHashBanner = sliceArr(footer, 0, 0x20);
|
||||||
|
let correctHashHeader = sliceArr(footer, 0x20, 0x20);
|
||||||
|
if (byteArrToHexStr(hashBanner) !== byteArrToHexStr(correctHashBanner)
|
||||||
|
|| byteArrToHexStr(hashHeader) !== byteArrToHexStr(correctHashHeader))
|
||||||
|
return false;
|
||||||
|
return true;
|
||||||
|
}
|
803
public/js/libs/aes.js
Normal file
803
public/js/libs/aes.js
Normal file
@ -0,0 +1,803 @@
|
|||||||
|
"use strict";
|
||||||
|
|
||||||
|
(function (root) {
|
||||||
|
|
||||||
|
function checkInt(value) {
|
||||||
|
return (parseInt(value) === value);
|
||||||
|
}
|
||||||
|
|
||||||
|
function checkInts(arrayish) {
|
||||||
|
if (!checkInt(arrayish.length)) { return false; }
|
||||||
|
|
||||||
|
for (var i = 0; i < arrayish.length; i++) {
|
||||||
|
if (!checkInt(arrayish[i]) || arrayish[i] < 0 || arrayish[i] > 255) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
function coerceArray(arg, copy) {
|
||||||
|
|
||||||
|
// ArrayBuffer view
|
||||||
|
if (arg.buffer && ArrayBuffer.isView(arg) && arg.name === 'Uint8Array') {
|
||||||
|
|
||||||
|
if (copy) {
|
||||||
|
if (arg.slice) {
|
||||||
|
arg = arg.slice();
|
||||||
|
} else {
|
||||||
|
arg = Array.prototype.slice.call(arg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return arg;
|
||||||
|
}
|
||||||
|
|
||||||
|
// It's an array; check it is a valid representation of a byte
|
||||||
|
if (Array.isArray(arg)) {
|
||||||
|
if (!checkInts(arg)) {
|
||||||
|
throw new Error('Array contains invalid value: ' + arg);
|
||||||
|
}
|
||||||
|
|
||||||
|
return new Uint8Array(arg);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Something else, but behaves like an array (maybe a Buffer? Arguments?)
|
||||||
|
if (checkInt(arg.length) && checkInts(arg)) {
|
||||||
|
return new Uint8Array(arg);
|
||||||
|
}
|
||||||
|
|
||||||
|
throw new Error('unsupported array-like object');
|
||||||
|
}
|
||||||
|
|
||||||
|
function createArray(length) {
|
||||||
|
return new Uint8Array(length);
|
||||||
|
}
|
||||||
|
|
||||||
|
function copyArray(sourceArray, targetArray, targetStart, sourceStart, sourceEnd) {
|
||||||
|
if (sourceStart != null || sourceEnd != null) {
|
||||||
|
if (sourceArray.slice) {
|
||||||
|
sourceArray = sourceArray.slice(sourceStart, sourceEnd);
|
||||||
|
} else {
|
||||||
|
sourceArray = Array.prototype.slice.call(sourceArray, sourceStart, sourceEnd);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
targetArray.set(sourceArray, targetStart);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
var convertUtf8 = (function () {
|
||||||
|
function toBytes(text) {
|
||||||
|
var result = [], i = 0;
|
||||||
|
text = encodeURI(text);
|
||||||
|
while (i < text.length) {
|
||||||
|
var c = text.charCodeAt(i++);
|
||||||
|
|
||||||
|
// if it is a % sign, encode the following 2 bytes as a hex value
|
||||||
|
if (c === 37) {
|
||||||
|
result.push(parseInt(text.substr(i, 2), 16))
|
||||||
|
i += 2;
|
||||||
|
|
||||||
|
// otherwise, just the actual byte
|
||||||
|
} else {
|
||||||
|
result.push(c)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return coerceArray(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
function fromBytes(bytes) {
|
||||||
|
var result = [], i = 0;
|
||||||
|
|
||||||
|
while (i < bytes.length) {
|
||||||
|
var c = bytes[i];
|
||||||
|
|
||||||
|
if (c < 128) {
|
||||||
|
result.push(String.fromCharCode(c));
|
||||||
|
i++;
|
||||||
|
} else if (c > 191 && c < 224) {
|
||||||
|
result.push(String.fromCharCode(((c & 0x1f) << 6) | (bytes[i + 1] & 0x3f)));
|
||||||
|
i += 2;
|
||||||
|
} else {
|
||||||
|
result.push(String.fromCharCode(((c & 0x0f) << 12) | ((bytes[i + 1] & 0x3f) << 6) | (bytes[i + 2] & 0x3f)));
|
||||||
|
i += 3;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result.join('');
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
toBytes: toBytes,
|
||||||
|
fromBytes: fromBytes,
|
||||||
|
}
|
||||||
|
})();
|
||||||
|
|
||||||
|
var convertHex = (function () {
|
||||||
|
function toBytes(text) {
|
||||||
|
var result = [];
|
||||||
|
for (var i = 0; i < text.length; i += 2) {
|
||||||
|
result.push(parseInt(text.substr(i, 2), 16));
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
// http://ixti.net/development/javascript/2011/11/11/base64-encodedecode-of-utf8-in-browser-with-js.html
|
||||||
|
var Hex = '0123456789abcdef';
|
||||||
|
|
||||||
|
function fromBytes(bytes) {
|
||||||
|
var result = [];
|
||||||
|
for (var i = 0; i < bytes.length; i++) {
|
||||||
|
var v = bytes[i];
|
||||||
|
result.push(Hex[(v & 0xf0) >> 4] + Hex[v & 0x0f]);
|
||||||
|
}
|
||||||
|
return result.join('');
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
toBytes: toBytes,
|
||||||
|
fromBytes: fromBytes,
|
||||||
|
}
|
||||||
|
})();
|
||||||
|
|
||||||
|
|
||||||
|
// Number of rounds by keysize
|
||||||
|
var numberOfRounds = { 16: 10, 24: 12, 32: 14 }
|
||||||
|
|
||||||
|
// Round constant words
|
||||||
|
var rcon = [0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91];
|
||||||
|
|
||||||
|
// S-box and Inverse S-box (S is for Substitution)
|
||||||
|
var S = [0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76, 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75, 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8, 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb, 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a, 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16];
|
||||||
|
var Si = [0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb, 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, 0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e, 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25, 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84, 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06, 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, 0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73, 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e, 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, 0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4, 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f, 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, 0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61, 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d];
|
||||||
|
|
||||||
|
// Transformations for encryption
|
||||||
|
var T1 = [0xc66363a5, 0xf87c7c84, 0xee777799, 0xf67b7b8d, 0xfff2f20d, 0xd66b6bbd, 0xde6f6fb1, 0x91c5c554, 0x60303050, 0x02010103, 0xce6767a9, 0x562b2b7d, 0xe7fefe19, 0xb5d7d762, 0x4dababe6, 0xec76769a, 0x8fcaca45, 0x1f82829d, 0x89c9c940, 0xfa7d7d87, 0xeffafa15, 0xb25959eb, 0x8e4747c9, 0xfbf0f00b, 0x41adadec, 0xb3d4d467, 0x5fa2a2fd, 0x45afafea, 0x239c9cbf, 0x53a4a4f7, 0xe4727296, 0x9bc0c05b, 0x75b7b7c2, 0xe1fdfd1c, 0x3d9393ae, 0x4c26266a, 0x6c36365a, 0x7e3f3f41, 0xf5f7f702, 0x83cccc4f, 0x6834345c, 0x51a5a5f4, 0xd1e5e534, 0xf9f1f108, 0xe2717193, 0xabd8d873, 0x62313153, 0x2a15153f, 0x0804040c, 0x95c7c752, 0x46232365, 0x9dc3c35e, 0x30181828, 0x379696a1, 0x0a05050f, 0x2f9a9ab5, 0x0e070709, 0x24121236, 0x1b80809b, 0xdfe2e23d, 0xcdebeb26, 0x4e272769, 0x7fb2b2cd, 0xea75759f, 0x1209091b, 0x1d83839e, 0x582c2c74, 0x341a1a2e, 0x361b1b2d, 0xdc6e6eb2, 0xb45a5aee, 0x5ba0a0fb, 0xa45252f6, 0x763b3b4d, 0xb7d6d661, 0x7db3b3ce, 0x5229297b, 0xdde3e33e, 0x5e2f2f71, 0x13848497, 0xa65353f5, 0xb9d1d168, 0x00000000, 0xc1eded2c, 0x40202060, 0xe3fcfc1f, 0x79b1b1c8, 0xb65b5bed, 0xd46a6abe, 0x8dcbcb46, 0x67bebed9, 0x7239394b, 0x944a4ade, 0x984c4cd4, 0xb05858e8, 0x85cfcf4a, 0xbbd0d06b, 0xc5efef2a, 0x4faaaae5, 0xedfbfb16, 0x864343c5, 0x9a4d4dd7, 0x66333355, 0x11858594, 0x8a4545cf, 0xe9f9f910, 0x04020206, 0xfe7f7f81, 0xa05050f0, 0x783c3c44, 0x259f9fba, 0x4ba8a8e3, 0xa25151f3, 0x5da3a3fe, 0x804040c0, 0x058f8f8a, 0x3f9292ad, 0x219d9dbc, 0x70383848, 0xf1f5f504, 0x63bcbcdf, 0x77b6b6c1, 0xafdada75, 0x42212163, 0x20101030, 0xe5ffff1a, 0xfdf3f30e, 0xbfd2d26d, 0x81cdcd4c, 0x180c0c14, 0x26131335, 0xc3ecec2f, 0xbe5f5fe1, 0x359797a2, 0x884444cc, 0x2e171739, 0x93c4c457, 0x55a7a7f2, 0xfc7e7e82, 0x7a3d3d47, 0xc86464ac, 0xba5d5de7, 0x3219192b, 0xe6737395, 0xc06060a0, 0x19818198, 0x9e4f4fd1, 0xa3dcdc7f, 0x44222266, 0x542a2a7e, 0x3b9090ab, 0x0b888883, 0x8c4646ca, 0xc7eeee29, 0x6bb8b8d3, 0x2814143c, 0xa7dede79, 0xbc5e5ee2, 0x160b0b1d, 0xaddbdb76, 0xdbe0e03b, 0x64323256, 0x743a3a4e, 0x140a0a1e, 0x924949db, 0x0c06060a, 0x4824246c, 0xb85c5ce4, 0x9fc2c25d, 0xbdd3d36e, 0x43acacef, 0xc46262a6, 0x399191a8, 0x319595a4, 0xd3e4e437, 0xf279798b, 0xd5e7e732, 0x8bc8c843, 0x6e373759, 0xda6d6db7, 0x018d8d8c, 0xb1d5d564, 0x9c4e4ed2, 0x49a9a9e0, 0xd86c6cb4, 0xac5656fa, 0xf3f4f407, 0xcfeaea25, 0xca6565af, 0xf47a7a8e, 0x47aeaee9, 0x10080818, 0x6fbabad5, 0xf0787888, 0x4a25256f, 0x5c2e2e72, 0x381c1c24, 0x57a6a6f1, 0x73b4b4c7, 0x97c6c651, 0xcbe8e823, 0xa1dddd7c, 0xe874749c, 0x3e1f1f21, 0x964b4bdd, 0x61bdbddc, 0x0d8b8b86, 0x0f8a8a85, 0xe0707090, 0x7c3e3e42, 0x71b5b5c4, 0xcc6666aa, 0x904848d8, 0x06030305, 0xf7f6f601, 0x1c0e0e12, 0xc26161a3, 0x6a35355f, 0xae5757f9, 0x69b9b9d0, 0x17868691, 0x99c1c158, 0x3a1d1d27, 0x279e9eb9, 0xd9e1e138, 0xebf8f813, 0x2b9898b3, 0x22111133, 0xd26969bb, 0xa9d9d970, 0x078e8e89, 0x339494a7, 0x2d9b9bb6, 0x3c1e1e22, 0x15878792, 0xc9e9e920, 0x87cece49, 0xaa5555ff, 0x50282878, 0xa5dfdf7a, 0x038c8c8f, 0x59a1a1f8, 0x09898980, 0x1a0d0d17, 0x65bfbfda, 0xd7e6e631, 0x844242c6, 0xd06868b8, 0x824141c3, 0x299999b0, 0x5a2d2d77, 0x1e0f0f11, 0x7bb0b0cb, 0xa85454fc, 0x6dbbbbd6, 0x2c16163a];
|
||||||
|
var T2 = [0xa5c66363, 0x84f87c7c, 0x99ee7777, 0x8df67b7b, 0x0dfff2f2, 0xbdd66b6b, 0xb1de6f6f, 0x5491c5c5, 0x50603030, 0x03020101, 0xa9ce6767, 0x7d562b2b, 0x19e7fefe, 0x62b5d7d7, 0xe64dabab, 0x9aec7676, 0x458fcaca, 0x9d1f8282, 0x4089c9c9, 0x87fa7d7d, 0x15effafa, 0xebb25959, 0xc98e4747, 0x0bfbf0f0, 0xec41adad, 0x67b3d4d4, 0xfd5fa2a2, 0xea45afaf, 0xbf239c9c, 0xf753a4a4, 0x96e47272, 0x5b9bc0c0, 0xc275b7b7, 0x1ce1fdfd, 0xae3d9393, 0x6a4c2626, 0x5a6c3636, 0x417e3f3f, 0x02f5f7f7, 0x4f83cccc, 0x5c683434, 0xf451a5a5, 0x34d1e5e5, 0x08f9f1f1, 0x93e27171, 0x73abd8d8, 0x53623131, 0x3f2a1515, 0x0c080404, 0x5295c7c7, 0x65462323, 0x5e9dc3c3, 0x28301818, 0xa1379696, 0x0f0a0505, 0xb52f9a9a, 0x090e0707, 0x36241212, 0x9b1b8080, 0x3ddfe2e2, 0x26cdebeb, 0x694e2727, 0xcd7fb2b2, 0x9fea7575, 0x1b120909, 0x9e1d8383, 0x74582c2c, 0x2e341a1a, 0x2d361b1b, 0xb2dc6e6e, 0xeeb45a5a, 0xfb5ba0a0, 0xf6a45252, 0x4d763b3b, 0x61b7d6d6, 0xce7db3b3, 0x7b522929, 0x3edde3e3, 0x715e2f2f, 0x97138484, 0xf5a65353, 0x68b9d1d1, 0x00000000, 0x2cc1eded, 0x60402020, 0x1fe3fcfc, 0xc879b1b1, 0xedb65b5b, 0xbed46a6a, 0x468dcbcb, 0xd967bebe, 0x4b723939, 0xde944a4a, 0xd4984c4c, 0xe8b05858, 0x4a85cfcf, 0x6bbbd0d0, 0x2ac5efef, 0xe54faaaa, 0x16edfbfb, 0xc5864343, 0xd79a4d4d, 0x55663333, 0x94118585, 0xcf8a4545, 0x10e9f9f9, 0x06040202, 0x81fe7f7f, 0xf0a05050, 0x44783c3c, 0xba259f9f, 0xe34ba8a8, 0xf3a25151, 0xfe5da3a3, 0xc0804040, 0x8a058f8f, 0xad3f9292, 0xbc219d9d, 0x48703838, 0x04f1f5f5, 0xdf63bcbc, 0xc177b6b6, 0x75afdada, 0x63422121, 0x30201010, 0x1ae5ffff, 0x0efdf3f3, 0x6dbfd2d2, 0x4c81cdcd, 0x14180c0c, 0x35261313, 0x2fc3ecec, 0xe1be5f5f, 0xa2359797, 0xcc884444, 0x392e1717, 0x5793c4c4, 0xf255a7a7, 0x82fc7e7e, 0x477a3d3d, 0xacc86464, 0xe7ba5d5d, 0x2b321919, 0x95e67373, 0xa0c06060, 0x98198181, 0xd19e4f4f, 0x7fa3dcdc, 0x66442222, 0x7e542a2a, 0xab3b9090, 0x830b8888, 0xca8c4646, 0x29c7eeee, 0xd36bb8b8, 0x3c281414, 0x79a7dede, 0xe2bc5e5e, 0x1d160b0b, 0x76addbdb, 0x3bdbe0e0, 0x56643232, 0x4e743a3a, 0x1e140a0a, 0xdb924949, 0x0a0c0606, 0x6c482424, 0xe4b85c5c, 0x5d9fc2c2, 0x6ebdd3d3, 0xef43acac, 0xa6c46262, 0xa8399191, 0xa4319595, 0x37d3e4e4, 0x8bf27979, 0x32d5e7e7, 0x438bc8c8, 0x596e3737, 0xb7da6d6d, 0x8c018d8d, 0x64b1d5d5, 0xd29c4e4e, 0xe049a9a9, 0xb4d86c6c, 0xfaac5656, 0x07f3f4f4, 0x25cfeaea, 0xafca6565, 0x8ef47a7a, 0xe947aeae, 0x18100808, 0xd56fbaba, 0x88f07878, 0x6f4a2525, 0x725c2e2e, 0x24381c1c, 0xf157a6a6, 0xc773b4b4, 0x5197c6c6, 0x23cbe8e8, 0x7ca1dddd, 0x9ce87474, 0x213e1f1f, 0xdd964b4b, 0xdc61bdbd, 0x860d8b8b, 0x850f8a8a, 0x90e07070, 0x427c3e3e, 0xc471b5b5, 0xaacc6666, 0xd8904848, 0x05060303, 0x01f7f6f6, 0x121c0e0e, 0xa3c26161, 0x5f6a3535, 0xf9ae5757, 0xd069b9b9, 0x91178686, 0x5899c1c1, 0x273a1d1d, 0xb9279e9e, 0x38d9e1e1, 0x13ebf8f8, 0xb32b9898, 0x33221111, 0xbbd26969, 0x70a9d9d9, 0x89078e8e, 0xa7339494, 0xb62d9b9b, 0x223c1e1e, 0x92158787, 0x20c9e9e9, 0x4987cece, 0xffaa5555, 0x78502828, 0x7aa5dfdf, 0x8f038c8c, 0xf859a1a1, 0x80098989, 0x171a0d0d, 0xda65bfbf, 0x31d7e6e6, 0xc6844242, 0xb8d06868, 0xc3824141, 0xb0299999, 0x775a2d2d, 0x111e0f0f, 0xcb7bb0b0, 0xfca85454, 0xd66dbbbb, 0x3a2c1616];
|
||||||
|
var T3 = [0x63a5c663, 0x7c84f87c, 0x7799ee77, 0x7b8df67b, 0xf20dfff2, 0x6bbdd66b, 0x6fb1de6f, 0xc55491c5, 0x30506030, 0x01030201, 0x67a9ce67, 0x2b7d562b, 0xfe19e7fe, 0xd762b5d7, 0xabe64dab, 0x769aec76, 0xca458fca, 0x829d1f82, 0xc94089c9, 0x7d87fa7d, 0xfa15effa, 0x59ebb259, 0x47c98e47, 0xf00bfbf0, 0xadec41ad, 0xd467b3d4, 0xa2fd5fa2, 0xafea45af, 0x9cbf239c, 0xa4f753a4, 0x7296e472, 0xc05b9bc0, 0xb7c275b7, 0xfd1ce1fd, 0x93ae3d93, 0x266a4c26, 0x365a6c36, 0x3f417e3f, 0xf702f5f7, 0xcc4f83cc, 0x345c6834, 0xa5f451a5, 0xe534d1e5, 0xf108f9f1, 0x7193e271, 0xd873abd8, 0x31536231, 0x153f2a15, 0x040c0804, 0xc75295c7, 0x23654623, 0xc35e9dc3, 0x18283018, 0x96a13796, 0x050f0a05, 0x9ab52f9a, 0x07090e07, 0x12362412, 0x809b1b80, 0xe23ddfe2, 0xeb26cdeb, 0x27694e27, 0xb2cd7fb2, 0x759fea75, 0x091b1209, 0x839e1d83, 0x2c74582c, 0x1a2e341a, 0x1b2d361b, 0x6eb2dc6e, 0x5aeeb45a, 0xa0fb5ba0, 0x52f6a452, 0x3b4d763b, 0xd661b7d6, 0xb3ce7db3, 0x297b5229, 0xe33edde3, 0x2f715e2f, 0x84971384, 0x53f5a653, 0xd168b9d1, 0x00000000, 0xed2cc1ed, 0x20604020, 0xfc1fe3fc, 0xb1c879b1, 0x5bedb65b, 0x6abed46a, 0xcb468dcb, 0xbed967be, 0x394b7239, 0x4ade944a, 0x4cd4984c, 0x58e8b058, 0xcf4a85cf, 0xd06bbbd0, 0xef2ac5ef, 0xaae54faa, 0xfb16edfb, 0x43c58643, 0x4dd79a4d, 0x33556633, 0x85941185, 0x45cf8a45, 0xf910e9f9, 0x02060402, 0x7f81fe7f, 0x50f0a050, 0x3c44783c, 0x9fba259f, 0xa8e34ba8, 0x51f3a251, 0xa3fe5da3, 0x40c08040, 0x8f8a058f, 0x92ad3f92, 0x9dbc219d, 0x38487038, 0xf504f1f5, 0xbcdf63bc, 0xb6c177b6, 0xda75afda, 0x21634221, 0x10302010, 0xff1ae5ff, 0xf30efdf3, 0xd26dbfd2, 0xcd4c81cd, 0x0c14180c, 0x13352613, 0xec2fc3ec, 0x5fe1be5f, 0x97a23597, 0x44cc8844, 0x17392e17, 0xc45793c4, 0xa7f255a7, 0x7e82fc7e, 0x3d477a3d, 0x64acc864, 0x5de7ba5d, 0x192b3219, 0x7395e673, 0x60a0c060, 0x81981981, 0x4fd19e4f, 0xdc7fa3dc, 0x22664422, 0x2a7e542a, 0x90ab3b90, 0x88830b88, 0x46ca8c46, 0xee29c7ee, 0xb8d36bb8, 0x143c2814, 0xde79a7de, 0x5ee2bc5e, 0x0b1d160b, 0xdb76addb, 0xe03bdbe0, 0x32566432, 0x3a4e743a, 0x0a1e140a, 0x49db9249, 0x060a0c06, 0x246c4824, 0x5ce4b85c, 0xc25d9fc2, 0xd36ebdd3, 0xacef43ac, 0x62a6c462, 0x91a83991, 0x95a43195, 0xe437d3e4, 0x798bf279, 0xe732d5e7, 0xc8438bc8, 0x37596e37, 0x6db7da6d, 0x8d8c018d, 0xd564b1d5, 0x4ed29c4e, 0xa9e049a9, 0x6cb4d86c, 0x56faac56, 0xf407f3f4, 0xea25cfea, 0x65afca65, 0x7a8ef47a, 0xaee947ae, 0x08181008, 0xbad56fba, 0x7888f078, 0x256f4a25, 0x2e725c2e, 0x1c24381c, 0xa6f157a6, 0xb4c773b4, 0xc65197c6, 0xe823cbe8, 0xdd7ca1dd, 0x749ce874, 0x1f213e1f, 0x4bdd964b, 0xbddc61bd, 0x8b860d8b, 0x8a850f8a, 0x7090e070, 0x3e427c3e, 0xb5c471b5, 0x66aacc66, 0x48d89048, 0x03050603, 0xf601f7f6, 0x0e121c0e, 0x61a3c261, 0x355f6a35, 0x57f9ae57, 0xb9d069b9, 0x86911786, 0xc15899c1, 0x1d273a1d, 0x9eb9279e, 0xe138d9e1, 0xf813ebf8, 0x98b32b98, 0x11332211, 0x69bbd269, 0xd970a9d9, 0x8e89078e, 0x94a73394, 0x9bb62d9b, 0x1e223c1e, 0x87921587, 0xe920c9e9, 0xce4987ce, 0x55ffaa55, 0x28785028, 0xdf7aa5df, 0x8c8f038c, 0xa1f859a1, 0x89800989, 0x0d171a0d, 0xbfda65bf, 0xe631d7e6, 0x42c68442, 0x68b8d068, 0x41c38241, 0x99b02999, 0x2d775a2d, 0x0f111e0f, 0xb0cb7bb0, 0x54fca854, 0xbbd66dbb, 0x163a2c16];
|
||||||
|
var T4 = [0x6363a5c6, 0x7c7c84f8, 0x777799ee, 0x7b7b8df6, 0xf2f20dff, 0x6b6bbdd6, 0x6f6fb1de, 0xc5c55491, 0x30305060, 0x01010302, 0x6767a9ce, 0x2b2b7d56, 0xfefe19e7, 0xd7d762b5, 0xababe64d, 0x76769aec, 0xcaca458f, 0x82829d1f, 0xc9c94089, 0x7d7d87fa, 0xfafa15ef, 0x5959ebb2, 0x4747c98e, 0xf0f00bfb, 0xadadec41, 0xd4d467b3, 0xa2a2fd5f, 0xafafea45, 0x9c9cbf23, 0xa4a4f753, 0x727296e4, 0xc0c05b9b, 0xb7b7c275, 0xfdfd1ce1, 0x9393ae3d, 0x26266a4c, 0x36365a6c, 0x3f3f417e, 0xf7f702f5, 0xcccc4f83, 0x34345c68, 0xa5a5f451, 0xe5e534d1, 0xf1f108f9, 0x717193e2, 0xd8d873ab, 0x31315362, 0x15153f2a, 0x04040c08, 0xc7c75295, 0x23236546, 0xc3c35e9d, 0x18182830, 0x9696a137, 0x05050f0a, 0x9a9ab52f, 0x0707090e, 0x12123624, 0x80809b1b, 0xe2e23ddf, 0xebeb26cd, 0x2727694e, 0xb2b2cd7f, 0x75759fea, 0x09091b12, 0x83839e1d, 0x2c2c7458, 0x1a1a2e34, 0x1b1b2d36, 0x6e6eb2dc, 0x5a5aeeb4, 0xa0a0fb5b, 0x5252f6a4, 0x3b3b4d76, 0xd6d661b7, 0xb3b3ce7d, 0x29297b52, 0xe3e33edd, 0x2f2f715e, 0x84849713, 0x5353f5a6, 0xd1d168b9, 0x00000000, 0xeded2cc1, 0x20206040, 0xfcfc1fe3, 0xb1b1c879, 0x5b5bedb6, 0x6a6abed4, 0xcbcb468d, 0xbebed967, 0x39394b72, 0x4a4ade94, 0x4c4cd498, 0x5858e8b0, 0xcfcf4a85, 0xd0d06bbb, 0xefef2ac5, 0xaaaae54f, 0xfbfb16ed, 0x4343c586, 0x4d4dd79a, 0x33335566, 0x85859411, 0x4545cf8a, 0xf9f910e9, 0x02020604, 0x7f7f81fe, 0x5050f0a0, 0x3c3c4478, 0x9f9fba25, 0xa8a8e34b, 0x5151f3a2, 0xa3a3fe5d, 0x4040c080, 0x8f8f8a05, 0x9292ad3f, 0x9d9dbc21, 0x38384870, 0xf5f504f1, 0xbcbcdf63, 0xb6b6c177, 0xdada75af, 0x21216342, 0x10103020, 0xffff1ae5, 0xf3f30efd, 0xd2d26dbf, 0xcdcd4c81, 0x0c0c1418, 0x13133526, 0xecec2fc3, 0x5f5fe1be, 0x9797a235, 0x4444cc88, 0x1717392e, 0xc4c45793, 0xa7a7f255, 0x7e7e82fc, 0x3d3d477a, 0x6464acc8, 0x5d5de7ba, 0x19192b32, 0x737395e6, 0x6060a0c0, 0x81819819, 0x4f4fd19e, 0xdcdc7fa3, 0x22226644, 0x2a2a7e54, 0x9090ab3b, 0x8888830b, 0x4646ca8c, 0xeeee29c7, 0xb8b8d36b, 0x14143c28, 0xdede79a7, 0x5e5ee2bc, 0x0b0b1d16, 0xdbdb76ad, 0xe0e03bdb, 0x32325664, 0x3a3a4e74, 0x0a0a1e14, 0x4949db92, 0x06060a0c, 0x24246c48, 0x5c5ce4b8, 0xc2c25d9f, 0xd3d36ebd, 0xacacef43, 0x6262a6c4, 0x9191a839, 0x9595a431, 0xe4e437d3, 0x79798bf2, 0xe7e732d5, 0xc8c8438b, 0x3737596e, 0x6d6db7da, 0x8d8d8c01, 0xd5d564b1, 0x4e4ed29c, 0xa9a9e049, 0x6c6cb4d8, 0x5656faac, 0xf4f407f3, 0xeaea25cf, 0x6565afca, 0x7a7a8ef4, 0xaeaee947, 0x08081810, 0xbabad56f, 0x787888f0, 0x25256f4a, 0x2e2e725c, 0x1c1c2438, 0xa6a6f157, 0xb4b4c773, 0xc6c65197, 0xe8e823cb, 0xdddd7ca1, 0x74749ce8, 0x1f1f213e, 0x4b4bdd96, 0xbdbddc61, 0x8b8b860d, 0x8a8a850f, 0x707090e0, 0x3e3e427c, 0xb5b5c471, 0x6666aacc, 0x4848d890, 0x03030506, 0xf6f601f7, 0x0e0e121c, 0x6161a3c2, 0x35355f6a, 0x5757f9ae, 0xb9b9d069, 0x86869117, 0xc1c15899, 0x1d1d273a, 0x9e9eb927, 0xe1e138d9, 0xf8f813eb, 0x9898b32b, 0x11113322, 0x6969bbd2, 0xd9d970a9, 0x8e8e8907, 0x9494a733, 0x9b9bb62d, 0x1e1e223c, 0x87879215, 0xe9e920c9, 0xcece4987, 0x5555ffaa, 0x28287850, 0xdfdf7aa5, 0x8c8c8f03, 0xa1a1f859, 0x89898009, 0x0d0d171a, 0xbfbfda65, 0xe6e631d7, 0x4242c684, 0x6868b8d0, 0x4141c382, 0x9999b029, 0x2d2d775a, 0x0f0f111e, 0xb0b0cb7b, 0x5454fca8, 0xbbbbd66d, 0x16163a2c];
|
||||||
|
|
||||||
|
// Transformations for decryption
|
||||||
|
var T5 = [0x51f4a750, 0x7e416553, 0x1a17a4c3, 0x3a275e96, 0x3bab6bcb, 0x1f9d45f1, 0xacfa58ab, 0x4be30393, 0x2030fa55, 0xad766df6, 0x88cc7691, 0xf5024c25, 0x4fe5d7fc, 0xc52acbd7, 0x26354480, 0xb562a38f, 0xdeb15a49, 0x25ba1b67, 0x45ea0e98, 0x5dfec0e1, 0xc32f7502, 0x814cf012, 0x8d4697a3, 0x6bd3f9c6, 0x038f5fe7, 0x15929c95, 0xbf6d7aeb, 0x955259da, 0xd4be832d, 0x587421d3, 0x49e06929, 0x8ec9c844, 0x75c2896a, 0xf48e7978, 0x99583e6b, 0x27b971dd, 0xbee14fb6, 0xf088ad17, 0xc920ac66, 0x7dce3ab4, 0x63df4a18, 0xe51a3182, 0x97513360, 0x62537f45, 0xb16477e0, 0xbb6bae84, 0xfe81a01c, 0xf9082b94, 0x70486858, 0x8f45fd19, 0x94de6c87, 0x527bf8b7, 0xab73d323, 0x724b02e2, 0xe31f8f57, 0x6655ab2a, 0xb2eb2807, 0x2fb5c203, 0x86c57b9a, 0xd33708a5, 0x302887f2, 0x23bfa5b2, 0x02036aba, 0xed16825c, 0x8acf1c2b, 0xa779b492, 0xf307f2f0, 0x4e69e2a1, 0x65daf4cd, 0x0605bed5, 0xd134621f, 0xc4a6fe8a, 0x342e539d, 0xa2f355a0, 0x058ae132, 0xa4f6eb75, 0x0b83ec39, 0x4060efaa, 0x5e719f06, 0xbd6e1051, 0x3e218af9, 0x96dd063d, 0xdd3e05ae, 0x4de6bd46, 0x91548db5, 0x71c45d05, 0x0406d46f, 0x605015ff, 0x1998fb24, 0xd6bde997, 0x894043cc, 0x67d99e77, 0xb0e842bd, 0x07898b88, 0xe7195b38, 0x79c8eedb, 0xa17c0a47, 0x7c420fe9, 0xf8841ec9, 0x00000000, 0x09808683, 0x322bed48, 0x1e1170ac, 0x6c5a724e, 0xfd0efffb, 0x0f853856, 0x3daed51e, 0x362d3927, 0x0a0fd964, 0x685ca621, 0x9b5b54d1, 0x24362e3a, 0x0c0a67b1, 0x9357e70f, 0xb4ee96d2, 0x1b9b919e, 0x80c0c54f, 0x61dc20a2, 0x5a774b69, 0x1c121a16, 0xe293ba0a, 0xc0a02ae5, 0x3c22e043, 0x121b171d, 0x0e090d0b, 0xf28bc7ad, 0x2db6a8b9, 0x141ea9c8, 0x57f11985, 0xaf75074c, 0xee99ddbb, 0xa37f60fd, 0xf701269f, 0x5c72f5bc, 0x44663bc5, 0x5bfb7e34, 0x8b432976, 0xcb23c6dc, 0xb6edfc68, 0xb8e4f163, 0xd731dcca, 0x42638510, 0x13972240, 0x84c61120, 0x854a247d, 0xd2bb3df8, 0xaef93211, 0xc729a16d, 0x1d9e2f4b, 0xdcb230f3, 0x0d8652ec, 0x77c1e3d0, 0x2bb3166c, 0xa970b999, 0x119448fa, 0x47e96422, 0xa8fc8cc4, 0xa0f03f1a, 0x567d2cd8, 0x223390ef, 0x87494ec7, 0xd938d1c1, 0x8ccaa2fe, 0x98d40b36, 0xa6f581cf, 0xa57ade28, 0xdab78e26, 0x3fadbfa4, 0x2c3a9de4, 0x5078920d, 0x6a5fcc9b, 0x547e4662, 0xf68d13c2, 0x90d8b8e8, 0x2e39f75e, 0x82c3aff5, 0x9f5d80be, 0x69d0937c, 0x6fd52da9, 0xcf2512b3, 0xc8ac993b, 0x10187da7, 0xe89c636e, 0xdb3bbb7b, 0xcd267809, 0x6e5918f4, 0xec9ab701, 0x834f9aa8, 0xe6956e65, 0xaaffe67e, 0x21bccf08, 0xef15e8e6, 0xbae79bd9, 0x4a6f36ce, 0xea9f09d4, 0x29b07cd6, 0x31a4b2af, 0x2a3f2331, 0xc6a59430, 0x35a266c0, 0x744ebc37, 0xfc82caa6, 0xe090d0b0, 0x33a7d815, 0xf104984a, 0x41ecdaf7, 0x7fcd500e, 0x1791f62f, 0x764dd68d, 0x43efb04d, 0xccaa4d54, 0xe49604df, 0x9ed1b5e3, 0x4c6a881b, 0xc12c1fb8, 0x4665517f, 0x9d5eea04, 0x018c355d, 0xfa877473, 0xfb0b412e, 0xb3671d5a, 0x92dbd252, 0xe9105633, 0x6dd64713, 0x9ad7618c, 0x37a10c7a, 0x59f8148e, 0xeb133c89, 0xcea927ee, 0xb761c935, 0xe11ce5ed, 0x7a47b13c, 0x9cd2df59, 0x55f2733f, 0x1814ce79, 0x73c737bf, 0x53f7cdea, 0x5ffdaa5b, 0xdf3d6f14, 0x7844db86, 0xcaaff381, 0xb968c43e, 0x3824342c, 0xc2a3405f, 0x161dc372, 0xbce2250c, 0x283c498b, 0xff0d9541, 0x39a80171, 0x080cb3de, 0xd8b4e49c, 0x6456c190, 0x7bcb8461, 0xd532b670, 0x486c5c74, 0xd0b85742];
|
||||||
|
var T6 = [0x5051f4a7, 0x537e4165, 0xc31a17a4, 0x963a275e, 0xcb3bab6b, 0xf11f9d45, 0xabacfa58, 0x934be303, 0x552030fa, 0xf6ad766d, 0x9188cc76, 0x25f5024c, 0xfc4fe5d7, 0xd7c52acb, 0x80263544, 0x8fb562a3, 0x49deb15a, 0x6725ba1b, 0x9845ea0e, 0xe15dfec0, 0x02c32f75, 0x12814cf0, 0xa38d4697, 0xc66bd3f9, 0xe7038f5f, 0x9515929c, 0xebbf6d7a, 0xda955259, 0x2dd4be83, 0xd3587421, 0x2949e069, 0x448ec9c8, 0x6a75c289, 0x78f48e79, 0x6b99583e, 0xdd27b971, 0xb6bee14f, 0x17f088ad, 0x66c920ac, 0xb47dce3a, 0x1863df4a, 0x82e51a31, 0x60975133, 0x4562537f, 0xe0b16477, 0x84bb6bae, 0x1cfe81a0, 0x94f9082b, 0x58704868, 0x198f45fd, 0x8794de6c, 0xb7527bf8, 0x23ab73d3, 0xe2724b02, 0x57e31f8f, 0x2a6655ab, 0x07b2eb28, 0x032fb5c2, 0x9a86c57b, 0xa5d33708, 0xf2302887, 0xb223bfa5, 0xba02036a, 0x5ced1682, 0x2b8acf1c, 0x92a779b4, 0xf0f307f2, 0xa14e69e2, 0xcd65daf4, 0xd50605be, 0x1fd13462, 0x8ac4a6fe, 0x9d342e53, 0xa0a2f355, 0x32058ae1, 0x75a4f6eb, 0x390b83ec, 0xaa4060ef, 0x065e719f, 0x51bd6e10, 0xf93e218a, 0x3d96dd06, 0xaedd3e05, 0x464de6bd, 0xb591548d, 0x0571c45d, 0x6f0406d4, 0xff605015, 0x241998fb, 0x97d6bde9, 0xcc894043, 0x7767d99e, 0xbdb0e842, 0x8807898b, 0x38e7195b, 0xdb79c8ee, 0x47a17c0a, 0xe97c420f, 0xc9f8841e, 0x00000000, 0x83098086, 0x48322bed, 0xac1e1170, 0x4e6c5a72, 0xfbfd0eff, 0x560f8538, 0x1e3daed5, 0x27362d39, 0x640a0fd9, 0x21685ca6, 0xd19b5b54, 0x3a24362e, 0xb10c0a67, 0x0f9357e7, 0xd2b4ee96, 0x9e1b9b91, 0x4f80c0c5, 0xa261dc20, 0x695a774b, 0x161c121a, 0x0ae293ba, 0xe5c0a02a, 0x433c22e0, 0x1d121b17, 0x0b0e090d, 0xadf28bc7, 0xb92db6a8, 0xc8141ea9, 0x8557f119, 0x4caf7507, 0xbbee99dd, 0xfda37f60, 0x9ff70126, 0xbc5c72f5, 0xc544663b, 0x345bfb7e, 0x768b4329, 0xdccb23c6, 0x68b6edfc, 0x63b8e4f1, 0xcad731dc, 0x10426385, 0x40139722, 0x2084c611, 0x7d854a24, 0xf8d2bb3d, 0x11aef932, 0x6dc729a1, 0x4b1d9e2f, 0xf3dcb230, 0xec0d8652, 0xd077c1e3, 0x6c2bb316, 0x99a970b9, 0xfa119448, 0x2247e964, 0xc4a8fc8c, 0x1aa0f03f, 0xd8567d2c, 0xef223390, 0xc787494e, 0xc1d938d1, 0xfe8ccaa2, 0x3698d40b, 0xcfa6f581, 0x28a57ade, 0x26dab78e, 0xa43fadbf, 0xe42c3a9d, 0x0d507892, 0x9b6a5fcc, 0x62547e46, 0xc2f68d13, 0xe890d8b8, 0x5e2e39f7, 0xf582c3af, 0xbe9f5d80, 0x7c69d093, 0xa96fd52d, 0xb3cf2512, 0x3bc8ac99, 0xa710187d, 0x6ee89c63, 0x7bdb3bbb, 0x09cd2678, 0xf46e5918, 0x01ec9ab7, 0xa8834f9a, 0x65e6956e, 0x7eaaffe6, 0x0821bccf, 0xe6ef15e8, 0xd9bae79b, 0xce4a6f36, 0xd4ea9f09, 0xd629b07c, 0xaf31a4b2, 0x312a3f23, 0x30c6a594, 0xc035a266, 0x37744ebc, 0xa6fc82ca, 0xb0e090d0, 0x1533a7d8, 0x4af10498, 0xf741ecda, 0x0e7fcd50, 0x2f1791f6, 0x8d764dd6, 0x4d43efb0, 0x54ccaa4d, 0xdfe49604, 0xe39ed1b5, 0x1b4c6a88, 0xb8c12c1f, 0x7f466551, 0x049d5eea, 0x5d018c35, 0x73fa8774, 0x2efb0b41, 0x5ab3671d, 0x5292dbd2, 0x33e91056, 0x136dd647, 0x8c9ad761, 0x7a37a10c, 0x8e59f814, 0x89eb133c, 0xeecea927, 0x35b761c9, 0xede11ce5, 0x3c7a47b1, 0x599cd2df, 0x3f55f273, 0x791814ce, 0xbf73c737, 0xea53f7cd, 0x5b5ffdaa, 0x14df3d6f, 0x867844db, 0x81caaff3, 0x3eb968c4, 0x2c382434, 0x5fc2a340, 0x72161dc3, 0x0cbce225, 0x8b283c49, 0x41ff0d95, 0x7139a801, 0xde080cb3, 0x9cd8b4e4, 0x906456c1, 0x617bcb84, 0x70d532b6, 0x74486c5c, 0x42d0b857];
|
||||||
|
var T7 = [0xa75051f4, 0x65537e41, 0xa4c31a17, 0x5e963a27, 0x6bcb3bab, 0x45f11f9d, 0x58abacfa, 0x03934be3, 0xfa552030, 0x6df6ad76, 0x769188cc, 0x4c25f502, 0xd7fc4fe5, 0xcbd7c52a, 0x44802635, 0xa38fb562, 0x5a49deb1, 0x1b6725ba, 0x0e9845ea, 0xc0e15dfe, 0x7502c32f, 0xf012814c, 0x97a38d46, 0xf9c66bd3, 0x5fe7038f, 0x9c951592, 0x7aebbf6d, 0x59da9552, 0x832dd4be, 0x21d35874, 0x692949e0, 0xc8448ec9, 0x896a75c2, 0x7978f48e, 0x3e6b9958, 0x71dd27b9, 0x4fb6bee1, 0xad17f088, 0xac66c920, 0x3ab47dce, 0x4a1863df, 0x3182e51a, 0x33609751, 0x7f456253, 0x77e0b164, 0xae84bb6b, 0xa01cfe81, 0x2b94f908, 0x68587048, 0xfd198f45, 0x6c8794de, 0xf8b7527b, 0xd323ab73, 0x02e2724b, 0x8f57e31f, 0xab2a6655, 0x2807b2eb, 0xc2032fb5, 0x7b9a86c5, 0x08a5d337, 0x87f23028, 0xa5b223bf, 0x6aba0203, 0x825ced16, 0x1c2b8acf, 0xb492a779, 0xf2f0f307, 0xe2a14e69, 0xf4cd65da, 0xbed50605, 0x621fd134, 0xfe8ac4a6, 0x539d342e, 0x55a0a2f3, 0xe132058a, 0xeb75a4f6, 0xec390b83, 0xefaa4060, 0x9f065e71, 0x1051bd6e, 0x8af93e21, 0x063d96dd, 0x05aedd3e, 0xbd464de6, 0x8db59154, 0x5d0571c4, 0xd46f0406, 0x15ff6050, 0xfb241998, 0xe997d6bd, 0x43cc8940, 0x9e7767d9, 0x42bdb0e8, 0x8b880789, 0x5b38e719, 0xeedb79c8, 0x0a47a17c, 0x0fe97c42, 0x1ec9f884, 0x00000000, 0x86830980, 0xed48322b, 0x70ac1e11, 0x724e6c5a, 0xfffbfd0e, 0x38560f85, 0xd51e3dae, 0x3927362d, 0xd9640a0f, 0xa621685c, 0x54d19b5b, 0x2e3a2436, 0x67b10c0a, 0xe70f9357, 0x96d2b4ee, 0x919e1b9b, 0xc54f80c0, 0x20a261dc, 0x4b695a77, 0x1a161c12, 0xba0ae293, 0x2ae5c0a0, 0xe0433c22, 0x171d121b, 0x0d0b0e09, 0xc7adf28b, 0xa8b92db6, 0xa9c8141e, 0x198557f1, 0x074caf75, 0xddbbee99, 0x60fda37f, 0x269ff701, 0xf5bc5c72, 0x3bc54466, 0x7e345bfb, 0x29768b43, 0xc6dccb23, 0xfc68b6ed, 0xf163b8e4, 0xdccad731, 0x85104263, 0x22401397, 0x112084c6, 0x247d854a, 0x3df8d2bb, 0x3211aef9, 0xa16dc729, 0x2f4b1d9e, 0x30f3dcb2, 0x52ec0d86, 0xe3d077c1, 0x166c2bb3, 0xb999a970, 0x48fa1194, 0x642247e9, 0x8cc4a8fc, 0x3f1aa0f0, 0x2cd8567d, 0x90ef2233, 0x4ec78749, 0xd1c1d938, 0xa2fe8cca, 0x0b3698d4, 0x81cfa6f5, 0xde28a57a, 0x8e26dab7, 0xbfa43fad, 0x9de42c3a, 0x920d5078, 0xcc9b6a5f, 0x4662547e, 0x13c2f68d, 0xb8e890d8, 0xf75e2e39, 0xaff582c3, 0x80be9f5d, 0x937c69d0, 0x2da96fd5, 0x12b3cf25, 0x993bc8ac, 0x7da71018, 0x636ee89c, 0xbb7bdb3b, 0x7809cd26, 0x18f46e59, 0xb701ec9a, 0x9aa8834f, 0x6e65e695, 0xe67eaaff, 0xcf0821bc, 0xe8e6ef15, 0x9bd9bae7, 0x36ce4a6f, 0x09d4ea9f, 0x7cd629b0, 0xb2af31a4, 0x23312a3f, 0x9430c6a5, 0x66c035a2, 0xbc37744e, 0xcaa6fc82, 0xd0b0e090, 0xd81533a7, 0x984af104, 0xdaf741ec, 0x500e7fcd, 0xf62f1791, 0xd68d764d, 0xb04d43ef, 0x4d54ccaa, 0x04dfe496, 0xb5e39ed1, 0x881b4c6a, 0x1fb8c12c, 0x517f4665, 0xea049d5e, 0x355d018c, 0x7473fa87, 0x412efb0b, 0x1d5ab367, 0xd25292db, 0x5633e910, 0x47136dd6, 0x618c9ad7, 0x0c7a37a1, 0x148e59f8, 0x3c89eb13, 0x27eecea9, 0xc935b761, 0xe5ede11c, 0xb13c7a47, 0xdf599cd2, 0x733f55f2, 0xce791814, 0x37bf73c7, 0xcdea53f7, 0xaa5b5ffd, 0x6f14df3d, 0xdb867844, 0xf381caaf, 0xc43eb968, 0x342c3824, 0x405fc2a3, 0xc372161d, 0x250cbce2, 0x498b283c, 0x9541ff0d, 0x017139a8, 0xb3de080c, 0xe49cd8b4, 0xc1906456, 0x84617bcb, 0xb670d532, 0x5c74486c, 0x5742d0b8];
|
||||||
|
var T8 = [0xf4a75051, 0x4165537e, 0x17a4c31a, 0x275e963a, 0xab6bcb3b, 0x9d45f11f, 0xfa58abac, 0xe303934b, 0x30fa5520, 0x766df6ad, 0xcc769188, 0x024c25f5, 0xe5d7fc4f, 0x2acbd7c5, 0x35448026, 0x62a38fb5, 0xb15a49de, 0xba1b6725, 0xea0e9845, 0xfec0e15d, 0x2f7502c3, 0x4cf01281, 0x4697a38d, 0xd3f9c66b, 0x8f5fe703, 0x929c9515, 0x6d7aebbf, 0x5259da95, 0xbe832dd4, 0x7421d358, 0xe0692949, 0xc9c8448e, 0xc2896a75, 0x8e7978f4, 0x583e6b99, 0xb971dd27, 0xe14fb6be, 0x88ad17f0, 0x20ac66c9, 0xce3ab47d, 0xdf4a1863, 0x1a3182e5, 0x51336097, 0x537f4562, 0x6477e0b1, 0x6bae84bb, 0x81a01cfe, 0x082b94f9, 0x48685870, 0x45fd198f, 0xde6c8794, 0x7bf8b752, 0x73d323ab, 0x4b02e272, 0x1f8f57e3, 0x55ab2a66, 0xeb2807b2, 0xb5c2032f, 0xc57b9a86, 0x3708a5d3, 0x2887f230, 0xbfa5b223, 0x036aba02, 0x16825ced, 0xcf1c2b8a, 0x79b492a7, 0x07f2f0f3, 0x69e2a14e, 0xdaf4cd65, 0x05bed506, 0x34621fd1, 0xa6fe8ac4, 0x2e539d34, 0xf355a0a2, 0x8ae13205, 0xf6eb75a4, 0x83ec390b, 0x60efaa40, 0x719f065e, 0x6e1051bd, 0x218af93e, 0xdd063d96, 0x3e05aedd, 0xe6bd464d, 0x548db591, 0xc45d0571, 0x06d46f04, 0x5015ff60, 0x98fb2419, 0xbde997d6, 0x4043cc89, 0xd99e7767, 0xe842bdb0, 0x898b8807, 0x195b38e7, 0xc8eedb79, 0x7c0a47a1, 0x420fe97c, 0x841ec9f8, 0x00000000, 0x80868309, 0x2bed4832, 0x1170ac1e, 0x5a724e6c, 0x0efffbfd, 0x8538560f, 0xaed51e3d, 0x2d392736, 0x0fd9640a, 0x5ca62168, 0x5b54d19b, 0x362e3a24, 0x0a67b10c, 0x57e70f93, 0xee96d2b4, 0x9b919e1b, 0xc0c54f80, 0xdc20a261, 0x774b695a, 0x121a161c, 0x93ba0ae2, 0xa02ae5c0, 0x22e0433c, 0x1b171d12, 0x090d0b0e, 0x8bc7adf2, 0xb6a8b92d, 0x1ea9c814, 0xf1198557, 0x75074caf, 0x99ddbbee, 0x7f60fda3, 0x01269ff7, 0x72f5bc5c, 0x663bc544, 0xfb7e345b, 0x4329768b, 0x23c6dccb, 0xedfc68b6, 0xe4f163b8, 0x31dccad7, 0x63851042, 0x97224013, 0xc6112084, 0x4a247d85, 0xbb3df8d2, 0xf93211ae, 0x29a16dc7, 0x9e2f4b1d, 0xb230f3dc, 0x8652ec0d, 0xc1e3d077, 0xb3166c2b, 0x70b999a9, 0x9448fa11, 0xe9642247, 0xfc8cc4a8, 0xf03f1aa0, 0x7d2cd856, 0x3390ef22, 0x494ec787, 0x38d1c1d9, 0xcaa2fe8c, 0xd40b3698, 0xf581cfa6, 0x7ade28a5, 0xb78e26da, 0xadbfa43f, 0x3a9de42c, 0x78920d50, 0x5fcc9b6a, 0x7e466254, 0x8d13c2f6, 0xd8b8e890, 0x39f75e2e, 0xc3aff582, 0x5d80be9f, 0xd0937c69, 0xd52da96f, 0x2512b3cf, 0xac993bc8, 0x187da710, 0x9c636ee8, 0x3bbb7bdb, 0x267809cd, 0x5918f46e, 0x9ab701ec, 0x4f9aa883, 0x956e65e6, 0xffe67eaa, 0xbccf0821, 0x15e8e6ef, 0xe79bd9ba, 0x6f36ce4a, 0x9f09d4ea, 0xb07cd629, 0xa4b2af31, 0x3f23312a, 0xa59430c6, 0xa266c035, 0x4ebc3774, 0x82caa6fc, 0x90d0b0e0, 0xa7d81533, 0x04984af1, 0xecdaf741, 0xcd500e7f, 0x91f62f17, 0x4dd68d76, 0xefb04d43, 0xaa4d54cc, 0x9604dfe4, 0xd1b5e39e, 0x6a881b4c, 0x2c1fb8c1, 0x65517f46, 0x5eea049d, 0x8c355d01, 0x877473fa, 0x0b412efb, 0x671d5ab3, 0xdbd25292, 0x105633e9, 0xd647136d, 0xd7618c9a, 0xa10c7a37, 0xf8148e59, 0x133c89eb, 0xa927eece, 0x61c935b7, 0x1ce5ede1, 0x47b13c7a, 0xd2df599c, 0xf2733f55, 0x14ce7918, 0xc737bf73, 0xf7cdea53, 0xfdaa5b5f, 0x3d6f14df, 0x44db8678, 0xaff381ca, 0x68c43eb9, 0x24342c38, 0xa3405fc2, 0x1dc37216, 0xe2250cbc, 0x3c498b28, 0x0d9541ff, 0xa8017139, 0x0cb3de08, 0xb4e49cd8, 0x56c19064, 0xcb84617b, 0x32b670d5, 0x6c5c7448, 0xb85742d0];
|
||||||
|
|
||||||
|
// Transformations for decryption key expansion
|
||||||
|
var U1 = [0x00000000, 0x0e090d0b, 0x1c121a16, 0x121b171d, 0x3824342c, 0x362d3927, 0x24362e3a, 0x2a3f2331, 0x70486858, 0x7e416553, 0x6c5a724e, 0x62537f45, 0x486c5c74, 0x4665517f, 0x547e4662, 0x5a774b69, 0xe090d0b0, 0xee99ddbb, 0xfc82caa6, 0xf28bc7ad, 0xd8b4e49c, 0xd6bde997, 0xc4a6fe8a, 0xcaaff381, 0x90d8b8e8, 0x9ed1b5e3, 0x8ccaa2fe, 0x82c3aff5, 0xa8fc8cc4, 0xa6f581cf, 0xb4ee96d2, 0xbae79bd9, 0xdb3bbb7b, 0xd532b670, 0xc729a16d, 0xc920ac66, 0xe31f8f57, 0xed16825c, 0xff0d9541, 0xf104984a, 0xab73d323, 0xa57ade28, 0xb761c935, 0xb968c43e, 0x9357e70f, 0x9d5eea04, 0x8f45fd19, 0x814cf012, 0x3bab6bcb, 0x35a266c0, 0x27b971dd, 0x29b07cd6, 0x038f5fe7, 0x0d8652ec, 0x1f9d45f1, 0x119448fa, 0x4be30393, 0x45ea0e98, 0x57f11985, 0x59f8148e, 0x73c737bf, 0x7dce3ab4, 0x6fd52da9, 0x61dc20a2, 0xad766df6, 0xa37f60fd, 0xb16477e0, 0xbf6d7aeb, 0x955259da, 0x9b5b54d1, 0x894043cc, 0x87494ec7, 0xdd3e05ae, 0xd33708a5, 0xc12c1fb8, 0xcf2512b3, 0xe51a3182, 0xeb133c89, 0xf9082b94, 0xf701269f, 0x4de6bd46, 0x43efb04d, 0x51f4a750, 0x5ffdaa5b, 0x75c2896a, 0x7bcb8461, 0x69d0937c, 0x67d99e77, 0x3daed51e, 0x33a7d815, 0x21bccf08, 0x2fb5c203, 0x058ae132, 0x0b83ec39, 0x1998fb24, 0x1791f62f, 0x764dd68d, 0x7844db86, 0x6a5fcc9b, 0x6456c190, 0x4e69e2a1, 0x4060efaa, 0x527bf8b7, 0x5c72f5bc, 0x0605bed5, 0x080cb3de, 0x1a17a4c3, 0x141ea9c8, 0x3e218af9, 0x302887f2, 0x223390ef, 0x2c3a9de4, 0x96dd063d, 0x98d40b36, 0x8acf1c2b, 0x84c61120, 0xaef93211, 0xa0f03f1a, 0xb2eb2807, 0xbce2250c, 0xe6956e65, 0xe89c636e, 0xfa877473, 0xf48e7978, 0xdeb15a49, 0xd0b85742, 0xc2a3405f, 0xccaa4d54, 0x41ecdaf7, 0x4fe5d7fc, 0x5dfec0e1, 0x53f7cdea, 0x79c8eedb, 0x77c1e3d0, 0x65daf4cd, 0x6bd3f9c6, 0x31a4b2af, 0x3fadbfa4, 0x2db6a8b9, 0x23bfa5b2, 0x09808683, 0x07898b88, 0x15929c95, 0x1b9b919e, 0xa17c0a47, 0xaf75074c, 0xbd6e1051, 0xb3671d5a, 0x99583e6b, 0x97513360, 0x854a247d, 0x8b432976, 0xd134621f, 0xdf3d6f14, 0xcd267809, 0xc32f7502, 0xe9105633, 0xe7195b38, 0xf5024c25, 0xfb0b412e, 0x9ad7618c, 0x94de6c87, 0x86c57b9a, 0x88cc7691, 0xa2f355a0, 0xacfa58ab, 0xbee14fb6, 0xb0e842bd, 0xea9f09d4, 0xe49604df, 0xf68d13c2, 0xf8841ec9, 0xd2bb3df8, 0xdcb230f3, 0xcea927ee, 0xc0a02ae5, 0x7a47b13c, 0x744ebc37, 0x6655ab2a, 0x685ca621, 0x42638510, 0x4c6a881b, 0x5e719f06, 0x5078920d, 0x0a0fd964, 0x0406d46f, 0x161dc372, 0x1814ce79, 0x322bed48, 0x3c22e043, 0x2e39f75e, 0x2030fa55, 0xec9ab701, 0xe293ba0a, 0xf088ad17, 0xfe81a01c, 0xd4be832d, 0xdab78e26, 0xc8ac993b, 0xc6a59430, 0x9cd2df59, 0x92dbd252, 0x80c0c54f, 0x8ec9c844, 0xa4f6eb75, 0xaaffe67e, 0xb8e4f163, 0xb6edfc68, 0x0c0a67b1, 0x02036aba, 0x10187da7, 0x1e1170ac, 0x342e539d, 0x3a275e96, 0x283c498b, 0x26354480, 0x7c420fe9, 0x724b02e2, 0x605015ff, 0x6e5918f4, 0x44663bc5, 0x4a6f36ce, 0x587421d3, 0x567d2cd8, 0x37a10c7a, 0x39a80171, 0x2bb3166c, 0x25ba1b67, 0x0f853856, 0x018c355d, 0x13972240, 0x1d9e2f4b, 0x47e96422, 0x49e06929, 0x5bfb7e34, 0x55f2733f, 0x7fcd500e, 0x71c45d05, 0x63df4a18, 0x6dd64713, 0xd731dcca, 0xd938d1c1, 0xcb23c6dc, 0xc52acbd7, 0xef15e8e6, 0xe11ce5ed, 0xf307f2f0, 0xfd0efffb, 0xa779b492, 0xa970b999, 0xbb6bae84, 0xb562a38f, 0x9f5d80be, 0x91548db5, 0x834f9aa8, 0x8d4697a3];
|
||||||
|
var U2 = [0x00000000, 0x0b0e090d, 0x161c121a, 0x1d121b17, 0x2c382434, 0x27362d39, 0x3a24362e, 0x312a3f23, 0x58704868, 0x537e4165, 0x4e6c5a72, 0x4562537f, 0x74486c5c, 0x7f466551, 0x62547e46, 0x695a774b, 0xb0e090d0, 0xbbee99dd, 0xa6fc82ca, 0xadf28bc7, 0x9cd8b4e4, 0x97d6bde9, 0x8ac4a6fe, 0x81caaff3, 0xe890d8b8, 0xe39ed1b5, 0xfe8ccaa2, 0xf582c3af, 0xc4a8fc8c, 0xcfa6f581, 0xd2b4ee96, 0xd9bae79b, 0x7bdb3bbb, 0x70d532b6, 0x6dc729a1, 0x66c920ac, 0x57e31f8f, 0x5ced1682, 0x41ff0d95, 0x4af10498, 0x23ab73d3, 0x28a57ade, 0x35b761c9, 0x3eb968c4, 0x0f9357e7, 0x049d5eea, 0x198f45fd, 0x12814cf0, 0xcb3bab6b, 0xc035a266, 0xdd27b971, 0xd629b07c, 0xe7038f5f, 0xec0d8652, 0xf11f9d45, 0xfa119448, 0x934be303, 0x9845ea0e, 0x8557f119, 0x8e59f814, 0xbf73c737, 0xb47dce3a, 0xa96fd52d, 0xa261dc20, 0xf6ad766d, 0xfda37f60, 0xe0b16477, 0xebbf6d7a, 0xda955259, 0xd19b5b54, 0xcc894043, 0xc787494e, 0xaedd3e05, 0xa5d33708, 0xb8c12c1f, 0xb3cf2512, 0x82e51a31, 0x89eb133c, 0x94f9082b, 0x9ff70126, 0x464de6bd, 0x4d43efb0, 0x5051f4a7, 0x5b5ffdaa, 0x6a75c289, 0x617bcb84, 0x7c69d093, 0x7767d99e, 0x1e3daed5, 0x1533a7d8, 0x0821bccf, 0x032fb5c2, 0x32058ae1, 0x390b83ec, 0x241998fb, 0x2f1791f6, 0x8d764dd6, 0x867844db, 0x9b6a5fcc, 0x906456c1, 0xa14e69e2, 0xaa4060ef, 0xb7527bf8, 0xbc5c72f5, 0xd50605be, 0xde080cb3, 0xc31a17a4, 0xc8141ea9, 0xf93e218a, 0xf2302887, 0xef223390, 0xe42c3a9d, 0x3d96dd06, 0x3698d40b, 0x2b8acf1c, 0x2084c611, 0x11aef932, 0x1aa0f03f, 0x07b2eb28, 0x0cbce225, 0x65e6956e, 0x6ee89c63, 0x73fa8774, 0x78f48e79, 0x49deb15a, 0x42d0b857, 0x5fc2a340, 0x54ccaa4d, 0xf741ecda, 0xfc4fe5d7, 0xe15dfec0, 0xea53f7cd, 0xdb79c8ee, 0xd077c1e3, 0xcd65daf4, 0xc66bd3f9, 0xaf31a4b2, 0xa43fadbf, 0xb92db6a8, 0xb223bfa5, 0x83098086, 0x8807898b, 0x9515929c, 0x9e1b9b91, 0x47a17c0a, 0x4caf7507, 0x51bd6e10, 0x5ab3671d, 0x6b99583e, 0x60975133, 0x7d854a24, 0x768b4329, 0x1fd13462, 0x14df3d6f, 0x09cd2678, 0x02c32f75, 0x33e91056, 0x38e7195b, 0x25f5024c, 0x2efb0b41, 0x8c9ad761, 0x8794de6c, 0x9a86c57b, 0x9188cc76, 0xa0a2f355, 0xabacfa58, 0xb6bee14f, 0xbdb0e842, 0xd4ea9f09, 0xdfe49604, 0xc2f68d13, 0xc9f8841e, 0xf8d2bb3d, 0xf3dcb230, 0xeecea927, 0xe5c0a02a, 0x3c7a47b1, 0x37744ebc, 0x2a6655ab, 0x21685ca6, 0x10426385, 0x1b4c6a88, 0x065e719f, 0x0d507892, 0x640a0fd9, 0x6f0406d4, 0x72161dc3, 0x791814ce, 0x48322bed, 0x433c22e0, 0x5e2e39f7, 0x552030fa, 0x01ec9ab7, 0x0ae293ba, 0x17f088ad, 0x1cfe81a0, 0x2dd4be83, 0x26dab78e, 0x3bc8ac99, 0x30c6a594, 0x599cd2df, 0x5292dbd2, 0x4f80c0c5, 0x448ec9c8, 0x75a4f6eb, 0x7eaaffe6, 0x63b8e4f1, 0x68b6edfc, 0xb10c0a67, 0xba02036a, 0xa710187d, 0xac1e1170, 0x9d342e53, 0x963a275e, 0x8b283c49, 0x80263544, 0xe97c420f, 0xe2724b02, 0xff605015, 0xf46e5918, 0xc544663b, 0xce4a6f36, 0xd3587421, 0xd8567d2c, 0x7a37a10c, 0x7139a801, 0x6c2bb316, 0x6725ba1b, 0x560f8538, 0x5d018c35, 0x40139722, 0x4b1d9e2f, 0x2247e964, 0x2949e069, 0x345bfb7e, 0x3f55f273, 0x0e7fcd50, 0x0571c45d, 0x1863df4a, 0x136dd647, 0xcad731dc, 0xc1d938d1, 0xdccb23c6, 0xd7c52acb, 0xe6ef15e8, 0xede11ce5, 0xf0f307f2, 0xfbfd0eff, 0x92a779b4, 0x99a970b9, 0x84bb6bae, 0x8fb562a3, 0xbe9f5d80, 0xb591548d, 0xa8834f9a, 0xa38d4697];
|
||||||
|
var U3 = [0x00000000, 0x0d0b0e09, 0x1a161c12, 0x171d121b, 0x342c3824, 0x3927362d, 0x2e3a2436, 0x23312a3f, 0x68587048, 0x65537e41, 0x724e6c5a, 0x7f456253, 0x5c74486c, 0x517f4665, 0x4662547e, 0x4b695a77, 0xd0b0e090, 0xddbbee99, 0xcaa6fc82, 0xc7adf28b, 0xe49cd8b4, 0xe997d6bd, 0xfe8ac4a6, 0xf381caaf, 0xb8e890d8, 0xb5e39ed1, 0xa2fe8cca, 0xaff582c3, 0x8cc4a8fc, 0x81cfa6f5, 0x96d2b4ee, 0x9bd9bae7, 0xbb7bdb3b, 0xb670d532, 0xa16dc729, 0xac66c920, 0x8f57e31f, 0x825ced16, 0x9541ff0d, 0x984af104, 0xd323ab73, 0xde28a57a, 0xc935b761, 0xc43eb968, 0xe70f9357, 0xea049d5e, 0xfd198f45, 0xf012814c, 0x6bcb3bab, 0x66c035a2, 0x71dd27b9, 0x7cd629b0, 0x5fe7038f, 0x52ec0d86, 0x45f11f9d, 0x48fa1194, 0x03934be3, 0x0e9845ea, 0x198557f1, 0x148e59f8, 0x37bf73c7, 0x3ab47dce, 0x2da96fd5, 0x20a261dc, 0x6df6ad76, 0x60fda37f, 0x77e0b164, 0x7aebbf6d, 0x59da9552, 0x54d19b5b, 0x43cc8940, 0x4ec78749, 0x05aedd3e, 0x08a5d337, 0x1fb8c12c, 0x12b3cf25, 0x3182e51a, 0x3c89eb13, 0x2b94f908, 0x269ff701, 0xbd464de6, 0xb04d43ef, 0xa75051f4, 0xaa5b5ffd, 0x896a75c2, 0x84617bcb, 0x937c69d0, 0x9e7767d9, 0xd51e3dae, 0xd81533a7, 0xcf0821bc, 0xc2032fb5, 0xe132058a, 0xec390b83, 0xfb241998, 0xf62f1791, 0xd68d764d, 0xdb867844, 0xcc9b6a5f, 0xc1906456, 0xe2a14e69, 0xefaa4060, 0xf8b7527b, 0xf5bc5c72, 0xbed50605, 0xb3de080c, 0xa4c31a17, 0xa9c8141e, 0x8af93e21, 0x87f23028, 0x90ef2233, 0x9de42c3a, 0x063d96dd, 0x0b3698d4, 0x1c2b8acf, 0x112084c6, 0x3211aef9, 0x3f1aa0f0, 0x2807b2eb, 0x250cbce2, 0x6e65e695, 0x636ee89c, 0x7473fa87, 0x7978f48e, 0x5a49deb1, 0x5742d0b8, 0x405fc2a3, 0x4d54ccaa, 0xdaf741ec, 0xd7fc4fe5, 0xc0e15dfe, 0xcdea53f7, 0xeedb79c8, 0xe3d077c1, 0xf4cd65da, 0xf9c66bd3, 0xb2af31a4, 0xbfa43fad, 0xa8b92db6, 0xa5b223bf, 0x86830980, 0x8b880789, 0x9c951592, 0x919e1b9b, 0x0a47a17c, 0x074caf75, 0x1051bd6e, 0x1d5ab367, 0x3e6b9958, 0x33609751, 0x247d854a, 0x29768b43, 0x621fd134, 0x6f14df3d, 0x7809cd26, 0x7502c32f, 0x5633e910, 0x5b38e719, 0x4c25f502, 0x412efb0b, 0x618c9ad7, 0x6c8794de, 0x7b9a86c5, 0x769188cc, 0x55a0a2f3, 0x58abacfa, 0x4fb6bee1, 0x42bdb0e8, 0x09d4ea9f, 0x04dfe496, 0x13c2f68d, 0x1ec9f884, 0x3df8d2bb, 0x30f3dcb2, 0x27eecea9, 0x2ae5c0a0, 0xb13c7a47, 0xbc37744e, 0xab2a6655, 0xa621685c, 0x85104263, 0x881b4c6a, 0x9f065e71, 0x920d5078, 0xd9640a0f, 0xd46f0406, 0xc372161d, 0xce791814, 0xed48322b, 0xe0433c22, 0xf75e2e39, 0xfa552030, 0xb701ec9a, 0xba0ae293, 0xad17f088, 0xa01cfe81, 0x832dd4be, 0x8e26dab7, 0x993bc8ac, 0x9430c6a5, 0xdf599cd2, 0xd25292db, 0xc54f80c0, 0xc8448ec9, 0xeb75a4f6, 0xe67eaaff, 0xf163b8e4, 0xfc68b6ed, 0x67b10c0a, 0x6aba0203, 0x7da71018, 0x70ac1e11, 0x539d342e, 0x5e963a27, 0x498b283c, 0x44802635, 0x0fe97c42, 0x02e2724b, 0x15ff6050, 0x18f46e59, 0x3bc54466, 0x36ce4a6f, 0x21d35874, 0x2cd8567d, 0x0c7a37a1, 0x017139a8, 0x166c2bb3, 0x1b6725ba, 0x38560f85, 0x355d018c, 0x22401397, 0x2f4b1d9e, 0x642247e9, 0x692949e0, 0x7e345bfb, 0x733f55f2, 0x500e7fcd, 0x5d0571c4, 0x4a1863df, 0x47136dd6, 0xdccad731, 0xd1c1d938, 0xc6dccb23, 0xcbd7c52a, 0xe8e6ef15, 0xe5ede11c, 0xf2f0f307, 0xfffbfd0e, 0xb492a779, 0xb999a970, 0xae84bb6b, 0xa38fb562, 0x80be9f5d, 0x8db59154, 0x9aa8834f, 0x97a38d46];
|
||||||
|
var U4 = [0x00000000, 0x090d0b0e, 0x121a161c, 0x1b171d12, 0x24342c38, 0x2d392736, 0x362e3a24, 0x3f23312a, 0x48685870, 0x4165537e, 0x5a724e6c, 0x537f4562, 0x6c5c7448, 0x65517f46, 0x7e466254, 0x774b695a, 0x90d0b0e0, 0x99ddbbee, 0x82caa6fc, 0x8bc7adf2, 0xb4e49cd8, 0xbde997d6, 0xa6fe8ac4, 0xaff381ca, 0xd8b8e890, 0xd1b5e39e, 0xcaa2fe8c, 0xc3aff582, 0xfc8cc4a8, 0xf581cfa6, 0xee96d2b4, 0xe79bd9ba, 0x3bbb7bdb, 0x32b670d5, 0x29a16dc7, 0x20ac66c9, 0x1f8f57e3, 0x16825ced, 0x0d9541ff, 0x04984af1, 0x73d323ab, 0x7ade28a5, 0x61c935b7, 0x68c43eb9, 0x57e70f93, 0x5eea049d, 0x45fd198f, 0x4cf01281, 0xab6bcb3b, 0xa266c035, 0xb971dd27, 0xb07cd629, 0x8f5fe703, 0x8652ec0d, 0x9d45f11f, 0x9448fa11, 0xe303934b, 0xea0e9845, 0xf1198557, 0xf8148e59, 0xc737bf73, 0xce3ab47d, 0xd52da96f, 0xdc20a261, 0x766df6ad, 0x7f60fda3, 0x6477e0b1, 0x6d7aebbf, 0x5259da95, 0x5b54d19b, 0x4043cc89, 0x494ec787, 0x3e05aedd, 0x3708a5d3, 0x2c1fb8c1, 0x2512b3cf, 0x1a3182e5, 0x133c89eb, 0x082b94f9, 0x01269ff7, 0xe6bd464d, 0xefb04d43, 0xf4a75051, 0xfdaa5b5f, 0xc2896a75, 0xcb84617b, 0xd0937c69, 0xd99e7767, 0xaed51e3d, 0xa7d81533, 0xbccf0821, 0xb5c2032f, 0x8ae13205, 0x83ec390b, 0x98fb2419, 0x91f62f17, 0x4dd68d76, 0x44db8678, 0x5fcc9b6a, 0x56c19064, 0x69e2a14e, 0x60efaa40, 0x7bf8b752, 0x72f5bc5c, 0x05bed506, 0x0cb3de08, 0x17a4c31a, 0x1ea9c814, 0x218af93e, 0x2887f230, 0x3390ef22, 0x3a9de42c, 0xdd063d96, 0xd40b3698, 0xcf1c2b8a, 0xc6112084, 0xf93211ae, 0xf03f1aa0, 0xeb2807b2, 0xe2250cbc, 0x956e65e6, 0x9c636ee8, 0x877473fa, 0x8e7978f4, 0xb15a49de, 0xb85742d0, 0xa3405fc2, 0xaa4d54cc, 0xecdaf741, 0xe5d7fc4f, 0xfec0e15d, 0xf7cdea53, 0xc8eedb79, 0xc1e3d077, 0xdaf4cd65, 0xd3f9c66b, 0xa4b2af31, 0xadbfa43f, 0xb6a8b92d, 0xbfa5b223, 0x80868309, 0x898b8807, 0x929c9515, 0x9b919e1b, 0x7c0a47a1, 0x75074caf, 0x6e1051bd, 0x671d5ab3, 0x583e6b99, 0x51336097, 0x4a247d85, 0x4329768b, 0x34621fd1, 0x3d6f14df, 0x267809cd, 0x2f7502c3, 0x105633e9, 0x195b38e7, 0x024c25f5, 0x0b412efb, 0xd7618c9a, 0xde6c8794, 0xc57b9a86, 0xcc769188, 0xf355a0a2, 0xfa58abac, 0xe14fb6be, 0xe842bdb0, 0x9f09d4ea, 0x9604dfe4, 0x8d13c2f6, 0x841ec9f8, 0xbb3df8d2, 0xb230f3dc, 0xa927eece, 0xa02ae5c0, 0x47b13c7a, 0x4ebc3774, 0x55ab2a66, 0x5ca62168, 0x63851042, 0x6a881b4c, 0x719f065e, 0x78920d50, 0x0fd9640a, 0x06d46f04, 0x1dc37216, 0x14ce7918, 0x2bed4832, 0x22e0433c, 0x39f75e2e, 0x30fa5520, 0x9ab701ec, 0x93ba0ae2, 0x88ad17f0, 0x81a01cfe, 0xbe832dd4, 0xb78e26da, 0xac993bc8, 0xa59430c6, 0xd2df599c, 0xdbd25292, 0xc0c54f80, 0xc9c8448e, 0xf6eb75a4, 0xffe67eaa, 0xe4f163b8, 0xedfc68b6, 0x0a67b10c, 0x036aba02, 0x187da710, 0x1170ac1e, 0x2e539d34, 0x275e963a, 0x3c498b28, 0x35448026, 0x420fe97c, 0x4b02e272, 0x5015ff60, 0x5918f46e, 0x663bc544, 0x6f36ce4a, 0x7421d358, 0x7d2cd856, 0xa10c7a37, 0xa8017139, 0xb3166c2b, 0xba1b6725, 0x8538560f, 0x8c355d01, 0x97224013, 0x9e2f4b1d, 0xe9642247, 0xe0692949, 0xfb7e345b, 0xf2733f55, 0xcd500e7f, 0xc45d0571, 0xdf4a1863, 0xd647136d, 0x31dccad7, 0x38d1c1d9, 0x23c6dccb, 0x2acbd7c5, 0x15e8e6ef, 0x1ce5ede1, 0x07f2f0f3, 0x0efffbfd, 0x79b492a7, 0x70b999a9, 0x6bae84bb, 0x62a38fb5, 0x5d80be9f, 0x548db591, 0x4f9aa883, 0x4697a38d];
|
||||||
|
|
||||||
|
function convertToInt32(bytes) {
|
||||||
|
var result = [];
|
||||||
|
for (var i = 0; i < bytes.length; i += 4) {
|
||||||
|
result.push(
|
||||||
|
(bytes[i] << 24) |
|
||||||
|
(bytes[i + 1] << 16) |
|
||||||
|
(bytes[i + 2] << 8) |
|
||||||
|
bytes[i + 3]
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
var AES = function (key) {
|
||||||
|
if (!(this instanceof AES)) {
|
||||||
|
throw Error('AES must be instanitated with `new`');
|
||||||
|
}
|
||||||
|
|
||||||
|
Object.defineProperty(this, 'key', {
|
||||||
|
value: coerceArray(key, true)
|
||||||
|
});
|
||||||
|
|
||||||
|
this._prepare();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
AES.prototype._prepare = function () {
|
||||||
|
|
||||||
|
var rounds = numberOfRounds[this.key.length];
|
||||||
|
if (rounds == null) {
|
||||||
|
throw new Error('invalid key size (must be 16, 24 or 32 bytes)');
|
||||||
|
}
|
||||||
|
|
||||||
|
// encryption round keys
|
||||||
|
this._Ke = [];
|
||||||
|
|
||||||
|
// decryption round keys
|
||||||
|
this._Kd = [];
|
||||||
|
|
||||||
|
for (var i = 0; i <= rounds; i++) {
|
||||||
|
this._Ke.push([0, 0, 0, 0]);
|
||||||
|
this._Kd.push([0, 0, 0, 0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
var roundKeyCount = (rounds + 1) * 4;
|
||||||
|
var KC = this.key.length / 4;
|
||||||
|
|
||||||
|
// convert the key into ints
|
||||||
|
var tk = convertToInt32(this.key);
|
||||||
|
|
||||||
|
// copy values into round key arrays
|
||||||
|
var index;
|
||||||
|
for (var i = 0; i < KC; i++) {
|
||||||
|
index = i >> 2;
|
||||||
|
this._Ke[index][i % 4] = tk[i];
|
||||||
|
this._Kd[rounds - index][i % 4] = tk[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
// key expansion (fips-197 section 5.2)
|
||||||
|
var rconpointer = 0;
|
||||||
|
var t = KC, tt;
|
||||||
|
while (t < roundKeyCount) {
|
||||||
|
tt = tk[KC - 1];
|
||||||
|
tk[0] ^= ((S[(tt >> 16) & 0xFF] << 24) ^
|
||||||
|
(S[(tt >> 8) & 0xFF] << 16) ^
|
||||||
|
(S[tt & 0xFF] << 8) ^
|
||||||
|
S[(tt >> 24) & 0xFF] ^
|
||||||
|
(rcon[rconpointer] << 24));
|
||||||
|
rconpointer += 1;
|
||||||
|
|
||||||
|
// key expansion (for non-256 bit)
|
||||||
|
if (KC != 8) {
|
||||||
|
for (var i = 1; i < KC; i++) {
|
||||||
|
tk[i] ^= tk[i - 1];
|
||||||
|
}
|
||||||
|
|
||||||
|
// key expansion for 256-bit keys is "slightly different" (fips-197)
|
||||||
|
} else {
|
||||||
|
for (var i = 1; i < (KC / 2); i++) {
|
||||||
|
tk[i] ^= tk[i - 1];
|
||||||
|
}
|
||||||
|
tt = tk[(KC / 2) - 1];
|
||||||
|
|
||||||
|
tk[KC / 2] ^= (S[tt & 0xFF] ^
|
||||||
|
(S[(tt >> 8) & 0xFF] << 8) ^
|
||||||
|
(S[(tt >> 16) & 0xFF] << 16) ^
|
||||||
|
(S[(tt >> 24) & 0xFF] << 24));
|
||||||
|
|
||||||
|
for (var i = (KC / 2) + 1; i < KC; i++) {
|
||||||
|
tk[i] ^= tk[i - 1];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// copy values into round key arrays
|
||||||
|
var i = 0, r, c;
|
||||||
|
while (i < KC && t < roundKeyCount) {
|
||||||
|
r = t >> 2;
|
||||||
|
c = t % 4;
|
||||||
|
this._Ke[r][c] = tk[i];
|
||||||
|
this._Kd[rounds - r][c] = tk[i++];
|
||||||
|
t++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// inverse-cipher-ify the decryption round key (fips-197 section 5.3)
|
||||||
|
for (var r = 1; r < rounds; r++) {
|
||||||
|
for (var c = 0; c < 4; c++) {
|
||||||
|
tt = this._Kd[r][c];
|
||||||
|
this._Kd[r][c] = (U1[(tt >> 24) & 0xFF] ^
|
||||||
|
U2[(tt >> 16) & 0xFF] ^
|
||||||
|
U3[(tt >> 8) & 0xFF] ^
|
||||||
|
U4[tt & 0xFF]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
AES.prototype.encrypt = function (plaintext) {
|
||||||
|
if (plaintext.length != 16) {
|
||||||
|
throw new Error('invalid plaintext size (must be 16 bytes)');
|
||||||
|
}
|
||||||
|
|
||||||
|
var rounds = this._Ke.length - 1;
|
||||||
|
var a = [0, 0, 0, 0];
|
||||||
|
|
||||||
|
// convert plaintext to (ints ^ key)
|
||||||
|
var t = convertToInt32(plaintext);
|
||||||
|
for (var i = 0; i < 4; i++) {
|
||||||
|
t[i] ^= this._Ke[0][i];
|
||||||
|
}
|
||||||
|
|
||||||
|
// apply round transforms
|
||||||
|
for (var r = 1; r < rounds; r++) {
|
||||||
|
for (var i = 0; i < 4; i++) {
|
||||||
|
a[i] = (T1[(t[i] >> 24) & 0xff] ^
|
||||||
|
T2[(t[(i + 1) % 4] >> 16) & 0xff] ^
|
||||||
|
T3[(t[(i + 2) % 4] >> 8) & 0xff] ^
|
||||||
|
T4[t[(i + 3) % 4] & 0xff] ^
|
||||||
|
this._Ke[r][i]);
|
||||||
|
}
|
||||||
|
t = a.slice();
|
||||||
|
}
|
||||||
|
|
||||||
|
// the last round is special
|
||||||
|
var result = createArray(16), tt;
|
||||||
|
for (var i = 0; i < 4; i++) {
|
||||||
|
tt = this._Ke[rounds][i];
|
||||||
|
result[4 * i] = (S[(t[i] >> 24) & 0xff] ^ (tt >> 24)) & 0xff;
|
||||||
|
result[4 * i + 1] = (S[(t[(i + 1) % 4] >> 16) & 0xff] ^ (tt >> 16)) & 0xff;
|
||||||
|
result[4 * i + 2] = (S[(t[(i + 2) % 4] >> 8) & 0xff] ^ (tt >> 8)) & 0xff;
|
||||||
|
result[4 * i + 3] = (S[t[(i + 3) % 4] & 0xff] ^ tt) & 0xff;
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
AES.prototype.decrypt = function (ciphertext) {
|
||||||
|
if (ciphertext.length != 16) {
|
||||||
|
throw new Error('invalid ciphertext size (must be 16 bytes)');
|
||||||
|
}
|
||||||
|
|
||||||
|
var rounds = this._Kd.length - 1;
|
||||||
|
var a = [0, 0, 0, 0];
|
||||||
|
|
||||||
|
// convert plaintext to (ints ^ key)
|
||||||
|
var t = convertToInt32(ciphertext);
|
||||||
|
for (var i = 0; i < 4; i++) {
|
||||||
|
t[i] ^= this._Kd[0][i];
|
||||||
|
}
|
||||||
|
|
||||||
|
// apply round transforms
|
||||||
|
for (var r = 1; r < rounds; r++) {
|
||||||
|
for (var i = 0; i < 4; i++) {
|
||||||
|
a[i] = (T5[(t[i] >> 24) & 0xff] ^
|
||||||
|
T6[(t[(i + 3) % 4] >> 16) & 0xff] ^
|
||||||
|
T7[(t[(i + 2) % 4] >> 8) & 0xff] ^
|
||||||
|
T8[t[(i + 1) % 4] & 0xff] ^
|
||||||
|
this._Kd[r][i]);
|
||||||
|
}
|
||||||
|
t = a.slice();
|
||||||
|
}
|
||||||
|
|
||||||
|
// the last round is special
|
||||||
|
var result = createArray(16), tt;
|
||||||
|
for (var i = 0; i < 4; i++) {
|
||||||
|
tt = this._Kd[rounds][i];
|
||||||
|
result[4 * i] = (Si[(t[i] >> 24) & 0xff] ^ (tt >> 24)) & 0xff;
|
||||||
|
result[4 * i + 1] = (Si[(t[(i + 3) % 4] >> 16) & 0xff] ^ (tt >> 16)) & 0xff;
|
||||||
|
result[4 * i + 2] = (Si[(t[(i + 2) % 4] >> 8) & 0xff] ^ (tt >> 8)) & 0xff;
|
||||||
|
result[4 * i + 3] = (Si[t[(i + 1) % 4] & 0xff] ^ tt) & 0xff;
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Mode Of Operation - Electonic Codebook (ECB)
|
||||||
|
*/
|
||||||
|
var ModeOfOperationECB = function (key) {
|
||||||
|
if (!(this instanceof ModeOfOperationECB)) {
|
||||||
|
throw Error('AES must be instanitated with `new`');
|
||||||
|
}
|
||||||
|
|
||||||
|
this.description = "Electronic Code Block";
|
||||||
|
this.name = "ecb";
|
||||||
|
|
||||||
|
this._aes = new AES(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
ModeOfOperationECB.prototype.encrypt = function (plaintext) {
|
||||||
|
plaintext = coerceArray(plaintext);
|
||||||
|
|
||||||
|
if ((plaintext.length % 16) !== 0) {
|
||||||
|
throw new Error('invalid plaintext size (must be multiple of 16 bytes)');
|
||||||
|
}
|
||||||
|
|
||||||
|
var ciphertext = createArray(plaintext.length);
|
||||||
|
var block = createArray(16);
|
||||||
|
|
||||||
|
for (var i = 0; i < plaintext.length; i += 16) {
|
||||||
|
copyArray(plaintext, block, 0, i, i + 16);
|
||||||
|
block = this._aes.encrypt(block);
|
||||||
|
copyArray(block, ciphertext, i);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ciphertext;
|
||||||
|
}
|
||||||
|
|
||||||
|
ModeOfOperationECB.prototype.decrypt = function (ciphertext) {
|
||||||
|
ciphertext = coerceArray(ciphertext);
|
||||||
|
|
||||||
|
if ((ciphertext.length % 16) !== 0) {
|
||||||
|
throw new Error('invalid ciphertext size (must be multiple of 16 bytes)');
|
||||||
|
}
|
||||||
|
|
||||||
|
var plaintext = createArray(ciphertext.length);
|
||||||
|
var block = createArray(16);
|
||||||
|
|
||||||
|
for (var i = 0; i < ciphertext.length; i += 16) {
|
||||||
|
copyArray(ciphertext, block, 0, i, i + 16);
|
||||||
|
block = this._aes.decrypt(block);
|
||||||
|
copyArray(block, plaintext, i);
|
||||||
|
}
|
||||||
|
|
||||||
|
return plaintext;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Mode Of Operation - Cipher Block Chaining (CBC)
|
||||||
|
*/
|
||||||
|
var ModeOfOperationCBC = function (key, iv) {
|
||||||
|
if (!(this instanceof ModeOfOperationCBC)) {
|
||||||
|
throw Error('AES must be instanitated with `new`');
|
||||||
|
}
|
||||||
|
|
||||||
|
this.description = "Cipher Block Chaining";
|
||||||
|
this.name = "cbc";
|
||||||
|
|
||||||
|
if (!iv) {
|
||||||
|
iv = createArray(16);
|
||||||
|
|
||||||
|
} else if (iv.length != 16) {
|
||||||
|
throw new Error('invalid initialation vector size (must be 16 bytes)');
|
||||||
|
}
|
||||||
|
|
||||||
|
this._lastCipherblock = coerceArray(iv, true);
|
||||||
|
|
||||||
|
this._aes = new AES(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
ModeOfOperationCBC.prototype.encrypt = function (plaintext) {
|
||||||
|
plaintext = coerceArray(plaintext);
|
||||||
|
|
||||||
|
if ((plaintext.length % 16) !== 0) {
|
||||||
|
throw new Error('invalid plaintext size (must be multiple of 16 bytes)');
|
||||||
|
}
|
||||||
|
|
||||||
|
var ciphertext = createArray(plaintext.length);
|
||||||
|
var block = createArray(16);
|
||||||
|
|
||||||
|
for (var i = 0; i < plaintext.length; i += 16) {
|
||||||
|
copyArray(plaintext, block, 0, i, i + 16);
|
||||||
|
|
||||||
|
for (var j = 0; j < 16; j++) {
|
||||||
|
block[j] ^= this._lastCipherblock[j];
|
||||||
|
}
|
||||||
|
|
||||||
|
this._lastCipherblock = this._aes.encrypt(block);
|
||||||
|
copyArray(this._lastCipherblock, ciphertext, i);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ciphertext;
|
||||||
|
}
|
||||||
|
|
||||||
|
ModeOfOperationCBC.prototype.decrypt = function (ciphertext) {
|
||||||
|
ciphertext = coerceArray(ciphertext);
|
||||||
|
|
||||||
|
if ((ciphertext.length % 16) !== 0) {
|
||||||
|
throw new Error('invalid ciphertext size (must be multiple of 16 bytes)');
|
||||||
|
}
|
||||||
|
|
||||||
|
var plaintext = createArray(ciphertext.length);
|
||||||
|
var block = createArray(16);
|
||||||
|
|
||||||
|
for (var i = 0; i < ciphertext.length; i += 16) {
|
||||||
|
copyArray(ciphertext, block, 0, i, i + 16);
|
||||||
|
block = this._aes.decrypt(block);
|
||||||
|
|
||||||
|
for (var j = 0; j < 16; j++) {
|
||||||
|
plaintext[i + j] = block[j] ^ this._lastCipherblock[j];
|
||||||
|
}
|
||||||
|
|
||||||
|
copyArray(ciphertext, this._lastCipherblock, 0, i, i + 16);
|
||||||
|
}
|
||||||
|
|
||||||
|
return plaintext;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Mode Of Operation - Cipher Feedback (CFB)
|
||||||
|
*/
|
||||||
|
var ModeOfOperationCFB = function (key, iv, segmentSize) {
|
||||||
|
if (!(this instanceof ModeOfOperationCFB)) {
|
||||||
|
throw Error('AES must be instanitated with `new`');
|
||||||
|
}
|
||||||
|
|
||||||
|
this.description = "Cipher Feedback";
|
||||||
|
this.name = "cfb";
|
||||||
|
|
||||||
|
if (!iv) {
|
||||||
|
iv = createArray(16);
|
||||||
|
|
||||||
|
} else if (iv.length != 16) {
|
||||||
|
throw new Error('invalid initialation vector size (must be 16 size)');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!segmentSize) { segmentSize = 1; }
|
||||||
|
|
||||||
|
this.segmentSize = segmentSize;
|
||||||
|
|
||||||
|
this._shiftRegister = coerceArray(iv, true);
|
||||||
|
|
||||||
|
this._aes = new AES(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
ModeOfOperationCFB.prototype.encrypt = function (plaintext) {
|
||||||
|
if ((plaintext.length % this.segmentSize) != 0) {
|
||||||
|
throw new Error('invalid plaintext size (must be segmentSize bytes)');
|
||||||
|
}
|
||||||
|
|
||||||
|
var encrypted = coerceArray(plaintext, true);
|
||||||
|
|
||||||
|
var xorSegment;
|
||||||
|
for (var i = 0; i < encrypted.length; i += this.segmentSize) {
|
||||||
|
xorSegment = this._aes.encrypt(this._shiftRegister);
|
||||||
|
for (var j = 0; j < this.segmentSize; j++) {
|
||||||
|
encrypted[i + j] ^= xorSegment[j];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Shift the register
|
||||||
|
copyArray(this._shiftRegister, this._shiftRegister, 0, this.segmentSize);
|
||||||
|
copyArray(encrypted, this._shiftRegister, 16 - this.segmentSize, i, i + this.segmentSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
return encrypted;
|
||||||
|
}
|
||||||
|
|
||||||
|
ModeOfOperationCFB.prototype.decrypt = function (ciphertext) {
|
||||||
|
if ((ciphertext.length % this.segmentSize) != 0) {
|
||||||
|
throw new Error('invalid ciphertext size (must be segmentSize bytes)');
|
||||||
|
}
|
||||||
|
|
||||||
|
var plaintext = coerceArray(ciphertext, true);
|
||||||
|
|
||||||
|
var xorSegment;
|
||||||
|
for (var i = 0; i < plaintext.length; i += this.segmentSize) {
|
||||||
|
xorSegment = this._aes.encrypt(this._shiftRegister);
|
||||||
|
|
||||||
|
for (var j = 0; j < this.segmentSize; j++) {
|
||||||
|
plaintext[i + j] ^= xorSegment[j];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Shift the register
|
||||||
|
copyArray(this._shiftRegister, this._shiftRegister, 0, this.segmentSize);
|
||||||
|
copyArray(ciphertext, this._shiftRegister, 16 - this.segmentSize, i, i + this.segmentSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
return plaintext;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Mode Of Operation - Output Feedback (OFB)
|
||||||
|
*/
|
||||||
|
var ModeOfOperationOFB = function (key, iv) {
|
||||||
|
if (!(this instanceof ModeOfOperationOFB)) {
|
||||||
|
throw Error('AES must be instanitated with `new`');
|
||||||
|
}
|
||||||
|
|
||||||
|
this.description = "Output Feedback";
|
||||||
|
this.name = "ofb";
|
||||||
|
|
||||||
|
if (!iv) {
|
||||||
|
iv = createArray(16);
|
||||||
|
|
||||||
|
} else if (iv.length != 16) {
|
||||||
|
throw new Error('invalid initialation vector size (must be 16 bytes)');
|
||||||
|
}
|
||||||
|
|
||||||
|
this._lastPrecipher = coerceArray(iv, true);
|
||||||
|
this._lastPrecipherIndex = 16;
|
||||||
|
|
||||||
|
this._aes = new AES(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
ModeOfOperationOFB.prototype.encrypt = function (plaintext) {
|
||||||
|
var encrypted = coerceArray(plaintext, true);
|
||||||
|
|
||||||
|
for (var i = 0; i < encrypted.length; i++) {
|
||||||
|
if (this._lastPrecipherIndex === 16) {
|
||||||
|
this._lastPrecipher = this._aes.encrypt(this._lastPrecipher);
|
||||||
|
this._lastPrecipherIndex = 0;
|
||||||
|
}
|
||||||
|
encrypted[i] ^= this._lastPrecipher[this._lastPrecipherIndex++];
|
||||||
|
}
|
||||||
|
|
||||||
|
return encrypted;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Decryption is symetric
|
||||||
|
ModeOfOperationOFB.prototype.decrypt = ModeOfOperationOFB.prototype.encrypt;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Counter object for CTR common mode of operation
|
||||||
|
*/
|
||||||
|
var Counter = function (initialValue) {
|
||||||
|
if (!(this instanceof Counter)) {
|
||||||
|
throw Error('Counter must be instanitated with `new`');
|
||||||
|
}
|
||||||
|
|
||||||
|
// We allow 0, but anything false-ish uses the default 1
|
||||||
|
if (initialValue !== 0 && !initialValue) { initialValue = 1; }
|
||||||
|
|
||||||
|
if (typeof (initialValue) === 'number') {
|
||||||
|
this._counter = createArray(16);
|
||||||
|
this.setValue(initialValue);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
this.setBytes(initialValue);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Counter.prototype.setValue = function (value) {
|
||||||
|
if (typeof (value) !== 'number' || parseInt(value) != value) {
|
||||||
|
throw new Error('invalid counter value (must be an integer)');
|
||||||
|
}
|
||||||
|
|
||||||
|
// We cannot safely handle numbers beyond the safe range for integers
|
||||||
|
if (value > Number.MAX_SAFE_INTEGER) {
|
||||||
|
throw new Error('integer value out of safe range');
|
||||||
|
}
|
||||||
|
|
||||||
|
for (var index = 15; index >= 0; --index) {
|
||||||
|
this._counter[index] = value % 256;
|
||||||
|
value = parseInt(value / 256);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Counter.prototype.setBytes = function (bytes) {
|
||||||
|
bytes = coerceArray(bytes, true);
|
||||||
|
|
||||||
|
if (bytes.length != 16) {
|
||||||
|
throw new Error('invalid counter bytes size (must be 16 bytes)');
|
||||||
|
}
|
||||||
|
|
||||||
|
this._counter = bytes;
|
||||||
|
};
|
||||||
|
|
||||||
|
Counter.prototype.increment = function () {
|
||||||
|
for (var i = 15; i >= 0; i--) {
|
||||||
|
if (this._counter[i] === 255) {
|
||||||
|
this._counter[i] = 0;
|
||||||
|
} else {
|
||||||
|
this._counter[i]++;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Mode Of Operation - Counter (CTR)
|
||||||
|
*/
|
||||||
|
var ModeOfOperationCTR = function (key, counter) {
|
||||||
|
if (!(this instanceof ModeOfOperationCTR)) {
|
||||||
|
throw Error('AES must be instanitated with `new`');
|
||||||
|
}
|
||||||
|
|
||||||
|
this.description = "Counter";
|
||||||
|
this.name = "ctr";
|
||||||
|
|
||||||
|
if (!(counter instanceof Counter)) {
|
||||||
|
counter = new Counter(counter)
|
||||||
|
}
|
||||||
|
|
||||||
|
this._counter = counter;
|
||||||
|
|
||||||
|
this._remainingCounter = null;
|
||||||
|
this._remainingCounterIndex = 16;
|
||||||
|
|
||||||
|
this._aes = new AES(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
ModeOfOperationCTR.prototype.encrypt = function (plaintext) {
|
||||||
|
var encrypted = coerceArray(plaintext, true);
|
||||||
|
|
||||||
|
for (var i = 0; i < encrypted.length; i++) {
|
||||||
|
if (this._remainingCounterIndex === 16) {
|
||||||
|
this._remainingCounter = this._aes.encrypt(this._counter._counter);
|
||||||
|
this._remainingCounterIndex = 0;
|
||||||
|
this._counter.increment();
|
||||||
|
}
|
||||||
|
encrypted[i] ^= this._remainingCounter[this._remainingCounterIndex++];
|
||||||
|
}
|
||||||
|
|
||||||
|
return encrypted;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Decryption is symetric
|
||||||
|
ModeOfOperationCTR.prototype.decrypt = ModeOfOperationCTR.prototype.encrypt;
|
||||||
|
|
||||||
|
|
||||||
|
///////////////////////
|
||||||
|
// Padding
|
||||||
|
|
||||||
|
// See:https://tools.ietf.org/html/rfc2315
|
||||||
|
function pkcs7pad(data) {
|
||||||
|
data = coerceArray(data, true);
|
||||||
|
var padder = 16 - (data.length % 16);
|
||||||
|
var result = createArray(data.length + padder);
|
||||||
|
copyArray(data, result);
|
||||||
|
for (var i = data.length; i < result.length; i++) {
|
||||||
|
result[i] = padder;
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
function pkcs7strip(data) {
|
||||||
|
data = coerceArray(data, true);
|
||||||
|
if (data.length < 16) { throw new Error('PKCS#7 invalid length'); }
|
||||||
|
|
||||||
|
var padder = data[data.length - 1];
|
||||||
|
if (padder > 16) { throw new Error('PKCS#7 padding byte out of range'); }
|
||||||
|
|
||||||
|
var length = data.length - padder;
|
||||||
|
for (var i = 0; i < padder; i++) {
|
||||||
|
if (data[length + i] !== padder) {
|
||||||
|
throw new Error('PKCS#7 invalid padding byte');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var result = createArray(length);
|
||||||
|
copyArray(data, result, 0, 0, length);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////
|
||||||
|
// Exporting
|
||||||
|
|
||||||
|
|
||||||
|
// The block cipher
|
||||||
|
var aesjs = {
|
||||||
|
AES: AES,
|
||||||
|
Counter: Counter,
|
||||||
|
|
||||||
|
ModeOfOperation: {
|
||||||
|
ecb: ModeOfOperationECB,
|
||||||
|
cbc: ModeOfOperationCBC,
|
||||||
|
cfb: ModeOfOperationCFB,
|
||||||
|
ofb: ModeOfOperationOFB,
|
||||||
|
ctr: ModeOfOperationCTR
|
||||||
|
},
|
||||||
|
|
||||||
|
utils: {
|
||||||
|
hex: convertHex,
|
||||||
|
utf8: convertUtf8
|
||||||
|
},
|
||||||
|
|
||||||
|
padding: {
|
||||||
|
pkcs7: {
|
||||||
|
pad: pkcs7pad,
|
||||||
|
strip: pkcs7strip
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
_arrayTest: {
|
||||||
|
coerceArray: coerceArray,
|
||||||
|
createArray: createArray,
|
||||||
|
copyArray: copyArray,
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// node.js
|
||||||
|
if (typeof exports !== 'undefined') {
|
||||||
|
module.exports = aesjs
|
||||||
|
|
||||||
|
// RequireJS/AMD
|
||||||
|
// http://www.requirejs.org/docs/api.html
|
||||||
|
// https://github.com/amdjs/amdjs-api/wiki/AMD
|
||||||
|
} else if (typeof (define) === 'function' && define.amd) {
|
||||||
|
define(aesjs);
|
||||||
|
|
||||||
|
// Web Browsers
|
||||||
|
} else {
|
||||||
|
|
||||||
|
// If there was an existing library at "aesjs" make sure it's still available
|
||||||
|
if (root.aesjs) {
|
||||||
|
aesjs._aesjs = root.aesjs;
|
||||||
|
}
|
||||||
|
|
||||||
|
root.aesjs = aesjs;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
})(this);
|
1
public/js/libs/biginteger.min.js
vendored
Normal file
1
public/js/libs/biginteger.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
7
public/js/libs/bootstrap.bundle.min.js
vendored
Normal file
7
public/js/libs/bootstrap.bundle.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
public/js/libs/bootstrap.bundle.min.js.map
Normal file
1
public/js/libs/bootstrap.bundle.min.js.map
Normal file
File diff suppressed because one or more lines are too long
6
public/js/libs/cmac.min.js
vendored
Normal file
6
public/js/libs/cmac.min.js
vendored
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
/*
|
||||||
|
* The MIT License
|
||||||
|
*
|
||||||
|
* (MIT)Copyright (c) 2015 artjomb
|
||||||
|
*/
|
||||||
|
!function(t){var r;r=t.hasOwnProperty("ext")?t.ext:t.ext={},r.bitshift=function(t,r){var e,s,n=0,o=t.words,i=0;if(r>0){for(;r>31;)o.splice(0,1),o.push(0),r-=32,i++;if(0==r)return n;for(var a=o.length-i-1;a>=0;a--)e=o[a],o[a]<<=r,o[a]|=n,n=e>>>32-r}else if(0>r){for(;-31>r;)o.splice(0,0,0),o.length--,r+=32,i++;if(0==r)return n;r=-r,s=(1<<r)-1;for(var a=i;a<o.length;a++)e=o[a]&s,o[a]>>>=r,o[a]|=n,n=e<<32-r}return n},r.neg=function(t){for(var r=t.words,e=0;e<r.length;e++)r[e]=~r[e];return t},r.xor=function(t,r){for(var e=0;e<t.words.length;e++)t.words[e]^=r.words[e];return t},r.bitand=function(t,r){for(var e=t.clone(),s=e.words,n=r.words,o=0;o<s.length;o++)s[o]&=n[o];return e}}(CryptoJS),function(t){var r;r=t.hasOwnProperty("ext")?t.ext:t.ext={};{var e=(t.lib.Base,t.lib.WordArray);t.algo.AES}r.const_Zero=e.create([0,0,0,0]),r.const_One=e.create([0,0,0,1]),r.const_Rb=e.create([0,0,0,135]),r.const_Rb_Shifted=e.create([2147483648,0,0,67]),r.const_nonMSB=e.create([4294967295,4294967295,2147483647,2147483647]),r.isWordArray=function(t){return t&&"function"==typeof t.clamp&&"function"==typeof t.concat&&"array"==typeof t.words},t.pad.OneZeroPadding={pad:function(t,r){for(var s=4*r,n=s-t.sigBytes%s,o=[],i=0;n>i;i+=4){var a=0;0===i&&(a=2147483648),o.push(a)}var c=e.create(o,n);t.concat(c)},unpad:function(){}},t.pad.NoPadding={pad:function(){},unpad:function(){}},r.leftmostBytes=function(t,r){var e=t.clone();return e.sigBytes=r,e.clamp(),e},r.rightmostBytes=function(t,e){t.clamp();var s=32,n=t.clone(),o=8*(n.sigBytes-e);if(o>=s){var i=Math.floor(o/s);o-=i*s,n.words.splice(0,i),n.sigBytes-=i*s/8}return o>0&&(r.bitshift(n,o),n.sigBytes-=o/8),n},r.popWords=function(t,e){var s=r.leftmostBytes(t,4*e);return t.words=t.words.slice(e),t.sigBytes-=4*e,s},r.shiftBytes=function(t,s){s=s||16;var n=s%4;s-=n;for(var o=e.create(),i=0;s>i;i+=4)o.words.push(t.words.shift()),t.sigBytes-=4,o.sigBytes+=4;return n>0&&(o.words.push(t.words[0]),o.sigBytes+=n,r.bitshift(t,8*n),t.sigBytes-=n),o},r.xorendBytes=function(t,e){return r.leftmostBytes(t,t.sigBytes-e.sigBytes).concat(r.xor(r.rightmostBytes(t,e.sigBytes),e))},r.dbl=function(t){var e=r.msb(t);return r.bitshift(t,1),r.xor(t,1===e?r.const_Rb:r.const_Zero),t},r.inv=function(t){var e=1&t.words[4];return r.bitshift(t,-1),r.xor(t,1===e?r.const_Rb_Shifted:r.const_Zero),t},r.equals=function(t,r){if(!r||!r.words||t.sigBytes!==r.sigBytes)return!1;t.clamp(),r.clamp();for(var e=0,s=0;s<t.words.length;s++)e|=t.words[s]^r.words[s];return 0===e},r.msb=function(t){return t.words[0]>>>31}}(CryptoJS),function(t){function r(r,e){var o=n.createEncryptor(r,{iv:s.create(),padding:t.pad.NoPadding}),i=o.finalize(e);return i}var e=t.lib.Base,s=t.lib.WordArray,n=t.algo.AES,o=t.ext,i=t.pad.OneZeroPadding,a=t.algo.CMAC=e.extend({init:function(t){var e=r(t,o.const_Zero),s=e.clone();if(o.dbl(s),this._isTwo){var n=e.clone();o.inv(n)}else{var n=s.clone();o.dbl(n)}this._K1=s,this._K2=n,this._K=t,this._const_Bsize=16,this.reset()},reset:function(){this._x=o.const_Zero.clone(),this._counter=0,this._buffer=s.create()},update:function(e){if(!e)return this;var s=this._buffer,n=this._const_Bsize;for("string"==typeof e&&(e=t.enc.Utf8.parse(e)),s.concat(e);s.sigBytes>n;){var i=o.shiftBytes(s,n);o.xor(this._x,i),this._x.clamp(),this._x=r(this._K,this._x),this._counter++}return this},finalize:function(t){this.update(t);var e=this._buffer,s=this._const_Bsize,n=e.clone();return e.sigBytes===s?o.xor(n,this._K1):(i.pad(n,s/4),o.xor(n,this._K2)),o.xor(n,this._x),this.reset(),r(this._K,n)},_isTwo:!1});t.CMAC=function(t,r){return a.create(t).finalize(r)},t.algo.OMAC1=a,t.algo.OMAC2=a.extend({_isTwo:!0})}(CryptoJS);
|
118
public/js/libs/crc32.js
Normal file
118
public/js/libs/crc32.js
Normal file
@ -0,0 +1,118 @@
|
|||||||
|
/* crc32.js (C) 2014-present SheetJS -- http://sheetjs.com */
|
||||||
|
/* vim: set ts=2: */
|
||||||
|
/*exported CRC32 */
|
||||||
|
var CRC32;
|
||||||
|
(function (factory) {
|
||||||
|
/*jshint ignore:start */
|
||||||
|
/*eslint-disable */
|
||||||
|
if (typeof DO_NOT_EXPORT_CRC === 'undefined') {
|
||||||
|
if ('object' === typeof exports) {
|
||||||
|
factory(exports);
|
||||||
|
} else if ('function' === typeof define && define.amd) {
|
||||||
|
define(function () {
|
||||||
|
var module = {};
|
||||||
|
factory(module);
|
||||||
|
return module;
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
factory(CRC32 = {});
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
factory(CRC32 = {});
|
||||||
|
}
|
||||||
|
/*eslint-enable */
|
||||||
|
/*jshint ignore:end */
|
||||||
|
}(function (CRC32) {
|
||||||
|
CRC32.version = '1.2.0';
|
||||||
|
/* see perf/crc32table.js */
|
||||||
|
/*global Int32Array */
|
||||||
|
function signed_crc_table() {
|
||||||
|
var c = 0, table = new Array(256);
|
||||||
|
|
||||||
|
for (var n = 0; n != 256; ++n) {
|
||||||
|
c = n;
|
||||||
|
c = ((c & 1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));
|
||||||
|
c = ((c & 1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));
|
||||||
|
c = ((c & 1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));
|
||||||
|
c = ((c & 1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));
|
||||||
|
c = ((c & 1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));
|
||||||
|
c = ((c & 1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));
|
||||||
|
c = ((c & 1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));
|
||||||
|
c = ((c & 1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));
|
||||||
|
table[n] = c;
|
||||||
|
}
|
||||||
|
|
||||||
|
return typeof Int32Array !== 'undefined' ? new Int32Array(table) : table;
|
||||||
|
}
|
||||||
|
|
||||||
|
var T = signed_crc_table();
|
||||||
|
function crc32_bstr(bstr, seed) {
|
||||||
|
var C = seed ^ -1, L = bstr.length - 1;
|
||||||
|
for (var i = 0; i < L;) {
|
||||||
|
C = (C >>> 8) ^ T[(C ^ bstr.charCodeAt(i++)) & 0xFF];
|
||||||
|
C = (C >>> 8) ^ T[(C ^ bstr.charCodeAt(i++)) & 0xFF];
|
||||||
|
}
|
||||||
|
if (i === L) C = (C >>> 8) ^ T[(C ^ bstr.charCodeAt(i)) & 0xFF];
|
||||||
|
return C ^ -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
function crc32_buf(buf, seed) {
|
||||||
|
if (buf.length > 10000) return crc32_buf_8(buf, seed);
|
||||||
|
var C = seed ^ -1, L = buf.length - 3;
|
||||||
|
for (var i = 0; i < L;) {
|
||||||
|
C = (C >>> 8) ^ T[(C ^ buf[i++]) & 0xFF];
|
||||||
|
C = (C >>> 8) ^ T[(C ^ buf[i++]) & 0xFF];
|
||||||
|
C = (C >>> 8) ^ T[(C ^ buf[i++]) & 0xFF];
|
||||||
|
C = (C >>> 8) ^ T[(C ^ buf[i++]) & 0xFF];
|
||||||
|
}
|
||||||
|
while (i < L + 3) C = (C >>> 8) ^ T[(C ^ buf[i++]) & 0xFF];
|
||||||
|
return C ^ -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
function crc32_buf_8(buf, seed) {
|
||||||
|
var C = seed ^ -1, L = buf.length - 7;
|
||||||
|
for (var i = 0; i < L;) {
|
||||||
|
C = (C >>> 8) ^ T[(C ^ buf[i++]) & 0xFF];
|
||||||
|
C = (C >>> 8) ^ T[(C ^ buf[i++]) & 0xFF];
|
||||||
|
C = (C >>> 8) ^ T[(C ^ buf[i++]) & 0xFF];
|
||||||
|
C = (C >>> 8) ^ T[(C ^ buf[i++]) & 0xFF];
|
||||||
|
C = (C >>> 8) ^ T[(C ^ buf[i++]) & 0xFF];
|
||||||
|
C = (C >>> 8) ^ T[(C ^ buf[i++]) & 0xFF];
|
||||||
|
C = (C >>> 8) ^ T[(C ^ buf[i++]) & 0xFF];
|
||||||
|
C = (C >>> 8) ^ T[(C ^ buf[i++]) & 0xFF];
|
||||||
|
}
|
||||||
|
while (i < L + 7) C = (C >>> 8) ^ T[(C ^ buf[i++]) & 0xFF];
|
||||||
|
return C ^ -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
function crc32_str(str, seed) {
|
||||||
|
var C = seed ^ -1;
|
||||||
|
for (var i = 0, L = str.length, c, d; i < L;) {
|
||||||
|
c = str.charCodeAt(i++);
|
||||||
|
if (c < 0x80) {
|
||||||
|
C = (C >>> 8) ^ T[(C ^ c) & 0xFF];
|
||||||
|
} else if (c < 0x800) {
|
||||||
|
C = (C >>> 8) ^ T[(C ^ (192 | ((c >> 6) & 31))) & 0xFF];
|
||||||
|
C = (C >>> 8) ^ T[(C ^ (128 | (c & 63))) & 0xFF];
|
||||||
|
} else if (c >= 0xD800 && c < 0xE000) {
|
||||||
|
c = (c & 1023) + 64; d = str.charCodeAt(i++) & 1023;
|
||||||
|
C = (C >>> 8) ^ T[(C ^ (240 | ((c >> 8) & 7))) & 0xFF];
|
||||||
|
C = (C >>> 8) ^ T[(C ^ (128 | ((c >> 2) & 63))) & 0xFF];
|
||||||
|
C = (C >>> 8) ^ T[(C ^ (128 | ((d >> 6) & 15) | ((c & 3) << 4))) & 0xFF];
|
||||||
|
C = (C >>> 8) ^ T[(C ^ (128 | (d & 63))) & 0xFF];
|
||||||
|
} else {
|
||||||
|
C = (C >>> 8) ^ T[(C ^ (224 | ((c >> 12) & 15))) & 0xFF];
|
||||||
|
C = (C >>> 8) ^ T[(C ^ (128 | ((c >> 6) & 63))) & 0xFF];
|
||||||
|
C = (C >>> 8) ^ T[(C ^ (128 | (c & 63))) & 0xFF];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return C ^ -1;
|
||||||
|
}
|
||||||
|
CRC32.table = T;
|
||||||
|
// $FlowIgnore
|
||||||
|
CRC32.bstr = crc32_bstr;
|
||||||
|
// $FlowIgnore
|
||||||
|
CRC32.buf = crc32_buf;
|
||||||
|
// $FlowIgnore
|
||||||
|
CRC32.str = crc32_str;
|
||||||
|
}));
|
35
public/js/libs/cryptojs-aes.min.js
vendored
Normal file
35
public/js/libs/cryptojs-aes.min.js
vendored
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
/*
|
||||||
|
CryptoJS v3.1.2
|
||||||
|
code.google.com/p/crypto-js
|
||||||
|
(c) 2009-2013 by Jeff Mott. All rights reserved.
|
||||||
|
code.google.com/p/crypto-js/wiki/License
|
||||||
|
*/
|
||||||
|
var CryptoJS=CryptoJS||function(u,p){var d={},l=d.lib={},s=function(){},t=l.Base={extend:function(a){s.prototype=this;var c=new s;a&&c.mixIn(a);c.hasOwnProperty("init")||(c.init=function(){c.$super.init.apply(this,arguments)});c.init.prototype=c;c.$super=this;return c},create:function(){var a=this.extend();a.init.apply(a,arguments);return a},init:function(){},mixIn:function(a){for(var c in a)a.hasOwnProperty(c)&&(this[c]=a[c]);a.hasOwnProperty("toString")&&(this.toString=a.toString)},clone:function(){return this.init.prototype.extend(this)}},
|
||||||
|
r=l.WordArray=t.extend({init:function(a,c){a=this.words=a||[];this.sigBytes=c!=p?c:4*a.length},toString:function(a){return(a||v).stringify(this)},concat:function(a){var c=this.words,e=a.words,j=this.sigBytes;a=a.sigBytes;this.clamp();if(j%4)for(var k=0;k<a;k++)c[j+k>>>2]|=(e[k>>>2]>>>24-8*(k%4)&255)<<24-8*((j+k)%4);else if(65535<e.length)for(k=0;k<a;k+=4)c[j+k>>>2]=e[k>>>2];else c.push.apply(c,e);this.sigBytes+=a;return this},clamp:function(){var a=this.words,c=this.sigBytes;a[c>>>2]&=4294967295<<
|
||||||
|
32-8*(c%4);a.length=u.ceil(c/4)},clone:function(){var a=t.clone.call(this);a.words=this.words.slice(0);return a},random:function(a){for(var c=[],e=0;e<a;e+=4)c.push(4294967296*u.random()|0);return new r.init(c,a)}}),w=d.enc={},v=w.Hex={stringify:function(a){var c=a.words;a=a.sigBytes;for(var e=[],j=0;j<a;j++){var k=c[j>>>2]>>>24-8*(j%4)&255;e.push((k>>>4).toString(16));e.push((k&15).toString(16))}return e.join("")},parse:function(a){for(var c=a.length,e=[],j=0;j<c;j+=2)e[j>>>3]|=parseInt(a.substr(j,
|
||||||
|
2),16)<<24-4*(j%8);return new r.init(e,c/2)}},b=w.Latin1={stringify:function(a){var c=a.words;a=a.sigBytes;for(var e=[],j=0;j<a;j++)e.push(String.fromCharCode(c[j>>>2]>>>24-8*(j%4)&255));return e.join("")},parse:function(a){for(var c=a.length,e=[],j=0;j<c;j++)e[j>>>2]|=(a.charCodeAt(j)&255)<<24-8*(j%4);return new r.init(e,c)}},x=w.Utf8={stringify:function(a){try{return decodeURIComponent(escape(b.stringify(a)))}catch(c){throw Error("Malformed UTF-8 data");}},parse:function(a){return b.parse(unescape(encodeURIComponent(a)))}},
|
||||||
|
q=l.BufferedBlockAlgorithm=t.extend({reset:function(){this._data=new r.init;this._nDataBytes=0},_append:function(a){"string"==typeof a&&(a=x.parse(a));this._data.concat(a);this._nDataBytes+=a.sigBytes},_process:function(a){var c=this._data,e=c.words,j=c.sigBytes,k=this.blockSize,b=j/(4*k),b=a?u.ceil(b):u.max((b|0)-this._minBufferSize,0);a=b*k;j=u.min(4*a,j);if(a){for(var q=0;q<a;q+=k)this._doProcessBlock(e,q);q=e.splice(0,a);c.sigBytes-=j}return new r.init(q,j)},clone:function(){var a=t.clone.call(this);
|
||||||
|
a._data=this._data.clone();return a},_minBufferSize:0});l.Hasher=q.extend({cfg:t.extend(),init:function(a){this.cfg=this.cfg.extend(a);this.reset()},reset:function(){q.reset.call(this);this._doReset()},update:function(a){this._append(a);this._process();return this},finalize:function(a){a&&this._append(a);return this._doFinalize()},blockSize:16,_createHelper:function(a){return function(b,e){return(new a.init(e)).finalize(b)}},_createHmacHelper:function(a){return function(b,e){return(new n.HMAC.init(a,
|
||||||
|
e)).finalize(b)}}});var n=d.algo={};return d}(Math);
|
||||||
|
(function(){var u=CryptoJS,p=u.lib.WordArray;u.enc.Base64={stringify:function(d){var l=d.words,p=d.sigBytes,t=this._map;d.clamp();d=[];for(var r=0;r<p;r+=3)for(var w=(l[r>>>2]>>>24-8*(r%4)&255)<<16|(l[r+1>>>2]>>>24-8*((r+1)%4)&255)<<8|l[r+2>>>2]>>>24-8*((r+2)%4)&255,v=0;4>v&&r+0.75*v<p;v++)d.push(t.charAt(w>>>6*(3-v)&63));if(l=t.charAt(64))for(;d.length%4;)d.push(l);return d.join("")},parse:function(d){var l=d.length,s=this._map,t=s.charAt(64);t&&(t=d.indexOf(t),-1!=t&&(l=t));for(var t=[],r=0,w=0;w<
|
||||||
|
l;w++)if(w%4){var v=s.indexOf(d.charAt(w-1))<<2*(w%4),b=s.indexOf(d.charAt(w))>>>6-2*(w%4);t[r>>>2]|=(v|b)<<24-8*(r%4);r++}return p.create(t,r)},_map:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="}})();
|
||||||
|
(function(u){function p(b,n,a,c,e,j,k){b=b+(n&a|~n&c)+e+k;return(b<<j|b>>>32-j)+n}function d(b,n,a,c,e,j,k){b=b+(n&c|a&~c)+e+k;return(b<<j|b>>>32-j)+n}function l(b,n,a,c,e,j,k){b=b+(n^a^c)+e+k;return(b<<j|b>>>32-j)+n}function s(b,n,a,c,e,j,k){b=b+(a^(n|~c))+e+k;return(b<<j|b>>>32-j)+n}for(var t=CryptoJS,r=t.lib,w=r.WordArray,v=r.Hasher,r=t.algo,b=[],x=0;64>x;x++)b[x]=4294967296*u.abs(u.sin(x+1))|0;r=r.MD5=v.extend({_doReset:function(){this._hash=new w.init([1732584193,4023233417,2562383102,271733878])},
|
||||||
|
_doProcessBlock:function(q,n){for(var a=0;16>a;a++){var c=n+a,e=q[c];q[c]=(e<<8|e>>>24)&16711935|(e<<24|e>>>8)&4278255360}var a=this._hash.words,c=q[n+0],e=q[n+1],j=q[n+2],k=q[n+3],z=q[n+4],r=q[n+5],t=q[n+6],w=q[n+7],v=q[n+8],A=q[n+9],B=q[n+10],C=q[n+11],u=q[n+12],D=q[n+13],E=q[n+14],x=q[n+15],f=a[0],m=a[1],g=a[2],h=a[3],f=p(f,m,g,h,c,7,b[0]),h=p(h,f,m,g,e,12,b[1]),g=p(g,h,f,m,j,17,b[2]),m=p(m,g,h,f,k,22,b[3]),f=p(f,m,g,h,z,7,b[4]),h=p(h,f,m,g,r,12,b[5]),g=p(g,h,f,m,t,17,b[6]),m=p(m,g,h,f,w,22,b[7]),
|
||||||
|
f=p(f,m,g,h,v,7,b[8]),h=p(h,f,m,g,A,12,b[9]),g=p(g,h,f,m,B,17,b[10]),m=p(m,g,h,f,C,22,b[11]),f=p(f,m,g,h,u,7,b[12]),h=p(h,f,m,g,D,12,b[13]),g=p(g,h,f,m,E,17,b[14]),m=p(m,g,h,f,x,22,b[15]),f=d(f,m,g,h,e,5,b[16]),h=d(h,f,m,g,t,9,b[17]),g=d(g,h,f,m,C,14,b[18]),m=d(m,g,h,f,c,20,b[19]),f=d(f,m,g,h,r,5,b[20]),h=d(h,f,m,g,B,9,b[21]),g=d(g,h,f,m,x,14,b[22]),m=d(m,g,h,f,z,20,b[23]),f=d(f,m,g,h,A,5,b[24]),h=d(h,f,m,g,E,9,b[25]),g=d(g,h,f,m,k,14,b[26]),m=d(m,g,h,f,v,20,b[27]),f=d(f,m,g,h,D,5,b[28]),h=d(h,f,
|
||||||
|
m,g,j,9,b[29]),g=d(g,h,f,m,w,14,b[30]),m=d(m,g,h,f,u,20,b[31]),f=l(f,m,g,h,r,4,b[32]),h=l(h,f,m,g,v,11,b[33]),g=l(g,h,f,m,C,16,b[34]),m=l(m,g,h,f,E,23,b[35]),f=l(f,m,g,h,e,4,b[36]),h=l(h,f,m,g,z,11,b[37]),g=l(g,h,f,m,w,16,b[38]),m=l(m,g,h,f,B,23,b[39]),f=l(f,m,g,h,D,4,b[40]),h=l(h,f,m,g,c,11,b[41]),g=l(g,h,f,m,k,16,b[42]),m=l(m,g,h,f,t,23,b[43]),f=l(f,m,g,h,A,4,b[44]),h=l(h,f,m,g,u,11,b[45]),g=l(g,h,f,m,x,16,b[46]),m=l(m,g,h,f,j,23,b[47]),f=s(f,m,g,h,c,6,b[48]),h=s(h,f,m,g,w,10,b[49]),g=s(g,h,f,m,
|
||||||
|
E,15,b[50]),m=s(m,g,h,f,r,21,b[51]),f=s(f,m,g,h,u,6,b[52]),h=s(h,f,m,g,k,10,b[53]),g=s(g,h,f,m,B,15,b[54]),m=s(m,g,h,f,e,21,b[55]),f=s(f,m,g,h,v,6,b[56]),h=s(h,f,m,g,x,10,b[57]),g=s(g,h,f,m,t,15,b[58]),m=s(m,g,h,f,D,21,b[59]),f=s(f,m,g,h,z,6,b[60]),h=s(h,f,m,g,C,10,b[61]),g=s(g,h,f,m,j,15,b[62]),m=s(m,g,h,f,A,21,b[63]);a[0]=a[0]+f|0;a[1]=a[1]+m|0;a[2]=a[2]+g|0;a[3]=a[3]+h|0},_doFinalize:function(){var b=this._data,n=b.words,a=8*this._nDataBytes,c=8*b.sigBytes;n[c>>>5]|=128<<24-c%32;var e=u.floor(a/
|
||||||
|
4294967296);n[(c+64>>>9<<4)+15]=(e<<8|e>>>24)&16711935|(e<<24|e>>>8)&4278255360;n[(c+64>>>9<<4)+14]=(a<<8|a>>>24)&16711935|(a<<24|a>>>8)&4278255360;b.sigBytes=4*(n.length+1);this._process();b=this._hash;n=b.words;for(a=0;4>a;a++)c=n[a],n[a]=(c<<8|c>>>24)&16711935|(c<<24|c>>>8)&4278255360;return b},clone:function(){var b=v.clone.call(this);b._hash=this._hash.clone();return b}});t.MD5=v._createHelper(r);t.HmacMD5=v._createHmacHelper(r)})(Math);
|
||||||
|
(function(){var u=CryptoJS,p=u.lib,d=p.Base,l=p.WordArray,p=u.algo,s=p.EvpKDF=d.extend({cfg:d.extend({keySize:4,hasher:p.MD5,iterations:1}),init:function(d){this.cfg=this.cfg.extend(d)},compute:function(d,r){for(var p=this.cfg,s=p.hasher.create(),b=l.create(),u=b.words,q=p.keySize,p=p.iterations;u.length<q;){n&&s.update(n);var n=s.update(d).finalize(r);s.reset();for(var a=1;a<p;a++)n=s.finalize(n),s.reset();b.concat(n)}b.sigBytes=4*q;return b}});u.EvpKDF=function(d,l,p){return s.create(p).compute(d,
|
||||||
|
l)}})();
|
||||||
|
CryptoJS.lib.Cipher||function(u){var p=CryptoJS,d=p.lib,l=d.Base,s=d.WordArray,t=d.BufferedBlockAlgorithm,r=p.enc.Base64,w=p.algo.EvpKDF,v=d.Cipher=t.extend({cfg:l.extend(),createEncryptor:function(e,a){return this.create(this._ENC_XFORM_MODE,e,a)},createDecryptor:function(e,a){return this.create(this._DEC_XFORM_MODE,e,a)},init:function(e,a,b){this.cfg=this.cfg.extend(b);this._xformMode=e;this._key=a;this.reset()},reset:function(){t.reset.call(this);this._doReset()},process:function(e){this._append(e);return this._process()},
|
||||||
|
finalize:function(e){e&&this._append(e);return this._doFinalize()},keySize:4,ivSize:4,_ENC_XFORM_MODE:1,_DEC_XFORM_MODE:2,_createHelper:function(e){return{encrypt:function(b,k,d){return("string"==typeof k?c:a).encrypt(e,b,k,d)},decrypt:function(b,k,d){return("string"==typeof k?c:a).decrypt(e,b,k,d)}}}});d.StreamCipher=v.extend({_doFinalize:function(){return this._process(!0)},blockSize:1});var b=p.mode={},x=function(e,a,b){var c=this._iv;c?this._iv=u:c=this._prevBlock;for(var d=0;d<b;d++)e[a+d]^=
|
||||||
|
c[d]},q=(d.BlockCipherMode=l.extend({createEncryptor:function(e,a){return this.Encryptor.create(e,a)},createDecryptor:function(e,a){return this.Decryptor.create(e,a)},init:function(e,a){this._cipher=e;this._iv=a}})).extend();q.Encryptor=q.extend({processBlock:function(e,a){var b=this._cipher,c=b.blockSize;x.call(this,e,a,c);b.encryptBlock(e,a);this._prevBlock=e.slice(a,a+c)}});q.Decryptor=q.extend({processBlock:function(e,a){var b=this._cipher,c=b.blockSize,d=e.slice(a,a+c);b.decryptBlock(e,a);x.call(this,
|
||||||
|
e,a,c);this._prevBlock=d}});b=b.CBC=q;q=(p.pad={}).Pkcs7={pad:function(a,b){for(var c=4*b,c=c-a.sigBytes%c,d=c<<24|c<<16|c<<8|c,l=[],n=0;n<c;n+=4)l.push(d);c=s.create(l,c);a.concat(c)},unpad:function(a){a.sigBytes-=a.words[a.sigBytes-1>>>2]&255}};d.BlockCipher=v.extend({cfg:v.cfg.extend({mode:b,padding:q}),reset:function(){v.reset.call(this);var a=this.cfg,b=a.iv,a=a.mode;if(this._xformMode==this._ENC_XFORM_MODE)var c=a.createEncryptor;else c=a.createDecryptor,this._minBufferSize=1;this._mode=c.call(a,
|
||||||
|
this,b&&b.words)},_doProcessBlock:function(a,b){this._mode.processBlock(a,b)},_doFinalize:function(){var a=this.cfg.padding;if(this._xformMode==this._ENC_XFORM_MODE){a.pad(this._data,this.blockSize);var b=this._process(!0)}else b=this._process(!0),a.unpad(b);return b},blockSize:4});var n=d.CipherParams=l.extend({init:function(a){this.mixIn(a)},toString:function(a){return(a||this.formatter).stringify(this)}}),b=(p.format={}).OpenSSL={stringify:function(a){var b=a.ciphertext;a=a.salt;return(a?s.create([1398893684,
|
||||||
|
1701076831]).concat(a).concat(b):b).toString(r)},parse:function(a){a=r.parse(a);var b=a.words;if(1398893684==b[0]&&1701076831==b[1]){var c=s.create(b.slice(2,4));b.splice(0,4);a.sigBytes-=16}return n.create({ciphertext:a,salt:c})}},a=d.SerializableCipher=l.extend({cfg:l.extend({format:b}),encrypt:function(a,b,c,d){d=this.cfg.extend(d);var l=a.createEncryptor(c,d);b=l.finalize(b);l=l.cfg;return n.create({ciphertext:b,key:c,iv:l.iv,algorithm:a,mode:l.mode,padding:l.padding,blockSize:a.blockSize,formatter:d.format})},
|
||||||
|
decrypt:function(a,b,c,d){d=this.cfg.extend(d);b=this._parse(b,d.format);return a.createDecryptor(c,d).finalize(b.ciphertext)},_parse:function(a,b){return"string"==typeof a?b.parse(a,this):a}}),p=(p.kdf={}).OpenSSL={execute:function(a,b,c,d){d||(d=s.random(8));a=w.create({keySize:b+c}).compute(a,d);c=s.create(a.words.slice(b),4*c);a.sigBytes=4*b;return n.create({key:a,iv:c,salt:d})}},c=d.PasswordBasedCipher=a.extend({cfg:a.cfg.extend({kdf:p}),encrypt:function(b,c,d,l){l=this.cfg.extend(l);d=l.kdf.execute(d,
|
||||||
|
b.keySize,b.ivSize);l.iv=d.iv;b=a.encrypt.call(this,b,c,d.key,l);b.mixIn(d);return b},decrypt:function(b,c,d,l){l=this.cfg.extend(l);c=this._parse(c,l.format);d=l.kdf.execute(d,b.keySize,b.ivSize,c.salt);l.iv=d.iv;return a.decrypt.call(this,b,c,d.key,l)}})}();
|
||||||
|
(function(){for(var u=CryptoJS,p=u.lib.BlockCipher,d=u.algo,l=[],s=[],t=[],r=[],w=[],v=[],b=[],x=[],q=[],n=[],a=[],c=0;256>c;c++)a[c]=128>c?c<<1:c<<1^283;for(var e=0,j=0,c=0;256>c;c++){var k=j^j<<1^j<<2^j<<3^j<<4,k=k>>>8^k&255^99;l[e]=k;s[k]=e;var z=a[e],F=a[z],G=a[F],y=257*a[k]^16843008*k;t[e]=y<<24|y>>>8;r[e]=y<<16|y>>>16;w[e]=y<<8|y>>>24;v[e]=y;y=16843009*G^65537*F^257*z^16843008*e;b[k]=y<<24|y>>>8;x[k]=y<<16|y>>>16;q[k]=y<<8|y>>>24;n[k]=y;e?(e=z^a[a[a[G^z]]],j^=a[a[j]]):e=j=1}var H=[0,1,2,4,8,
|
||||||
|
16,32,64,128,27,54],d=d.AES=p.extend({_doReset:function(){for(var a=this._key,c=a.words,d=a.sigBytes/4,a=4*((this._nRounds=d+6)+1),e=this._keySchedule=[],j=0;j<a;j++)if(j<d)e[j]=c[j];else{var k=e[j-1];j%d?6<d&&4==j%d&&(k=l[k>>>24]<<24|l[k>>>16&255]<<16|l[k>>>8&255]<<8|l[k&255]):(k=k<<8|k>>>24,k=l[k>>>24]<<24|l[k>>>16&255]<<16|l[k>>>8&255]<<8|l[k&255],k^=H[j/d|0]<<24);e[j]=e[j-d]^k}c=this._invKeySchedule=[];for(d=0;d<a;d++)j=a-d,k=d%4?e[j]:e[j-4],c[d]=4>d||4>=j?k:b[l[k>>>24]]^x[l[k>>>16&255]]^q[l[k>>>
|
||||||
|
8&255]]^n[l[k&255]]},encryptBlock:function(a,b){this._doCryptBlock(a,b,this._keySchedule,t,r,w,v,l)},decryptBlock:function(a,c){var d=a[c+1];a[c+1]=a[c+3];a[c+3]=d;this._doCryptBlock(a,c,this._invKeySchedule,b,x,q,n,s);d=a[c+1];a[c+1]=a[c+3];a[c+3]=d},_doCryptBlock:function(a,b,c,d,e,j,l,f){for(var m=this._nRounds,g=a[b]^c[0],h=a[b+1]^c[1],k=a[b+2]^c[2],n=a[b+3]^c[3],p=4,r=1;r<m;r++)var q=d[g>>>24]^e[h>>>16&255]^j[k>>>8&255]^l[n&255]^c[p++],s=d[h>>>24]^e[k>>>16&255]^j[n>>>8&255]^l[g&255]^c[p++],t=
|
||||||
|
d[k>>>24]^e[n>>>16&255]^j[g>>>8&255]^l[h&255]^c[p++],n=d[n>>>24]^e[g>>>16&255]^j[h>>>8&255]^l[k&255]^c[p++],g=q,h=s,k=t;q=(f[g>>>24]<<24|f[h>>>16&255]<<16|f[k>>>8&255]<<8|f[n&255])^c[p++];s=(f[h>>>24]<<24|f[k>>>16&255]<<16|f[n>>>8&255]<<8|f[g&255])^c[p++];t=(f[k>>>24]<<24|f[n>>>16&255]<<16|f[g>>>8&255]<<8|f[h&255])^c[p++];n=(f[n>>>24]<<24|f[g>>>16&255]<<16|f[h>>>8&255]<<8|f[k&255])^c[p++];a[b]=q;a[b+1]=s;a[b+2]=t;a[b+3]=n},keySize:8});u.AES=p._createHelper(d)})();
|
2
public/js/libs/jquery.min.js
vendored
Normal file
2
public/js/libs/jquery.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
518
public/js/libs/sha256.js
Normal file
518
public/js/libs/sha256.js
Normal file
@ -0,0 +1,518 @@
|
|||||||
|
/**
|
||||||
|
* [js-sha256]{@link https://github.com/emn178/js-sha256}
|
||||||
|
*
|
||||||
|
* @version 0.9.0
|
||||||
|
* @author Chen, Yi-Cyuan [emn178@gmail.com]
|
||||||
|
* @copyright Chen, Yi-Cyuan 2014-2017
|
||||||
|
* @license MIT
|
||||||
|
*/
|
||||||
|
/*jslint bitwise: true */
|
||||||
|
(function () {
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
var ERROR = 'input is invalid type';
|
||||||
|
var WINDOW = typeof window === 'object';
|
||||||
|
var root = WINDOW ? window : {};
|
||||||
|
if (root.JS_SHA256_NO_WINDOW) {
|
||||||
|
WINDOW = false;
|
||||||
|
}
|
||||||
|
var WEB_WORKER = !WINDOW && typeof self === 'object';
|
||||||
|
var NODE_JS = !root.JS_SHA256_NO_NODE_JS && typeof process === 'object' && process.versions && process.versions.node;
|
||||||
|
if (NODE_JS) {
|
||||||
|
root = global;
|
||||||
|
} else if (WEB_WORKER) {
|
||||||
|
root = self;
|
||||||
|
}
|
||||||
|
var COMMON_JS = !root.JS_SHA256_NO_COMMON_JS && typeof module === 'object' && module.exports;
|
||||||
|
var AMD = typeof define === 'function' && define.amd;
|
||||||
|
var ARRAY_BUFFER = !root.JS_SHA256_NO_ARRAY_BUFFER && typeof ArrayBuffer !== 'undefined';
|
||||||
|
var HEX_CHARS = '0123456789abcdef'.split('');
|
||||||
|
var EXTRA = [-2147483648, 8388608, 32768, 128];
|
||||||
|
var SHIFT = [24, 16, 8, 0];
|
||||||
|
var K = [
|
||||||
|
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
|
||||||
|
];
|
||||||
|
var OUTPUT_TYPES = ['hex', 'array', 'digest', 'arrayBuffer'];
|
||||||
|
|
||||||
|
var blocks = [];
|
||||||
|
|
||||||
|
if (root.JS_SHA256_NO_NODE_JS || !Array.isArray) {
|
||||||
|
Array.isArray = function (obj) {
|
||||||
|
return Object.prototype.toString.call(obj) === '[object Array]';
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ARRAY_BUFFER && (root.JS_SHA256_NO_ARRAY_BUFFER_IS_VIEW || !ArrayBuffer.isView)) {
|
||||||
|
ArrayBuffer.isView = function (obj) {
|
||||||
|
return typeof obj === 'object' && obj.buffer && obj.buffer.constructor === ArrayBuffer;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
var createOutputMethod = function (outputType, is224) {
|
||||||
|
return function (message) {
|
||||||
|
return new Sha256(is224, true).update(message)[outputType]();
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
var createMethod = function (is224) {
|
||||||
|
var method = createOutputMethod('hex', is224);
|
||||||
|
if (NODE_JS) {
|
||||||
|
method = nodeWrap(method, is224);
|
||||||
|
}
|
||||||
|
method.create = function () {
|
||||||
|
return new Sha256(is224);
|
||||||
|
};
|
||||||
|
method.update = function (message) {
|
||||||
|
return method.create().update(message);
|
||||||
|
};
|
||||||
|
for (var i = 0; i < OUTPUT_TYPES.length; ++i) {
|
||||||
|
var type = OUTPUT_TYPES[i];
|
||||||
|
method[type] = createOutputMethod(type, is224);
|
||||||
|
}
|
||||||
|
return method;
|
||||||
|
};
|
||||||
|
|
||||||
|
var nodeWrap = function (method, is224) {
|
||||||
|
var crypto = eval("require('crypto')");
|
||||||
|
var Buffer = eval("require('buffer').Buffer");
|
||||||
|
var algorithm = is224 ? 'sha224' : 'sha256';
|
||||||
|
var nodeMethod = function (message) {
|
||||||
|
if (typeof message === 'string') {
|
||||||
|
return crypto.createHash(algorithm).update(message, 'utf8').digest('hex');
|
||||||
|
} else {
|
||||||
|
if (message === null || message === undefined) {
|
||||||
|
throw new Error(ERROR);
|
||||||
|
} else if (message.constructor === ArrayBuffer) {
|
||||||
|
message = new Uint8Array(message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (Array.isArray(message) || ArrayBuffer.isView(message) ||
|
||||||
|
message.constructor === Buffer) {
|
||||||
|
return crypto.createHash(algorithm).update(new Buffer(message)).digest('hex');
|
||||||
|
} else {
|
||||||
|
return method(message);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
return nodeMethod;
|
||||||
|
};
|
||||||
|
|
||||||
|
var createHmacOutputMethod = function (outputType, is224) {
|
||||||
|
return function (key, message) {
|
||||||
|
return new HmacSha256(key, is224, true).update(message)[outputType]();
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
var createHmacMethod = function (is224) {
|
||||||
|
var method = createHmacOutputMethod('hex', is224);
|
||||||
|
method.create = function (key) {
|
||||||
|
return new HmacSha256(key, is224);
|
||||||
|
};
|
||||||
|
method.update = function (key, message) {
|
||||||
|
return method.create(key).update(message);
|
||||||
|
};
|
||||||
|
for (var i = 0; i < OUTPUT_TYPES.length; ++i) {
|
||||||
|
var type = OUTPUT_TYPES[i];
|
||||||
|
method[type] = createHmacOutputMethod(type, is224);
|
||||||
|
}
|
||||||
|
return method;
|
||||||
|
};
|
||||||
|
|
||||||
|
function Sha256(is224, sharedMemory) {
|
||||||
|
if (sharedMemory) {
|
||||||
|
blocks[0] = blocks[16] = blocks[1] = blocks[2] = blocks[3] =
|
||||||
|
blocks[4] = blocks[5] = blocks[6] = blocks[7] =
|
||||||
|
blocks[8] = blocks[9] = blocks[10] = blocks[11] =
|
||||||
|
blocks[12] = blocks[13] = blocks[14] = blocks[15] = 0;
|
||||||
|
this.blocks = blocks;
|
||||||
|
} else {
|
||||||
|
this.blocks = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (is224) {
|
||||||
|
this.h0 = 0xc1059ed8;
|
||||||
|
this.h1 = 0x367cd507;
|
||||||
|
this.h2 = 0x3070dd17;
|
||||||
|
this.h3 = 0xf70e5939;
|
||||||
|
this.h4 = 0xffc00b31;
|
||||||
|
this.h5 = 0x68581511;
|
||||||
|
this.h6 = 0x64f98fa7;
|
||||||
|
this.h7 = 0xbefa4fa4;
|
||||||
|
} else { // 256
|
||||||
|
this.h0 = 0x6a09e667;
|
||||||
|
this.h1 = 0xbb67ae85;
|
||||||
|
this.h2 = 0x3c6ef372;
|
||||||
|
this.h3 = 0xa54ff53a;
|
||||||
|
this.h4 = 0x510e527f;
|
||||||
|
this.h5 = 0x9b05688c;
|
||||||
|
this.h6 = 0x1f83d9ab;
|
||||||
|
this.h7 = 0x5be0cd19;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.block = this.start = this.bytes = this.hBytes = 0;
|
||||||
|
this.finalized = this.hashed = false;
|
||||||
|
this.first = true;
|
||||||
|
this.is224 = is224;
|
||||||
|
}
|
||||||
|
|
||||||
|
Sha256.prototype.update = function (message) {
|
||||||
|
if (this.finalized) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var notString, type = typeof message;
|
||||||
|
if (type !== 'string') {
|
||||||
|
if (type === 'object') {
|
||||||
|
if (message === null) {
|
||||||
|
throw new Error(ERROR);
|
||||||
|
} else if (ARRAY_BUFFER && message.constructor === ArrayBuffer) {
|
||||||
|
message = new Uint8Array(message);
|
||||||
|
} else if (!Array.isArray(message)) {
|
||||||
|
if (!ARRAY_BUFFER || !ArrayBuffer.isView(message)) {
|
||||||
|
throw new Error(ERROR);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
throw new Error(ERROR);
|
||||||
|
}
|
||||||
|
notString = true;
|
||||||
|
}
|
||||||
|
var code, index = 0, i, length = message.length, blocks = this.blocks;
|
||||||
|
|
||||||
|
while (index < length) {
|
||||||
|
if (this.hashed) {
|
||||||
|
this.hashed = false;
|
||||||
|
blocks[0] = this.block;
|
||||||
|
blocks[16] = blocks[1] = blocks[2] = blocks[3] =
|
||||||
|
blocks[4] = blocks[5] = blocks[6] = blocks[7] =
|
||||||
|
blocks[8] = blocks[9] = blocks[10] = blocks[11] =
|
||||||
|
blocks[12] = blocks[13] = blocks[14] = blocks[15] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (notString) {
|
||||||
|
for (i = this.start; index < length && i < 64; ++index) {
|
||||||
|
blocks[i >> 2] |= message[index] << SHIFT[i++ & 3];
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for (i = this.start; index < length && i < 64; ++index) {
|
||||||
|
code = message.charCodeAt(index);
|
||||||
|
if (code < 0x80) {
|
||||||
|
blocks[i >> 2] |= code << SHIFT[i++ & 3];
|
||||||
|
} else if (code < 0x800) {
|
||||||
|
blocks[i >> 2] |= (0xc0 | (code >> 6)) << SHIFT[i++ & 3];
|
||||||
|
blocks[i >> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3];
|
||||||
|
} else if (code < 0xd800 || code >= 0xe000) {
|
||||||
|
blocks[i >> 2] |= (0xe0 | (code >> 12)) << SHIFT[i++ & 3];
|
||||||
|
blocks[i >> 2] |= (0x80 | ((code >> 6) & 0x3f)) << SHIFT[i++ & 3];
|
||||||
|
blocks[i >> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3];
|
||||||
|
} else {
|
||||||
|
code = 0x10000 + (((code & 0x3ff) << 10) | (message.charCodeAt(++index) & 0x3ff));
|
||||||
|
blocks[i >> 2] |= (0xf0 | (code >> 18)) << SHIFT[i++ & 3];
|
||||||
|
blocks[i >> 2] |= (0x80 | ((code >> 12) & 0x3f)) << SHIFT[i++ & 3];
|
||||||
|
blocks[i >> 2] |= (0x80 | ((code >> 6) & 0x3f)) << SHIFT[i++ & 3];
|
||||||
|
blocks[i >> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
this.lastByteIndex = i;
|
||||||
|
this.bytes += i - this.start;
|
||||||
|
if (i >= 64) {
|
||||||
|
this.block = blocks[16];
|
||||||
|
this.start = i - 64;
|
||||||
|
this.hash();
|
||||||
|
this.hashed = true;
|
||||||
|
} else {
|
||||||
|
this.start = i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (this.bytes > 4294967295) {
|
||||||
|
this.hBytes += this.bytes / 4294967296 << 0;
|
||||||
|
this.bytes = this.bytes % 4294967296;
|
||||||
|
}
|
||||||
|
return this;
|
||||||
|
};
|
||||||
|
|
||||||
|
Sha256.prototype.finalize = function () {
|
||||||
|
if (this.finalized) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this.finalized = true;
|
||||||
|
var blocks = this.blocks, i = this.lastByteIndex;
|
||||||
|
blocks[16] = this.block;
|
||||||
|
blocks[i >> 2] |= EXTRA[i & 3];
|
||||||
|
this.block = blocks[16];
|
||||||
|
if (i >= 56) {
|
||||||
|
if (!this.hashed) {
|
||||||
|
this.hash();
|
||||||
|
}
|
||||||
|
blocks[0] = this.block;
|
||||||
|
blocks[16] = blocks[1] = blocks[2] = blocks[3] =
|
||||||
|
blocks[4] = blocks[5] = blocks[6] = blocks[7] =
|
||||||
|
blocks[8] = blocks[9] = blocks[10] = blocks[11] =
|
||||||
|
blocks[12] = blocks[13] = blocks[14] = blocks[15] = 0;
|
||||||
|
}
|
||||||
|
blocks[14] = this.hBytes << 3 | this.bytes >>> 29;
|
||||||
|
blocks[15] = this.bytes << 3;
|
||||||
|
this.hash();
|
||||||
|
};
|
||||||
|
|
||||||
|
Sha256.prototype.hash = function () {
|
||||||
|
var a = this.h0, b = this.h1, c = this.h2, d = this.h3, e = this.h4, f = this.h5, g = this.h6,
|
||||||
|
h = this.h7, blocks = this.blocks, j, s0, s1, maj, t1, t2, ch, ab, da, cd, bc;
|
||||||
|
|
||||||
|
for (j = 16; j < 64; ++j) {
|
||||||
|
// rightrotate
|
||||||
|
t1 = blocks[j - 15];
|
||||||
|
s0 = ((t1 >>> 7) | (t1 << 25)) ^ ((t1 >>> 18) | (t1 << 14)) ^ (t1 >>> 3);
|
||||||
|
t1 = blocks[j - 2];
|
||||||
|
s1 = ((t1 >>> 17) | (t1 << 15)) ^ ((t1 >>> 19) | (t1 << 13)) ^ (t1 >>> 10);
|
||||||
|
blocks[j] = blocks[j - 16] + s0 + blocks[j - 7] + s1 << 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
bc = b & c;
|
||||||
|
for (j = 0; j < 64; j += 4) {
|
||||||
|
if (this.first) {
|
||||||
|
if (this.is224) {
|
||||||
|
ab = 300032;
|
||||||
|
t1 = blocks[0] - 1413257819;
|
||||||
|
h = t1 - 150054599 << 0;
|
||||||
|
d = t1 + 24177077 << 0;
|
||||||
|
} else {
|
||||||
|
ab = 704751109;
|
||||||
|
t1 = blocks[0] - 210244248;
|
||||||
|
h = t1 - 1521486534 << 0;
|
||||||
|
d = t1 + 143694565 << 0;
|
||||||
|
}
|
||||||
|
this.first = false;
|
||||||
|
} else {
|
||||||
|
s0 = ((a >>> 2) | (a << 30)) ^ ((a >>> 13) | (a << 19)) ^ ((a >>> 22) | (a << 10));
|
||||||
|
s1 = ((e >>> 6) | (e << 26)) ^ ((e >>> 11) | (e << 21)) ^ ((e >>> 25) | (e << 7));
|
||||||
|
ab = a & b;
|
||||||
|
maj = ab ^ (a & c) ^ bc;
|
||||||
|
ch = (e & f) ^ (~e & g);
|
||||||
|
t1 = h + s1 + ch + K[j] + blocks[j];
|
||||||
|
t2 = s0 + maj;
|
||||||
|
h = d + t1 << 0;
|
||||||
|
d = t1 + t2 << 0;
|
||||||
|
}
|
||||||
|
s0 = ((d >>> 2) | (d << 30)) ^ ((d >>> 13) | (d << 19)) ^ ((d >>> 22) | (d << 10));
|
||||||
|
s1 = ((h >>> 6) | (h << 26)) ^ ((h >>> 11) | (h << 21)) ^ ((h >>> 25) | (h << 7));
|
||||||
|
da = d & a;
|
||||||
|
maj = da ^ (d & b) ^ ab;
|
||||||
|
ch = (h & e) ^ (~h & f);
|
||||||
|
t1 = g + s1 + ch + K[j + 1] + blocks[j + 1];
|
||||||
|
t2 = s0 + maj;
|
||||||
|
g = c + t1 << 0;
|
||||||
|
c = t1 + t2 << 0;
|
||||||
|
s0 = ((c >>> 2) | (c << 30)) ^ ((c >>> 13) | (c << 19)) ^ ((c >>> 22) | (c << 10));
|
||||||
|
s1 = ((g >>> 6) | (g << 26)) ^ ((g >>> 11) | (g << 21)) ^ ((g >>> 25) | (g << 7));
|
||||||
|
cd = c & d;
|
||||||
|
maj = cd ^ (c & a) ^ da;
|
||||||
|
ch = (g & h) ^ (~g & e);
|
||||||
|
t1 = f + s1 + ch + K[j + 2] + blocks[j + 2];
|
||||||
|
t2 = s0 + maj;
|
||||||
|
f = b + t1 << 0;
|
||||||
|
b = t1 + t2 << 0;
|
||||||
|
s0 = ((b >>> 2) | (b << 30)) ^ ((b >>> 13) | (b << 19)) ^ ((b >>> 22) | (b << 10));
|
||||||
|
s1 = ((f >>> 6) | (f << 26)) ^ ((f >>> 11) | (f << 21)) ^ ((f >>> 25) | (f << 7));
|
||||||
|
bc = b & c;
|
||||||
|
maj = bc ^ (b & d) ^ cd;
|
||||||
|
ch = (f & g) ^ (~f & h);
|
||||||
|
t1 = e + s1 + ch + K[j + 3] + blocks[j + 3];
|
||||||
|
t2 = s0 + maj;
|
||||||
|
e = a + t1 << 0;
|
||||||
|
a = t1 + t2 << 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.h0 = this.h0 + a << 0;
|
||||||
|
this.h1 = this.h1 + b << 0;
|
||||||
|
this.h2 = this.h2 + c << 0;
|
||||||
|
this.h3 = this.h3 + d << 0;
|
||||||
|
this.h4 = this.h4 + e << 0;
|
||||||
|
this.h5 = this.h5 + f << 0;
|
||||||
|
this.h6 = this.h6 + g << 0;
|
||||||
|
this.h7 = this.h7 + h << 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
Sha256.prototype.hex = function () {
|
||||||
|
this.finalize();
|
||||||
|
|
||||||
|
var h0 = this.h0, h1 = this.h1, h2 = this.h2, h3 = this.h3, h4 = this.h4, h5 = this.h5,
|
||||||
|
h6 = this.h6, h7 = this.h7;
|
||||||
|
|
||||||
|
var hex = HEX_CHARS[(h0 >> 28) & 0x0F] + HEX_CHARS[(h0 >> 24) & 0x0F] +
|
||||||
|
HEX_CHARS[(h0 >> 20) & 0x0F] + HEX_CHARS[(h0 >> 16) & 0x0F] +
|
||||||
|
HEX_CHARS[(h0 >> 12) & 0x0F] + HEX_CHARS[(h0 >> 8) & 0x0F] +
|
||||||
|
HEX_CHARS[(h0 >> 4) & 0x0F] + HEX_CHARS[h0 & 0x0F] +
|
||||||
|
HEX_CHARS[(h1 >> 28) & 0x0F] + HEX_CHARS[(h1 >> 24) & 0x0F] +
|
||||||
|
HEX_CHARS[(h1 >> 20) & 0x0F] + HEX_CHARS[(h1 >> 16) & 0x0F] +
|
||||||
|
HEX_CHARS[(h1 >> 12) & 0x0F] + HEX_CHARS[(h1 >> 8) & 0x0F] +
|
||||||
|
HEX_CHARS[(h1 >> 4) & 0x0F] + HEX_CHARS[h1 & 0x0F] +
|
||||||
|
HEX_CHARS[(h2 >> 28) & 0x0F] + HEX_CHARS[(h2 >> 24) & 0x0F] +
|
||||||
|
HEX_CHARS[(h2 >> 20) & 0x0F] + HEX_CHARS[(h2 >> 16) & 0x0F] +
|
||||||
|
HEX_CHARS[(h2 >> 12) & 0x0F] + HEX_CHARS[(h2 >> 8) & 0x0F] +
|
||||||
|
HEX_CHARS[(h2 >> 4) & 0x0F] + HEX_CHARS[h2 & 0x0F] +
|
||||||
|
HEX_CHARS[(h3 >> 28) & 0x0F] + HEX_CHARS[(h3 >> 24) & 0x0F] +
|
||||||
|
HEX_CHARS[(h3 >> 20) & 0x0F] + HEX_CHARS[(h3 >> 16) & 0x0F] +
|
||||||
|
HEX_CHARS[(h3 >> 12) & 0x0F] + HEX_CHARS[(h3 >> 8) & 0x0F] +
|
||||||
|
HEX_CHARS[(h3 >> 4) & 0x0F] + HEX_CHARS[h3 & 0x0F] +
|
||||||
|
HEX_CHARS[(h4 >> 28) & 0x0F] + HEX_CHARS[(h4 >> 24) & 0x0F] +
|
||||||
|
HEX_CHARS[(h4 >> 20) & 0x0F] + HEX_CHARS[(h4 >> 16) & 0x0F] +
|
||||||
|
HEX_CHARS[(h4 >> 12) & 0x0F] + HEX_CHARS[(h4 >> 8) & 0x0F] +
|
||||||
|
HEX_CHARS[(h4 >> 4) & 0x0F] + HEX_CHARS[h4 & 0x0F] +
|
||||||
|
HEX_CHARS[(h5 >> 28) & 0x0F] + HEX_CHARS[(h5 >> 24) & 0x0F] +
|
||||||
|
HEX_CHARS[(h5 >> 20) & 0x0F] + HEX_CHARS[(h5 >> 16) & 0x0F] +
|
||||||
|
HEX_CHARS[(h5 >> 12) & 0x0F] + HEX_CHARS[(h5 >> 8) & 0x0F] +
|
||||||
|
HEX_CHARS[(h5 >> 4) & 0x0F] + HEX_CHARS[h5 & 0x0F] +
|
||||||
|
HEX_CHARS[(h6 >> 28) & 0x0F] + HEX_CHARS[(h6 >> 24) & 0x0F] +
|
||||||
|
HEX_CHARS[(h6 >> 20) & 0x0F] + HEX_CHARS[(h6 >> 16) & 0x0F] +
|
||||||
|
HEX_CHARS[(h6 >> 12) & 0x0F] + HEX_CHARS[(h6 >> 8) & 0x0F] +
|
||||||
|
HEX_CHARS[(h6 >> 4) & 0x0F] + HEX_CHARS[h6 & 0x0F];
|
||||||
|
if (!this.is224) {
|
||||||
|
hex += HEX_CHARS[(h7 >> 28) & 0x0F] + HEX_CHARS[(h7 >> 24) & 0x0F] +
|
||||||
|
HEX_CHARS[(h7 >> 20) & 0x0F] + HEX_CHARS[(h7 >> 16) & 0x0F] +
|
||||||
|
HEX_CHARS[(h7 >> 12) & 0x0F] + HEX_CHARS[(h7 >> 8) & 0x0F] +
|
||||||
|
HEX_CHARS[(h7 >> 4) & 0x0F] + HEX_CHARS[h7 & 0x0F];
|
||||||
|
}
|
||||||
|
return hex;
|
||||||
|
};
|
||||||
|
|
||||||
|
Sha256.prototype.toString = Sha256.prototype.hex;
|
||||||
|
|
||||||
|
Sha256.prototype.digest = function () {
|
||||||
|
this.finalize();
|
||||||
|
|
||||||
|
var h0 = this.h0, h1 = this.h1, h2 = this.h2, h3 = this.h3, h4 = this.h4, h5 = this.h5,
|
||||||
|
h6 = this.h6, h7 = this.h7;
|
||||||
|
|
||||||
|
var arr = [
|
||||||
|
(h0 >> 24) & 0xFF, (h0 >> 16) & 0xFF, (h0 >> 8) & 0xFF, h0 & 0xFF,
|
||||||
|
(h1 >> 24) & 0xFF, (h1 >> 16) & 0xFF, (h1 >> 8) & 0xFF, h1 & 0xFF,
|
||||||
|
(h2 >> 24) & 0xFF, (h2 >> 16) & 0xFF, (h2 >> 8) & 0xFF, h2 & 0xFF,
|
||||||
|
(h3 >> 24) & 0xFF, (h3 >> 16) & 0xFF, (h3 >> 8) & 0xFF, h3 & 0xFF,
|
||||||
|
(h4 >> 24) & 0xFF, (h4 >> 16) & 0xFF, (h4 >> 8) & 0xFF, h4 & 0xFF,
|
||||||
|
(h5 >> 24) & 0xFF, (h5 >> 16) & 0xFF, (h5 >> 8) & 0xFF, h5 & 0xFF,
|
||||||
|
(h6 >> 24) & 0xFF, (h6 >> 16) & 0xFF, (h6 >> 8) & 0xFF, h6 & 0xFF
|
||||||
|
];
|
||||||
|
if (!this.is224) {
|
||||||
|
arr.push((h7 >> 24) & 0xFF, (h7 >> 16) & 0xFF, (h7 >> 8) & 0xFF, h7 & 0xFF);
|
||||||
|
}
|
||||||
|
return arr;
|
||||||
|
};
|
||||||
|
|
||||||
|
Sha256.prototype.array = Sha256.prototype.digest;
|
||||||
|
|
||||||
|
Sha256.prototype.arrayBuffer = function () {
|
||||||
|
this.finalize();
|
||||||
|
|
||||||
|
var buffer = new ArrayBuffer(this.is224 ? 28 : 32);
|
||||||
|
var dataView = new DataView(buffer);
|
||||||
|
dataView.setUint32(0, this.h0);
|
||||||
|
dataView.setUint32(4, this.h1);
|
||||||
|
dataView.setUint32(8, this.h2);
|
||||||
|
dataView.setUint32(12, this.h3);
|
||||||
|
dataView.setUint32(16, this.h4);
|
||||||
|
dataView.setUint32(20, this.h5);
|
||||||
|
dataView.setUint32(24, this.h6);
|
||||||
|
if (!this.is224) {
|
||||||
|
dataView.setUint32(28, this.h7);
|
||||||
|
}
|
||||||
|
return buffer;
|
||||||
|
};
|
||||||
|
|
||||||
|
function HmacSha256(key, is224, sharedMemory) {
|
||||||
|
var i, type = typeof key;
|
||||||
|
if (type === 'string') {
|
||||||
|
var bytes = [], length = key.length, index = 0, code;
|
||||||
|
for (i = 0; i < length; ++i) {
|
||||||
|
code = key.charCodeAt(i);
|
||||||
|
if (code < 0x80) {
|
||||||
|
bytes[index++] = code;
|
||||||
|
} else if (code < 0x800) {
|
||||||
|
bytes[index++] = (0xc0 | (code >> 6));
|
||||||
|
bytes[index++] = (0x80 | (code & 0x3f));
|
||||||
|
} else if (code < 0xd800 || code >= 0xe000) {
|
||||||
|
bytes[index++] = (0xe0 | (code >> 12));
|
||||||
|
bytes[index++] = (0x80 | ((code >> 6) & 0x3f));
|
||||||
|
bytes[index++] = (0x80 | (code & 0x3f));
|
||||||
|
} else {
|
||||||
|
code = 0x10000 + (((code & 0x3ff) << 10) | (key.charCodeAt(++i) & 0x3ff));
|
||||||
|
bytes[index++] = (0xf0 | (code >> 18));
|
||||||
|
bytes[index++] = (0x80 | ((code >> 12) & 0x3f));
|
||||||
|
bytes[index++] = (0x80 | ((code >> 6) & 0x3f));
|
||||||
|
bytes[index++] = (0x80 | (code & 0x3f));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
key = bytes;
|
||||||
|
} else {
|
||||||
|
if (type === 'object') {
|
||||||
|
if (key === null) {
|
||||||
|
throw new Error(ERROR);
|
||||||
|
} else if (ARRAY_BUFFER && key.constructor === ArrayBuffer) {
|
||||||
|
key = new Uint8Array(key);
|
||||||
|
} else if (!Array.isArray(key)) {
|
||||||
|
if (!ARRAY_BUFFER || !ArrayBuffer.isView(key)) {
|
||||||
|
throw new Error(ERROR);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
throw new Error(ERROR);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (key.length > 64) {
|
||||||
|
key = (new Sha256(is224, true)).update(key).array();
|
||||||
|
}
|
||||||
|
|
||||||
|
var oKeyPad = [], iKeyPad = [];
|
||||||
|
for (i = 0; i < 64; ++i) {
|
||||||
|
var b = key[i] || 0;
|
||||||
|
oKeyPad[i] = 0x5c ^ b;
|
||||||
|
iKeyPad[i] = 0x36 ^ b;
|
||||||
|
}
|
||||||
|
|
||||||
|
Sha256.call(this, is224, sharedMemory);
|
||||||
|
|
||||||
|
this.update(iKeyPad);
|
||||||
|
this.oKeyPad = oKeyPad;
|
||||||
|
this.inner = true;
|
||||||
|
this.sharedMemory = sharedMemory;
|
||||||
|
}
|
||||||
|
HmacSha256.prototype = new Sha256();
|
||||||
|
|
||||||
|
HmacSha256.prototype.finalize = function () {
|
||||||
|
Sha256.prototype.finalize.call(this);
|
||||||
|
if (this.inner) {
|
||||||
|
this.inner = false;
|
||||||
|
var innerHash = this.array();
|
||||||
|
Sha256.call(this, this.is224, this.sharedMemory);
|
||||||
|
this.update(this.oKeyPad);
|
||||||
|
this.update(innerHash);
|
||||||
|
Sha256.prototype.finalize.call(this);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
var exports = createMethod();
|
||||||
|
exports.sha256 = exports;
|
||||||
|
exports.sha224 = createMethod(true);
|
||||||
|
exports.sha256.hmac = createHmacMethod();
|
||||||
|
exports.sha224.hmac = createHmacMethod(true);
|
||||||
|
|
||||||
|
if (COMMON_JS) {
|
||||||
|
module.exports = exports;
|
||||||
|
} else {
|
||||||
|
root.sha256 = exports.sha256;
|
||||||
|
root.sha224 = exports.sha224;
|
||||||
|
if (AMD) {
|
||||||
|
define(function () {
|
||||||
|
return exports;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})();
|
7
public/stylesheets/bootstrap.min.css
vendored
Normal file
7
public/stylesheets/bootstrap.min.css
vendored
Normal file
File diff suppressed because one or more lines are too long
1
public/stylesheets/bootstrap.min.css.map
Normal file
1
public/stylesheets/bootstrap.min.css.map
Normal file
File diff suppressed because one or more lines are too long
33
public/stylesheets/style.css
Normal file
33
public/stylesheets/style.css
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
body {
|
||||||
|
padding: 50px;
|
||||||
|
font: 14px "Lucida Grande", Helvetica, Arial, sans-serif;
|
||||||
|
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
|
||||||
|
font-size: 16px;
|
||||||
|
line-height: 25px;
|
||||||
|
}
|
||||||
|
|
||||||
|
h5 {
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
|
|
||||||
|
input, select {
|
||||||
|
max-width: 500px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#p-error {
|
||||||
|
color: red;
|
||||||
|
font-weight: bold;
|
||||||
|
padding-top: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.li-browser-good {
|
||||||
|
color: green;
|
||||||
|
}
|
||||||
|
|
||||||
|
.li-browser-maybe {
|
||||||
|
color: orange;
|
||||||
|
}
|
||||||
|
|
||||||
|
.li-browser-bad {
|
||||||
|
color: red;
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user