1
0
Fork 0
mirror of https://github.com/voltbonn/diversity.volt.link.git synced 2024-06-24 23:10:57 +00:00

feat: copied old frontend code

This commit is contained in:
thomasrosen 2022-11-19 23:36:12 +01:00
parent 80d5b3fcfa
commit 6ab3575302
35 changed files with 7299 additions and 5 deletions

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

486
frontend/_DATA_.js Normal file
View file

@ -0,0 +1,486 @@
const _DATA_ = {
translation_texts: {
website_title: {
is_plain: true,
prefix: 'Volt - ',
use_instead: 'website_heading',
},
website_heading: {
de: 'Umfrage zur\ninternen Diversität',
en: 'Internal\nDiversity\nSurvey',
},
website_description: {
// de: `
// Um unseren internen Diversitäts-Ansprüchen nachkommen zu können, müssen wir rausfinden wie divers wir sind.
// Mit dieser Umfrage möchten wir ein Bild davon bekommen.
// `,
de: `
Um unseren internen Diversitäts-Ansprüchen nachzukommen, müssen wir rausfinden wie divers wir sind.
Mit dieser Umfrage machen wir uns ein Bild davon.
`,
en: `
To meet our internal diversity goals, we need to find out how diverse we actually are.
With this survey, we'll get a picture of that.
`,
},
//website_privacy: {de:`
// <span class="markedText dark_on_light">Da uns <strong class="markedText black_on_orange">Privatsphäre</strong> wichtig ist, werden die Antworten jeweils zur Frage gruppiert gespeichert, sodass die hier eingegebenen Daten <strong>nicht auf dich zurückführbar</strong> sind.</span>
//
// <span class="markedText light_on_dark">Zu den einzelnen Datensätzen werden nur die im folgenden Kasten genannten Metadaten gespeichert.</span>
//
// <span class="markedText light_on_dark">Bei Fragen kannst du dich an <a href="mailto:thomas.rosen@volteuropa.org">thomas.rosen@volteuropa.org</a> wenden.</span>
//`},
// necessary_metadata: {de: 'Benötigte Metadaten: '},
// voluntary_metadata: {de: 'Freiwillige Metadaten: '},
// metadata_running_year: {de: 'Das laufende Jahr:'},
// metadata_running_month: {de: 'Der laufende Monat:'},
// metadata_tatc_info: {de: 'Ein, für jede Frage unterschiedlicher, annonymer Tracking-Code.'},
// metadata_if_it_is_first_completion: {de: 'Ob du das erste Mal an der Umfrage&nbsp;teilnimmst.'},
// your_country: {de: 'Dein Land:'},
// your_city: {de: 'Deine Stadt:'},
// voluntary_metadata_description: {de: 'Jeweils das Land und/oder das Städteteam in dem du am aktivsten&nbsp;bist.'},
button_to_privacy: {
de: 'Los geht\'s',
en: 'Let\'s start',
},
heading_privacy: {
de: 'Privatsphäre und Datenschutz',
en: 'Privacy',
},
heading_optional: {
de: 'Freiwillig',
en: 'Optional',
},
optional_info: {
de: 'Beantworte nur die Fragen die du beantworten möchtest.',
en: 'Only answer the questions you want to answer.',
},
heading_anonymous: {
de: 'Anonym',
en: 'Anonymous',
},
anonymous_info: {
de: 'Die Antworten werden jeweils zur Frage gruppiert gespeichert. Rückschlüsse auf Dich sind nicht möglich.',
en: 'The answers are saved in groups for each question. It is not possible to draw conclusions about you.',
},
privacy_details: {
de: `
Zu jeder Frage werden das aktuelle Jahr und der aktuelle Monat gespeichert. Optional werden dazu noch dein Land und deine Stadt gespeichert.
Volt Europa verwendet Deine im Rahmen dieser Umfrage angegebenen Daten ausschließlich, um die Umfrage auszuwerten und die Ergebnisse gegebenenfalls mit Mitgliedern von Volt Europa zu teilen. Weitere Informationen kannst Du unserer Datenschutzerklärung auf <a target="_blank" href="https://www.volteuropa.org/privacy">www.volteuropa.org/privacy</a> entnehmen.
Bei Fragen zu dieser Umfrage kannst du dich an <a target="_blank" href="mailto:thomas.rosen@volteuropa.org">thomas.rosen@volteuropa.org</a> wenden.
`,
en: `
For each question the current year and month are saved. Optionally, your current country and city are saved as well.
Volt Europa will only use the information you provide in this survey for the purpose of evaluating the survey and sharing the results with Volt Europa members, if applicable. For more information, please see our privacy policy at <a target="_blank" href="https://www.volteuropa.org/privacy">www.volteuropa.org/privacy</a>.
If you have any questions about this survey, please contact <a target="_blank" href="mailto:thomas.rosen@volteuropa.org">thomas.rosen@volteuropa.org</a>.
`,
},
button_to_questions: {
de: 'Zu den Fragen',
en: 'To the questions',
},
metadata_is_this_the_first_completion: {
de: 'Nimmst du das erste Mal an der Umfrage teil?',
en: 'Is this your first time participating in the survey?',
},
button_send_to_volt: {
de: 'An Volt senden',
en: 'Send to Volt',
},
saving: {
de: 'Deine Antworten werden gespeichert…',
en: 'Your answers are being saved…',
},
success: {
de: 'Deine Antworten wurden gespeichert!',
en: 'Your answers have been saved!',
},
error: {
de: 'Es gab ein technisches Problem!\nBist du eventuell nicht mit dem Internet verbunden?\n\nMelde dich bei Bedarf bei Thomas Rosen.',
en: 'There was a technical problem! Perhaps you are not connected to the internet?\n\nContact Thomas Rosen if necessary.',
},
results: {
de: 'Ergebnisse',
en: 'Results',
},
},
sections: [
{
heading: {
de: 'Metadaten',
en: 'Metadata',
},
questions: {
metadata_country: {
question: {
de: 'Dein Land',
en: 'Your country',
},
type: 'chooser',
options: {},
},
metadata_city: {
question: {
de: 'Dein Städteteam',
en: 'Your cityteam',
},
type: 'one_line_text',
},
}
},
{
heading: {
de: 'Bildung',
en: 'Education',
},
questions: {
highest_degree_of_education: {
question: { de: 'Dein höchster Bildungsabschluss…' },
// why: {de: 'Aus welcher Bildungsschicht kommen unsere Mitglieder?'},
type: 'radio', // 'chooser',
options: {
'none': { de: 'Kein Abschluss' },
'ISCED_1': { de: 'Vollendung der Grundschule' },
'ISCED_2': { de: 'Haupt- / Realschulabschluss' },
'ISCED_3': { de: 'Abitur' },
'ISCED_4': { de: 'Fachhochschulreife / Fachabitur' }, // {de: 'Fachhochschulreife / Fachgebundene Hochschulreife(Fachabitur)'},
'ISCED_5': { de: 'Meister' },
'ISCED_6': { de: 'Bachelor / Diplom(FH)' },
'ISCED_7': { de: 'Master / Diplom(Uni)' },
'ISCED_8': { de: 'Doktorat / PhD' },
}
},
good_communication_in_english: {
question: { de: 'Kannst du dich gut auf Englisch verständigen?' },
why: { de: 'Als internationale Organisation wird viel auf Englisch kommuniziert. Hiermit möchten wir schauen, ob mehr in die einzelnen Sprachen übersetzt werden sollte.' },
type: 'radio',
options: {
'yes': {
de: 'Ja',
en: 'Yes',
},
'no': {
de: 'Nein',
en: 'No',
},
}
},
problems_with_computers: {
question: { de: 'Hast du gelegentlich/oft Probleme dich am Computer oder Handy zurecht zu finden?' },
why: { de: 'Wir schauen hiermit, wie viel wir innerhalb von Volt auf technische Lösungen setzten können?' },
type: 'radio',
options: {
'yes': { de: '(Eher) Ja' },
'no': { de: '(Eher) Nein' },
'depends': { de: 'Kommt drauf an (Gerät, Betriebsystem, Anwendung,…)' },
}
},
}
},
{
heading: { de: 'Kultur' },
questions: {
amount_of_kown_languages: {
question: { de: 'Wie viele Sprachen kannst du sprechen/verstehen?' },
why: { de: 'Austausch über die eigene Sprach-Bubble hinaus.' },
info: { de: 'Zähl auch Mutter- und Gebärdensprachen dazu.' },
type: 'radio',
options: {
'1': { de: '1' },
'2': { de: '2' },
'3': { de: '3' },
'4': { de: '4' },
'5+': { de: '5 oder mehr' },
}
},
different_country_of_origin: {
question: { de: 'Lebst du in einem anderen Land als du geboren bist?' },
why: { de: 'Wissen anderer Kulturen in Volt.' },
type: 'radio',
options: {
'yes': {
de: 'Ja',
en: 'Yes',
},
'no': {
de: 'Nein',
en: 'No',
},
}
},
}
},
{
heading: { de: 'LGBTQ*' },
questions: {
gender: {
question: { de: 'Wie bezeichnest du dein Gender?' },
why: { de: 'Gender ist nicht das Geschlecht in deinem Ausweiß, sondern beschreibt die nicht an biologische Merkmale gebundenen Geschlechtsaspekte des Menschen.' },
type: 'radio', // 'chooser',
options: {
'female': { de: 'weiblich' },
'male': { de: 'männlich' },
'non_binary': { de: 'non-binary / weder weiblich noch männlich' },
'gender_fluid': { de: 'gender-fluid' },
'not_sure': { de: 'Ich bin mir nicht sicher.' },
'terms_dont_fit': { de: 'Diese Begriffe passen nicht zu mir.' },
},
},
gender_identity: {
question: { de: 'Wie bezeichnest du deine Geschlechtsidentität?' },
why: { de: 'Um die Probleme einer Trans-Person vollständig nachvollziehen zu können, muss man selbst Trans* sein. Daher sollten wir wissen, wie gut wir zu diesem Thema aufgestellt sind.' },
info: { de: 'Cisgender: Biologisches Geschlecht und Gender sind gleich.' },
type: 'radio', // 'chooser',
options: {
'transgender': { de: 'Transgender' },
'cisgender': { de: 'Cisgender' },
'not_sure': { de: 'Ich bin mir nicht sicher' },
'terms_dont_fit': { de: 'Diese Begriffe passen nicht zu mir.' },
},
},
sexual_orientation: {
question: { de: 'Wie bezeichnest du deine sexuelle Orientierung?' },
why: { de: 'Um die Probleme einer queeren Person vollständig nachvollziehen zu können, muss man queer sein. Daher sollten wir wissen, wie gut wir zu diesem Thema aufgestellt sind.' },
type: 'radio', // 'chooser',
options: {
'homosexual': { de: 'homosexuell / lesbisch / schwul / …' },
'interested_in_more_than_one_gender': { de: 'bisexuell / pansexuell / polysexuell / …' }, // {de: 'bisexuell / bi / ambisexuell / pansexuell / polysexuell / …'},
'queer': { de: 'queer' },
'asexual': { de: 'asexuell' },
'heterosexual': { de: 'heterosexuell / straight' },
'not_sure': { de: 'Ich bin mir nicht sicher.' },
'terms_dont_fit': { de: 'Diese Begriffe passen nicht zu mir.' },
},
},
},
},
{
heading: { de: 'Diskriminierung' },
// Diskriminierung sollte hinter LGBTQ* sein, da wir dort den Begriff "Gender" erklären. (EN: Discrimination should be after LGBTQ*, cause we teach the term "gender" in it.)
questions: {
discriminatory_experiences: {
question: { de: 'In welchen Bereichen hast du schonmal diskriminierende Erfahrungen gemacht?' },
// why: {de: 'Hier mit möchten wir herrausfinden, wie privilegiert Volt Mitglieder sind.'},
type: 'checkbox',
options: {
'ancestry': { de: 'Ethnische Herkunft oder Hauttyp' },
'sex_or_gender': { de: 'Geschlecht oder Gender' },
'sexual_orientation': { de: 'Sexuelle Orientierung' },
'age': { de: 'Alter' },
'disabilities': { de: 'Behinderung oder chronische Krankheit' },
'ideology': { de: 'Religion oder Weltanschauung' },
'classism': { de: 'Vermögen oder sozialen Herkunft' },
'other': { de: 'andere Bereiche' },
},
},
// discriminatory_experiences_within_volt: {
// question: {de: 'Hast diskriminierende Erfahrungen innerhalb von Volt gemacht?'},
// // why: {de: 'Hier mit möchten wir herrausfinden, wie privilegiert Volt Mitglieder sind.'},
// type: 'checkbox',
// options: {
// 'yes': {de: 'Ja'},
// 'no': {de: 'Nein'},
// },
// },
},
},
{
heading: { de: 'Psyche' },
questions: {
psychological_difficulties: {
question: { de: 'Hast du (unabhängig von einer psychiatrischen Diagnose) mit anhaltenden oder immer wiederkehrenden psychischen Schwierigkeiten zu tun haben?' },
why: { de: 'Unsere Reaktion auf, für uns ungewohntes Verhalten der Mitglieder.' },
type: 'radio',
options: {
'yes': {
de: 'Ja',
en: 'Yes',
},
'no': {
de: 'Nein',
en: 'No',
},
}
},
//introverted_or_extroverted: {
// question: {de: 'Bist du eher introvertiert oder extrovertiert?'},
// why: {de: 'Wir müssen auch auf Mitglieder achten, die sich bei Diskussion nicht selbstständig durchsetzten? Oder denen viele Menschen ab und zu zuanstrengend sind.'},
// type: 'radio',
// options: {
// 'more_introverted': {de: 'eher introvertiert'},
// 'terms_dont_fit': {de: 'je nachdem / weder noch / kommt drauf an'},
// 'more_extroverted': {de: 'eher extrovertiert'},
// }
//},
participating_in_offline_discussions: {
question: { de: 'Wie wohl würdest du dich fühlen, an einer Diskussion bei einer face-to-face Veranstaltung (z.B. einem Meet & Greet) teilzunehmen?' },
why: { de: 'Wir müssen auch auf Mitglieder achten, die sich bei Diskussion nicht selbstständig durchsetzten, oder denen viele Menschen ab und zu zuanstrengend sind.' },
type: 'radio',
options: {
'5': { de: 'Sehr wohl' },
'4': { de: 'Eher wohl' }, // Einigermaßen wohl
'3': { de: 'Weder noch' },
'2': { de: 'Eher unwohl' }, // Einigermaßen unwohl
'1': { de: 'Sehr unwohl' },
}
},
participating_in_online_discussions: {
question: { de: 'Wie wohl würdest du dich fühlen, an einer Diskussion auf Workplace (oder einem anderen Online-Tool) teilzunehmen?' },
why: { de: '(Begründung, siehe vorherige Frage.)' },
type: 'radio',
options: {
'5': { de: 'Sehr wohl' },
'4': { de: 'Eher wohl' },
'3': { de: 'Weder noch' },
'2': { de: 'Eher unwohl' },
'1': { de: 'Sehr unwohl' },
}
},
},
},
{
heading: { de: 'Hilfsmittel' },
questions: {
everyday_aids: {
question: { de: 'Welche Hilfsmittel benötigst du im Alltag?' },
why: { de: 'Erreichbarkeit und Verständigung bei den Events.' },
type: 'checkbox',
options: {
'wheelchair': { de: 'Rollstuhl' },
'walking_aid': { de: 'Rollator / Krücken / Gehstock / …' },
'hearing_aid': { de: 'Hörgerät / Mikrofon' },
'seeing_aid': { de: 'Brille / Lupe' },
'assistance': { de: 'Assistenz (Tier, Mensch oder Roboter)' },
'prosthesis': { de: 'Prothese' },
'orthosis': { de: 'Orthese' },
'other': { de: 'andere Hilfsmittel' }, // (Screenreader, Brailledisplay, …)
}
},
financial_help: {
question: { de: 'Bekommst du finanzielle Hilfe. (Bafög, Hartz4, Jugendamt, …)' },
why: { de: 'Je nach verfügbarer Geldmenge kann man einfacher an bestimmten Events teilnehmen.' },
type: 'radio',
options: {
'yes': {
de: 'Ja',
en: 'Yes',
},
'no': {
de: 'Nein',
en: 'No',
},
}
},
}
},
{
heading: { de: 'Verbesserung der Umfrage' },
intro: { de: 'Die ist unsere erste Umfrage dieser Art. Hier kannst du uns helfen diese weiter zu entwickeln …' },
questions: {
text_whats_missing: {
question: { de: 'Welche Merkmale fehlen Deiner Meinung nach hier, sind aber aus Deiner Sicht für Diversität in Volt wichtig?' },
// why: '',
info: { de: '(und sollten noch abgefragt werden)' },
type: 'text',
},
text_whats_to_much: {
question: { de: 'Welche Merkmale sollten wir künftig nicht mehr abfragen?' },
// why: '(Hinweis: Alle Antworten sind freiwillig!)',
type: 'text',
},
text_other_stuff: {
question: { de: 'Sonstige Anmerkungen?' },
// why: '',
type: 'text',
},
},
},
],
countries: [
// The List is from: https://volt.team/teams
{ title: 'Keine Angabe' },
{ disabled: true },
{ value: 'AUT', local_name: 'Österreich', en: 'Austria' },
{ value: 'BEL', local_name: 'Belgique / Belgie', en: 'Belgium' },
{ value: 'BGR', local_name: 'Bulgaria', en: 'Bulgaria' },
{ value: 'CYP', local_name: 'Kibris / Kypros', en: 'Cyprus' },
{ value: 'CZE', local_name: 'Ceska Republika', en: 'Czech Republic' },
{ value: 'DNK', local_name: 'Danmark', en: 'Denmark' },
{ value: 'DEU', local_name: 'Deutschland', en: 'Germany' },
{ value: 'EST', local_name: 'Eesti Vabariik', en: 'Estonia' },
{ value: 'IRL', local_name: 'Éire', en: 'Ireland' },
{ value: 'ESP', local_name: 'España', en: 'Spain' },
{ value: 'FRA', local_name: 'France', en: 'France' },
{ value: 'GRC', local_name: 'Ellas / Ellada', en: 'Greece' },
{ value: 'HRV', local_name: 'Hrvatska', en: 'Croatia' },
{ value: 'HUN', local_name: 'Magyarorszag', en: 'Hungary' },
{ value: 'ITA', local_name: 'Italia', en: 'Italy' },
{ value: 'LVA', local_name: 'Latvija', en: 'Latvia' },
{ value: 'LTU', local_name: 'Lietuva', en: 'Lithuania' },
{ value: 'LUX', local_name: 'Luxembourg / Letzebuerg', en: 'Luxembourg' },
{ value: 'MLT', local_name: 'Malta', en: 'Malta' },
{ value: 'NLD', local_name: 'Nederland / Holland', en: 'Netherlands' },
{ value: 'POL', local_name: 'Polska', en: 'Poland' },
{ value: 'PRT', local_name: 'Portugal', en: 'Portugal' },
{ value: 'ROU', local_name: 'Romania', en: 'Romania' },
{ value: 'SVK', local_name: 'Slovensko', en: 'Slovakia' },
{ value: 'SVN', local_name: 'Slovenija', en: 'Slovenia' },
{ value: 'FIN', local_name: 'Suomi', en: 'Finland' },
{ value: 'SWE', local_name: 'Sverige', en: 'Sweden' },
{ value: 'GBR', local_name: 'United Kingdom', en: 'United Kingdom' },
// Volt New Territories:
{ disabled: true },
{ value: 'ALA', local_name: 'Landskapet Åland / Ahvenanmaan maakunta', en: 'Åland Islands' },
{ value: 'ALB', local_name: 'Shqiperia', en: 'Albania' },
{ value: 'AND', local_name: 'Andorra', en: 'Andorra' },
{ value: 'BIH', local_name: 'Bosna i Hercegovina', en: 'Bosnia and Herzegovina' },
{ value: 'FRO', local_name: 'Føroyar', en: 'Faroe Islands' },
{ value: 'GIB', local_name: 'Gibraltar', en: 'Gibraltar' },
{ value: 'GGY', local_name: 'Guernsey', en: 'Guernsey' },
{ value: 'ISL', local_name: 'Ísland', en: 'Iceland' },
{ value: 'IMN', local_name: 'Isle of Man', en: 'Isle of Man' },
{ value: 'JEY', local_name: 'Jersey', en: 'Jersey' },
{ value: 'LIE', local_name: 'Liechtenstein', en: 'Liechtenstein' },
{ value: 'MKD', local_name: 'Makedonija', en: 'Macedonia (FYROM)' },
{ value: 'MDA', local_name: 'Moldova', en: 'Moldova' },
{ value: 'MCO', local_name: 'Monaco', en: 'Monaco' },
{ value: 'MNE', local_name: 'Crna Gora', en: 'Montenegro' },
{ value: 'NOR', local_name: 'Norge', en: 'Norway' },
{ value: 'SMR', local_name: 'San Marino', en: 'San Marino' },
{ value: 'CHE', local_name: 'Schweiz / Suisse / Svizzera', en: 'Switzerland' },
{ value: 'BLR', local_name: 'Беларусь', en: 'Belarus' },
{ value: 'SRB', local_name: 'Србија', en: 'Serbia' },
{ value: 'UKR', local_name: 'Україна', en: 'Ukraine' },
{ disabled: true },
{ value: 'Volt Abroad', title: 'Volt Abroad (Australia, Canada, Singapore, Thailand, Uruguay, USA, …)' },
// TODO: Should there be an entry "Volt Europa"?
]
}
try {
if (!!module && module.exports) {
module.exports = _DATA_
}
} catch (error) {
if (!!_DATA_GOT_LOADED) {
_DATA_GOT_LOADED()
}
}

1578
frontend/index.html Normal file

File diff suppressed because one or more lines are too long

2
frontend/jsSHA/.gitignore vendored Executable file
View file

@ -0,0 +1,2 @@
node_modules/
*.pyc

3
frontend/jsSHA/.npmignore Executable file
View file

@ -0,0 +1,3 @@
build
test
src/sha_dev.js

4
frontend/jsSHA/.travis.yml Executable file
View file

@ -0,0 +1,4 @@
language: node_js
node_js:
- "node"

164
frontend/jsSHA/CHANGELOG.md Executable file
View file

@ -0,0 +1,164 @@
jsSHA - ChangeLog
=========================
2.3.1 (2017-06-10)
-------------------------
- Fix issue with SHA-3 and using a combination of TEXT/UTF-16 input
(thanks frostschutz!)
2.3.0 (2017-05-13)
-------------------------
- Sped up SHA-3 implementation by adding little-endian capability to
conversion functions
- Further sped up SHA-3 implementation by decomposing xor\_64 function
(thanks frostschutz!)
- Fixed incorrect results when using ArrayBuffers (thanks conref!)
- Added externs/sha.js for Google Closure Compiler users (thanks IvanRF!)
2.2.0 (2016-07-10)
-------------------------
- Added support for the SHA-3 family of hashes (SHA3-224, SHA3-256,
SHA3-384, SHA3-512, SHAKE128, and SHAKE256)
- Fixed bug with using ARRAYBUFFER as a HMAC key type
- Switched testing framework to Mocha and Chai
2.1.0 (2016-05-13)
-------------------------
- Added ability to call `update` on hashes between `getHash` and `getHMAC` calls
- Added new input and output type, "ARRAYBUFFER" which is a JavaScript
ArrayBuffer
- Now keeping smaller build files in NPM (thanks vogievetsky!)
- Fixed problem with hashing strings over 4 billion bits (thanks Eicar!)
2.0.2 (2015-10-31)
-------------------------
- Fixed inability to have a blank "b64Pad" (thanks xlc!)
- Added file hashing test (thanks kofalt!)
2.0.1 (2015-06-25)
-------------------------
- Fixed major issue with all hashes failing if raw input was a particular size
(thanks treus!)
2.0.0 (2015-06-13)
-------------------------
- Completely reworked API to support streaming inputs
- Exceptions now throw Errors instead of strings (thanks jclem!)
1.6.1 (2015-06-25)
-------------------------
- Fixed issue with SHA-512 family of hashes failing is raw input was a
particular size
1.6.0 (2015-03-08)
-------------------------
This marks the last v1.X new feature release. The API is changing
significantly with upcoming v2.0 to support streaming and it will be too
difficult to support the older API style with new features.
- Added a BYTES input and output format that is a raw byte string
- Fixed broken AMD support (thanks drewcovi!)
- Fixed broken UTF-8 parsing on non-BMP Unicode characters
- Changed array references to remove warnings on Icedove
- Replaced "UTF16" encoding with "UTF16BE" (big endian) and "UTF16LE" (little
endian) to remove confusion
1.5.1 (2013-12-15)
-------------------------
- Changed Google Closure Compiler options to produce "strict" compatible code
1.5 (2013-12-15)
-------------------------
- Added optional numRounds argument to getHash
- Note: this necessitated removing the hash result caching functionality
- Reduced file size by optimizing internal constants
- Removed charSize input and replaced with encoding to handle Unicode. NOTE:
Only Code points up to 0xFFFF are supported.
- charSize = 16 is effectively replaced by encoding = "UTF16"
- charSize = 8 was wrong in terms of handling UTF-8 and has been replaced by
encoding = "UTF8"
- Changed method of referencing "window" to be compatible with WebWorkers,
Node.js, and AMD (thanks piranna!)
1.42 (2012-12-28)
-------------------------
- Readded v1.4 Safari patch to support older versions
1.41 (2012-12-23)
-------------------------
- Fixed incorrect hash issue with Chrome x64 v25 (Dev channel), also provides
stable patch to v1.4 Safari issue.
1.4 (2012-12-08)
-------------------------
- Added new input type, TEXT, that is functionally identical to ASCII*
- Added new input type, B64, for base-64 encoded strings
- Added new input and output formatting parameters
- `getHash` and `getHMAC` take an optional parameter, outputFormatOpts,
that is a hash list containing the keys "outputUpper" (boolean, only
applicable to HEX output) and "b64Pad" (string, only applicable to Base-64
output) that have default values of false and "=", respectively
- jsSHA constructor takes an optional parameter, charSize (8 or 16) that
specifies the character width of the input (TEXT and ASCII input only)
- Modified comments to be Google Closure Compiler compliant
- Added a SUPPORTED_ALGS flag that, when used with the Google Closure Compiler,
will remove unused functions/function portions
- Removed all src/*_nice.js files as the SUPPORTED_ALGS flag renders them
obsolete
- All production-ready files are now produced using the Google Closure Compiler
with ADVANCED_OPTIMIZATIONS resulting in further reduced filesizes
- The SHA-1 only implementation now requires that that "SHA-1" be specified as
the variant when using getHash and getHMAC
- Removed test/HMAC.py as new NIST tests made the need for it obsolete
- Significantly changed the test/test.html to make it easier to understand and
to allow for easier adding of test cases
- Replaced previous error returning code with thrown exceptions
- Fix for 64-bit Safari issue (thanks Ron Garret and Chris Warren-Smith!)
- NOTE: While this fix works, it is merely a workaround for a WebKit JavaScript
optimizer bug, see https://bugs.webkit.org/show_bug.cgi?id=88673 for more detail
\* This library misused the term ASCII so input type of TEXT was added with the
intention of deprecating ASCII
1.31 (2012-07-21)
-------------------------
- Updated project URL to point to new GitHub repository
- Added a compressed version of sha.js
1.3 (2010-09-01)
-------------------------
- Changed method of declaring objects/classes
- Moved non-instance specific variables and methods to class scope
- Removed logically correct but unneeded conditionals
1.2 (2009-07-22)
-------------------------
- Added the HMAC algorithm for all supported hashes (using both ASCII and hex
keys)
- As a result of adding HMAC, added support for hash input text to be hex
(ASCII representation of hex)
- Added multiple variants of safeAdd functions, resulting in a significant
performance gain
- Removed wrapper.js file
- Used a different JavaScript compressor resulting in smaller file sizes
1.11 (2008-12-07)
-------------------------
- Fixed a base-64 encoding issue resulting from a missing capital 'X'
1.1 (2008-09-25)
-------------------------
- Fixed an issue with incorrect hashes being generated when jsSHA ojbects were
used to generate multiple hashes
1.0 (2008-09-25)
-------------------------
- Made all functions/variables follow an object-orientated methodology
- Removed support for string hash output as the hash is rarely ASCII friendly
- Changed the interface to calculate hashes (see README)
- Made sha.js validate against [JSLint](http://www.jslint.com/) using
"Recommended" settings
0.1 (2008-02-21)
-------------------------
- Initial public release

26
frontend/jsSHA/LICENSE Executable file
View file

@ -0,0 +1,26 @@
Copyright (c) 2008-2018 Brian Turek, 1998-2009 Paul Johnston & Contributors
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
* Neither the name of the the copyright holder nor the names of its
contributors may be used to endorse or promote products derived from this
software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

125
frontend/jsSHA/README.md Executable file
View file

@ -0,0 +1,125 @@
# jsSHA
A pure JavaScript streaming implementation of the complete Secure Hash Standard
family (SHA-1, SHA-224, SHA3-224, SHA-256, SHA3-256, SHA-384, SHA3-384, SHA-512,
SHA3-512, SHAKE128, and SHAKE256) as well as HMAC.
[![Build Status](https://travis-ci.org/Caligatio/jsSHA.svg?branch=master)](https://travis-ci.org/Caligatio/jsSHA)
## Usage
### Installation
#### Browser
Include the desired JavaScript file (sha.js, sha1.js, sha256.js, sha512.js, or
sha3.js) in your header (sha.js used below):
<script type="text/javascript" src="/path/to/sha.js"></script>
#### Node.js
jsSHA is available through NPM and be installed by simply doing
npm install jssha
To use the module, first require it using:
jsSHA = require("jssha");
### Hashing
Instantiate a new jsSHA object with the desired hash type, input type, and
options as parameters. The hash type can be one of SHA-1, SHA-224, SHA3-224,
SHA-256, SHA3-256, SHA-384, SHA3-384, SHA-512, SHA3-512, SHAKE128, or SHAKE256.
The input type can be one of HEX, TEXT, B64, BYTES, or ARRAYBUFFER. You can
then stream in input using the `update` object function, calling it multiple
times if needed. Finally, simply call `getHash` with the output type as a
parameter (B64, HEX, BYTES, or ARRAYBUFFER). Example to calculate the SHA-512
of "This is a test":
var shaObj = new jsSHA("SHA-512", "TEXT");
shaObj.update("This is a ");
shaObj.update("test");
var hash = shaObj.getHash("HEX");
The constructor takes a hashmap as a optional third argument with possible
properties of `numRounds` and `encoding`. `numRounds` controls the number of
hashing iterations/rounds performed and defaults to a value of 1 if not
specified. `encoding` specifies the encoding used to encode TEXT-type inputs.
Valid options are "UTF8", "UTF16BE", and "UTF16LE", it defaults to "UTF8".
`getHash` also takes a hashmap as an optional second argument. By default the
hashmap is `{"outputUpper" : false, "b64Pad" : "="}`. These options are
intelligently interpreted based upon the chosen output format. **Important**:
SHAKE128 and SHAKE256 require `shakeLen` to be included in the hashmap where
`shakeLen` is the desired output length of the SHAKE algorithm in a multiple
of 8 bits.
### HMAC
Instantiate a new jsSHA object the same way as for hashing. Then set the HMAC
key to be used by calling `setHMACKey` with the key and its input type (this
MUST be done before calling update). You can stream in the input using the
`update` object function just like hashing. Finally, get the HMAC by calling
the `getHMAC` function with the output type as its argument. Example to
calculate the SHA-512 HMAC of the string "This is a test" with the key "abc":
var shaObj = new jsSHA("SHA-512", "TEXT");
shaObj.setHMACKey("abc", "TEXT");
shaObj.update("This is a ");
shaObj.update("test");
var hmac = shaObj.getHMAC("HEX");
`setHMACKey` takes the same input types as the constructor and `getHMAC` takes the
same inputs as `getHash` as described above.
Note: You cannot calculate both the hash and HMAC using the same object.
## Files
**src/sha\_dev.js**
A commented implementation of the entire SHA family of hashes. Not to be used
in production.
**src/sha.js**
A Google Closure Compiler optimized version of the entire library.
**src/sha1.js**
A Google Closure Compiler optimized version the library with non SHA-1
functionality removed.
**src/sha256.js**
A Google Closure Compiler optimized version the library with non SHA-224/SHA-256
functionality removed.
**src/sha3.js**
A Google Closure Compiler optimized version the library with non SHA-3
functionality removed.
**src/sha512.js**
A Google Closure Compiler optimized version the library with non SHA-384/SHA-512
functionality removed.
## Compiling
This library makes use of the [Google Closure Compiler](https://developers.google.com/closure/compiler)
to both boost performance and reduce filesizes. To compile sha\_dev.js into a customized output file,
use a command like the following:
java -jar compiler.jar --define="SUPPORTED_ALGS=<FLAG>" \
--externs /path/to/build/externs.js --warning_level VERBOSE \
--compilation_level ADVANCED_OPTIMIZATIONS \
--js /path/to/sha_dev.js --js_output_file /path/to/sha.js
where FLAG is a bitwise OR of the following values:
* 8 for SHA3
* 4 for SHA-384/SHA-512
* 2 for SHA-224/256
* 1 for SHA-1
## Contact Info
The project's website is located at [https://caligatio.github.com/jsSHA/](https://caligatio.github.com/jsSHA/)
## Donations
Feel like donating? We're now accepting donations through [Bitcoin](bitcoin:12VMZgRAP2jCP1YCR3vFNAtLR9MvzHzJZb?message=jsSHA%20Donation)!

51
frontend/jsSHA/bower.json Executable file
View file

@ -0,0 +1,51 @@
{
"name" : "jsSHA",
"version" : "2.3.1",
"description" : "jsSHA is a JavaScript implementation of the complete Secure Hash Standard family (SHA-1, SHA-224, SHA3-224, SHA-256, SHA3-256, SHA-384, SHA3-384, SHA-512, SHA3-512, SHAKE128, and SHAKE256) as well as HMAC",
"main" : "src/sha.js",
"repository" : {
"type" : "git",
"url" : "https://github.com/Caligatio/jsSHA.git"
},
"keywords" : [
"SHA-1",
"SHA-224",
"SHA3-224",
"SHA-256",
"SHA3-256",
"SHA-384",
"SHA3-384",
"SHA-512",
"SHA3-512",
"SHAKE-128",
"SHAKE-256",
"SHAKE128",
"SHAKE256",
"SHA1",
"SHA224",
"SHA256",
"SHA384",
"SHA512",
"SHA-2",
"SHA2",
"SHA-3",
"SHA3",
"SHAKE",
"HMAC",
"hash"
],
"license" : "BSD-3-Clause",
"authors" : [
"Brian Turek <brian.turek@gmail.com>"
],
"homepage" : "http://caligatio.github.com/jsSHA/",
"ignore": [
"build",
"test",
"src/sha_dev.js"
],
"devDependencies": {
"chai": "^3.5.0",
"mocha": "^2.5.3"
}
}

View file

@ -0,0 +1,5 @@
/* This file is needed so that the Google Closure Compiler does not complain
* about the module, define, and exports variables being undefined */
var module = null;
var define = null;
var exports = null;

View file

@ -0,0 +1,10 @@
#!/bin/bash
declare -A releases
releases=(["sha"]=15 ["sha1"]=1 ["sha256"]=2 ["sha512"]=4 ["sha3"]=8)
CLOSURE_COMPILER=${CLOSURE_COMPILER-"../compiler.jar"}
for i in "${!releases[@]}"
do
java -jar ${CLOSURE_COMPILER} --define="SUPPORTED_ALGS=${releases[$i]}" --externs externs.js --warning_level VERBOSE --compilation_level ADVANCED_OPTIMIZATIONS --language_in=ECMASCRIPT5_STRICT --js ../src/sha_dev.js --js_output_file ../src/$i.js
done

49
frontend/jsSHA/externs/sha.js Executable file
View file

@ -0,0 +1,49 @@
/*
* Copyright 2017 Brian Turek, Ivan Ridao Freitas
*
* Distributed under the BSD License
* See http://caligatio.github.com/jsSHA/ for more information
*/
/*
* Ensure projects don't execute this file.
*/
if (Math.random() < 1) { // always true but the compiler doesn't know that
throw 'Externs file "sha.js" should not be executed';
}
/**
* @constructor
* @param {string} variant The desired SHA variant (SHA-1, SHA-224, SHA-256, SHA-384, SHA-512, SHA3-224, SHA3-256, SHA3-384, or SHA3-512)
* @param {string} inputFormat The format of srcString: HEX, TEXT, B64, BYTES, or ARRAYBUFFER
* @param {{encoding: (string|undefined), numRounds: (number|undefined)}=} options Optional values
* @return {!jsSHA}
*/
function jsSHA(variant, inputFormat, options) {};
/**
* @param {string|ArrayBuffer} key The key used to calculate the HMAC
* @param {string} inputFormat The format of key, HEX, TEXT, B64, BYTES, or ARRAYBUFFER
* @param {{encoding : (string|undefined)}=} options Associative array of input format options
*/
jsSHA.prototype.setHMACKey = function(key, inputFormat, options) {};
/**
* @param {string|ArrayBuffer} srcString The string to be hashed
*/
jsSHA.prototype.update = function(srcString) {};
/**
* @param {string} format The desired output formatting (B64, HEX, BYTES, or ARRAYBUFFER)
* @param {{outputUpper : (boolean|undefined), b64Pad : (string|undefined), shakeLen : (number|undefined)}=} options Hash list of output formatting options
* @return {string|ArrayBuffer} The string representation of the hash in the format specified.
*/
jsSHA.prototype.getHash = function(format, options) {};
/**
* @param {string} format The desired output formatting (B64, HEX, BYTES, or ARRAYBUFFER)
* @param {{outputUpper : (boolean|undefined), b64Pad : (string|undefined), shakeLen : (number|undefined)}=} options associative array of output formatting options
* @return {string|ArrayBuffer} The string representation of the hash in the format specified.
*/
jsSHA.prototype.getHMAC = function(format, options) {};

54
frontend/jsSHA/package.json Executable file
View file

@ -0,0 +1,54 @@
{
"name": "jssha",
"version": "2.3.1",
"description": "jsSHA is a JavaScript implementation of the complete Secure Hash Standard family (SHA-1, SHA-224, SHA3-224, SHA-256, SHA3-256, SHA-384, SHA3-384, SHA-512, SHA3-512, SHAKE128, and SHAKE256) as well as HMAC",
"main": "src/sha.js",
"repository": {
"type": "git",
"url": "https://github.com/Caligatio/jsSHA.git"
},
"keywords": [
"SHA-1",
"SHA-224",
"SHA3-224",
"SHA-256",
"SHA3-256",
"SHA-384",
"SHA3-384",
"SHA-512",
"SHA3-512",
"SHAKE-128",
"SHAKE-256",
"SHAKE128",
"SHAKE256",
"SHA1",
"SHA224",
"SHA256",
"SHA384",
"SHA512",
"SHA-2",
"SHA2",
"SHA-3",
"SHA3",
"SHAKE",
"HMAC",
"hash"
],
"license": "BSD-3-Clause",
"author": "Brian Turek <brian.turek@gmail.com>",
"bugs": {
"url": "https://github.com/Caligatio/jsSHA/issues"
},
"engines": {
"node": "*"
},
"homepage": "https://github.com/Caligatio/jsSHA",
"dependencies": {},
"devDependencies": {
"chai": "^3.5.0",
"mocha": "^2.5.3"
},
"scripts": {
"test": "mocha --reporter spec"
}
}

43
frontend/jsSHA/src/sha.js Executable file
View file

@ -0,0 +1,43 @@
/*
A JavaScript implementation of the SHA family of hashes, as
defined in FIPS PUB 180-4 and FIPS PUB 202, as well as the corresponding
HMAC implementation as defined in FIPS PUB 198a
Copyright 2008-2018 Brian Turek, 1998-2009 Paul Johnston & Contributors
Distributed under the BSD License
See http://caligatio.github.com/jsSHA/ for more information
*/
'use strict';(function(Y){function C(c,a,b){var e=0,h=[],n=0,g,l,d,f,m,q,u,r,I=!1,v=[],w=[],t,y=!1,z=!1,x=-1;b=b||{};g=b.encoding||"UTF8";t=b.numRounds||1;if(t!==parseInt(t,10)||1>t)throw Error("numRounds must a integer >= 1");if("SHA-1"===c)m=512,q=K,u=Z,f=160,r=function(a){return a.slice()};else if(0===c.lastIndexOf("SHA-",0))if(q=function(a,b){return L(a,b,c)},u=function(a,b,h,e){var k,f;if("SHA-224"===c||"SHA-256"===c)k=(b+65>>>9<<4)+15,f=16;else if("SHA-384"===c||"SHA-512"===c)k=(b+129>>>10<<
5)+31,f=32;else throw Error("Unexpected error in SHA-2 implementation");for(;a.length<=k;)a.push(0);a[b>>>5]|=128<<24-b%32;b=b+h;a[k]=b&4294967295;a[k-1]=b/4294967296|0;h=a.length;for(b=0;b<h;b+=f)e=L(a.slice(b,b+f),e,c);if("SHA-224"===c)a=[e[0],e[1],e[2],e[3],e[4],e[5],e[6]];else if("SHA-256"===c)a=e;else if("SHA-384"===c)a=[e[0].a,e[0].b,e[1].a,e[1].b,e[2].a,e[2].b,e[3].a,e[3].b,e[4].a,e[4].b,e[5].a,e[5].b];else if("SHA-512"===c)a=[e[0].a,e[0].b,e[1].a,e[1].b,e[2].a,e[2].b,e[3].a,e[3].b,e[4].a,
e[4].b,e[5].a,e[5].b,e[6].a,e[6].b,e[7].a,e[7].b];else throw Error("Unexpected error in SHA-2 implementation");return a},r=function(a){return a.slice()},"SHA-224"===c)m=512,f=224;else if("SHA-256"===c)m=512,f=256;else if("SHA-384"===c)m=1024,f=384;else if("SHA-512"===c)m=1024,f=512;else throw Error("Chosen SHA variant is not supported");else if(0===c.lastIndexOf("SHA3-",0)||0===c.lastIndexOf("SHAKE",0)){var F=6;q=D;r=function(a){var c=[],e;for(e=0;5>e;e+=1)c[e]=a[e].slice();return c};x=1;if("SHA3-224"===
c)m=1152,f=224;else if("SHA3-256"===c)m=1088,f=256;else if("SHA3-384"===c)m=832,f=384;else if("SHA3-512"===c)m=576,f=512;else if("SHAKE128"===c)m=1344,f=-1,F=31,z=!0;else if("SHAKE256"===c)m=1088,f=-1,F=31,z=!0;else throw Error("Chosen SHA variant is not supported");u=function(a,c,e,b,h){e=m;var k=F,f,g=[],n=e>>>5,l=0,d=c>>>5;for(f=0;f<d&&c>=e;f+=n)b=D(a.slice(f,f+n),b),c-=e;a=a.slice(f);for(c%=e;a.length<n;)a.push(0);f=c>>>3;a[f>>2]^=k<<f%4*8;a[n-1]^=2147483648;for(b=D(a,b);32*g.length<h;){a=b[l%
5][l/5|0];g.push(a.b);if(32*g.length>=h)break;g.push(a.a);l+=1;0===64*l%e&&D(null,b)}return g}}else throw Error("Chosen SHA variant is not supported");d=M(a,g,x);l=A(c);this.setHMACKey=function(a,b,h){var k;if(!0===I)throw Error("HMAC key already set");if(!0===y)throw Error("Cannot set HMAC key after calling update");if(!0===z)throw Error("SHAKE is not supported for HMAC");g=(h||{}).encoding||"UTF8";b=M(b,g,x)(a);a=b.binLen;b=b.value;k=m>>>3;h=k/4-1;if(k<a/8){for(b=u(b,a,0,A(c),f);b.length<=h;)b.push(0);
b[h]&=4294967040}else if(k>a/8){for(;b.length<=h;)b.push(0);b[h]&=4294967040}for(a=0;a<=h;a+=1)v[a]=b[a]^909522486,w[a]=b[a]^1549556828;l=q(v,l);e=m;I=!0};this.update=function(a){var c,b,k,f=0,g=m>>>5;c=d(a,h,n);a=c.binLen;b=c.value;c=a>>>5;for(k=0;k<c;k+=g)f+m<=a&&(l=q(b.slice(k,k+g),l),f+=m);e+=f;h=b.slice(f>>>5);n=a%m;y=!0};this.getHash=function(a,b){var k,g,d,m;if(!0===I)throw Error("Cannot call getHash after setting HMAC key");d=N(b);if(!0===z){if(-1===d.shakeLen)throw Error("shakeLen must be specified in options");
f=d.shakeLen}switch(a){case "HEX":k=function(a){return O(a,f,x,d)};break;case "B64":k=function(a){return P(a,f,x,d)};break;case "BYTES":k=function(a){return Q(a,f,x)};break;case "ARRAYBUFFER":try{g=new ArrayBuffer(0)}catch(p){throw Error("ARRAYBUFFER not supported by this environment");}k=function(a){return R(a,f,x)};break;default:throw Error("format must be HEX, B64, BYTES, or ARRAYBUFFER");}m=u(h.slice(),n,e,r(l),f);for(g=1;g<t;g+=1)!0===z&&0!==f%32&&(m[m.length-1]&=16777215>>>24-f%32),m=u(m,f,
0,A(c),f);return k(m)};this.getHMAC=function(a,b){var k,g,d,p;if(!1===I)throw Error("Cannot call getHMAC without first setting HMAC key");d=N(b);switch(a){case "HEX":k=function(a){return O(a,f,x,d)};break;case "B64":k=function(a){return P(a,f,x,d)};break;case "BYTES":k=function(a){return Q(a,f,x)};break;case "ARRAYBUFFER":try{k=new ArrayBuffer(0)}catch(v){throw Error("ARRAYBUFFER not supported by this environment");}k=function(a){return R(a,f,x)};break;default:throw Error("outputFormat must be HEX, B64, BYTES, or ARRAYBUFFER");
}g=u(h.slice(),n,e,r(l),f);p=q(w,A(c));p=u(g,f,m,p,f);return k(p)}}function b(c,a){this.a=c;this.b=a}function O(c,a,b,e){var h="";a/=8;var n,g,d;d=-1===b?3:0;for(n=0;n<a;n+=1)g=c[n>>>2]>>>8*(d+n%4*b),h+="0123456789abcdef".charAt(g>>>4&15)+"0123456789abcdef".charAt(g&15);return e.outputUpper?h.toUpperCase():h}function P(c,a,b,e){var h="",n=a/8,g,d,p,f;f=-1===b?3:0;for(g=0;g<n;g+=3)for(d=g+1<n?c[g+1>>>2]:0,p=g+2<n?c[g+2>>>2]:0,p=(c[g>>>2]>>>8*(f+g%4*b)&255)<<16|(d>>>8*(f+(g+1)%4*b)&255)<<8|p>>>8*(f+
(g+2)%4*b)&255,d=0;4>d;d+=1)8*g+6*d<=a?h+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(p>>>6*(3-d)&63):h+=e.b64Pad;return h}function Q(c,a,b){var e="";a/=8;var h,d,g;g=-1===b?3:0;for(h=0;h<a;h+=1)d=c[h>>>2]>>>8*(g+h%4*b)&255,e+=String.fromCharCode(d);return e}function R(c,a,b){a/=8;var e,h=new ArrayBuffer(a),d,g;g=new Uint8Array(h);d=-1===b?3:0;for(e=0;e<a;e+=1)g[e]=c[e>>>2]>>>8*(d+e%4*b)&255;return h}function N(c){var a={outputUpper:!1,b64Pad:"=",shakeLen:-1};c=c||{};
a.outputUpper=c.outputUpper||!1;!0===c.hasOwnProperty("b64Pad")&&(a.b64Pad=c.b64Pad);if(!0===c.hasOwnProperty("shakeLen")){if(0!==c.shakeLen%8)throw Error("shakeLen must be a multiple of 8");a.shakeLen=c.shakeLen}if("boolean"!==typeof a.outputUpper)throw Error("Invalid outputUpper formatting option");if("string"!==typeof a.b64Pad)throw Error("Invalid b64Pad formatting option");return a}function M(c,a,b){switch(a){case "UTF8":case "UTF16BE":case "UTF16LE":break;default:throw Error("encoding must be UTF8, UTF16BE, or UTF16LE");
}switch(c){case "HEX":c=function(a,c,d){var g=a.length,l,p,f,m,q,u;if(0!==g%2)throw Error("String of HEX type must be in byte increments");c=c||[0];d=d||0;q=d>>>3;u=-1===b?3:0;for(l=0;l<g;l+=2){p=parseInt(a.substr(l,2),16);if(isNaN(p))throw Error("String of HEX type contains invalid characters");m=(l>>>1)+q;for(f=m>>>2;c.length<=f;)c.push(0);c[f]|=p<<8*(u+m%4*b)}return{value:c,binLen:4*g+d}};break;case "TEXT":c=function(c,h,d){var g,l,p=0,f,m,q,u,r,t;h=h||[0];d=d||0;q=d>>>3;if("UTF8"===a)for(t=-1===
b?3:0,f=0;f<c.length;f+=1)for(g=c.charCodeAt(f),l=[],128>g?l.push(g):2048>g?(l.push(192|g>>>6),l.push(128|g&63)):55296>g||57344<=g?l.push(224|g>>>12,128|g>>>6&63,128|g&63):(f+=1,g=65536+((g&1023)<<10|c.charCodeAt(f)&1023),l.push(240|g>>>18,128|g>>>12&63,128|g>>>6&63,128|g&63)),m=0;m<l.length;m+=1){r=p+q;for(u=r>>>2;h.length<=u;)h.push(0);h[u]|=l[m]<<8*(t+r%4*b);p+=1}else if("UTF16BE"===a||"UTF16LE"===a)for(t=-1===b?2:0,l="UTF16LE"===a&&1!==b||"UTF16LE"!==a&&1===b,f=0;f<c.length;f+=1){g=c.charCodeAt(f);
!0===l&&(m=g&255,g=m<<8|g>>>8);r=p+q;for(u=r>>>2;h.length<=u;)h.push(0);h[u]|=g<<8*(t+r%4*b);p+=2}return{value:h,binLen:8*p+d}};break;case "B64":c=function(a,c,d){var g=0,l,p,f,m,q,u,r,t;if(-1===a.search(/^[a-zA-Z0-9=+\/]+$/))throw Error("Invalid character in base-64 string");p=a.indexOf("=");a=a.replace(/\=/g,"");if(-1!==p&&p<a.length)throw Error("Invalid '=' found in base-64 string");c=c||[0];d=d||0;u=d>>>3;t=-1===b?3:0;for(p=0;p<a.length;p+=4){q=a.substr(p,4);for(f=m=0;f<q.length;f+=1)l="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".indexOf(q[f]),
m|=l<<18-6*f;for(f=0;f<q.length-1;f+=1){r=g+u;for(l=r>>>2;c.length<=l;)c.push(0);c[l]|=(m>>>16-8*f&255)<<8*(t+r%4*b);g+=1}}return{value:c,binLen:8*g+d}};break;case "BYTES":c=function(a,c,d){var g,l,p,f,m,q;c=c||[0];d=d||0;p=d>>>3;q=-1===b?3:0;for(l=0;l<a.length;l+=1)g=a.charCodeAt(l),m=l+p,f=m>>>2,c.length<=f&&c.push(0),c[f]|=g<<8*(q+m%4*b);return{value:c,binLen:8*a.length+d}};break;case "ARRAYBUFFER":try{c=new ArrayBuffer(0)}catch(e){throw Error("ARRAYBUFFER not supported by this environment");}c=
function(a,c,d){var g,l,p,f,m,q;c=c||[0];d=d||0;l=d>>>3;m=-1===b?3:0;q=new Uint8Array(a);for(g=0;g<a.byteLength;g+=1)f=g+l,p=f>>>2,c.length<=p&&c.push(0),c[p]|=q[g]<<8*(m+f%4*b);return{value:c,binLen:8*a.byteLength+d}};break;default:throw Error("format must be HEX, TEXT, B64, BYTES, or ARRAYBUFFER");}return c}function y(c,a){return c<<a|c>>>32-a}function S(c,a){return 32<a?(a-=32,new b(c.b<<a|c.a>>>32-a,c.a<<a|c.b>>>32-a)):0!==a?new b(c.a<<a|c.b>>>32-a,c.b<<a|c.a>>>32-a):c}function w(c,a){return c>>>
a|c<<32-a}function t(c,a){var k=null,k=new b(c.a,c.b);return k=32>=a?new b(k.a>>>a|k.b<<32-a&4294967295,k.b>>>a|k.a<<32-a&4294967295):new b(k.b>>>a-32|k.a<<64-a&4294967295,k.a>>>a-32|k.b<<64-a&4294967295)}function T(c,a){var k=null;return k=32>=a?new b(c.a>>>a,c.b>>>a|c.a<<32-a&4294967295):new b(0,c.a>>>a-32)}function aa(c,a,b){return c&a^~c&b}function ba(c,a,k){return new b(c.a&a.a^~c.a&k.a,c.b&a.b^~c.b&k.b)}function U(c,a,b){return c&a^c&b^a&b}function ca(c,a,k){return new b(c.a&a.a^c.a&k.a^a.a&
k.a,c.b&a.b^c.b&k.b^a.b&k.b)}function da(c){return w(c,2)^w(c,13)^w(c,22)}function ea(c){var a=t(c,28),k=t(c,34);c=t(c,39);return new b(a.a^k.a^c.a,a.b^k.b^c.b)}function fa(c){return w(c,6)^w(c,11)^w(c,25)}function ga(c){var a=t(c,14),k=t(c,18);c=t(c,41);return new b(a.a^k.a^c.a,a.b^k.b^c.b)}function ha(c){return w(c,7)^w(c,18)^c>>>3}function ia(c){var a=t(c,1),k=t(c,8);c=T(c,7);return new b(a.a^k.a^c.a,a.b^k.b^c.b)}function ja(c){return w(c,17)^w(c,19)^c>>>10}function ka(c){var a=t(c,19),k=t(c,61);
c=T(c,6);return new b(a.a^k.a^c.a,a.b^k.b^c.b)}function G(c,a){var b=(c&65535)+(a&65535);return((c>>>16)+(a>>>16)+(b>>>16)&65535)<<16|b&65535}function la(c,a,b,e){var h=(c&65535)+(a&65535)+(b&65535)+(e&65535);return((c>>>16)+(a>>>16)+(b>>>16)+(e>>>16)+(h>>>16)&65535)<<16|h&65535}function H(c,a,b,e,h){var d=(c&65535)+(a&65535)+(b&65535)+(e&65535)+(h&65535);return((c>>>16)+(a>>>16)+(b>>>16)+(e>>>16)+(h>>>16)+(d>>>16)&65535)<<16|d&65535}function ma(c,a){var d,e,h;d=(c.b&65535)+(a.b&65535);e=(c.b>>>16)+
(a.b>>>16)+(d>>>16);h=(e&65535)<<16|d&65535;d=(c.a&65535)+(a.a&65535)+(e>>>16);e=(c.a>>>16)+(a.a>>>16)+(d>>>16);return new b((e&65535)<<16|d&65535,h)}function na(c,a,d,e){var h,n,g;h=(c.b&65535)+(a.b&65535)+(d.b&65535)+(e.b&65535);n=(c.b>>>16)+(a.b>>>16)+(d.b>>>16)+(e.b>>>16)+(h>>>16);g=(n&65535)<<16|h&65535;h=(c.a&65535)+(a.a&65535)+(d.a&65535)+(e.a&65535)+(n>>>16);n=(c.a>>>16)+(a.a>>>16)+(d.a>>>16)+(e.a>>>16)+(h>>>16);return new b((n&65535)<<16|h&65535,g)}function oa(c,a,d,e,h){var n,g,l;n=(c.b&
65535)+(a.b&65535)+(d.b&65535)+(e.b&65535)+(h.b&65535);g=(c.b>>>16)+(a.b>>>16)+(d.b>>>16)+(e.b>>>16)+(h.b>>>16)+(n>>>16);l=(g&65535)<<16|n&65535;n=(c.a&65535)+(a.a&65535)+(d.a&65535)+(e.a&65535)+(h.a&65535)+(g>>>16);g=(c.a>>>16)+(a.a>>>16)+(d.a>>>16)+(e.a>>>16)+(h.a>>>16)+(n>>>16);return new b((g&65535)<<16|n&65535,l)}function B(c,a){return new b(c.a^a.a,c.b^a.b)}function A(c){var a=[],d;if("SHA-1"===c)a=[1732584193,4023233417,2562383102,271733878,3285377520];else if(0===c.lastIndexOf("SHA-",0))switch(a=
[3238371032,914150663,812702999,4144912697,4290775857,1750603025,1694076839,3204075428],d=[1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225],c){case "SHA-224":break;case "SHA-256":a=d;break;case "SHA-384":a=[new b(3418070365,a[0]),new b(1654270250,a[1]),new b(2438529370,a[2]),new b(355462360,a[3]),new b(1731405415,a[4]),new b(41048885895,a[5]),new b(3675008525,a[6]),new b(1203062813,a[7])];break;case "SHA-512":a=[new b(d[0],4089235720),new b(d[1],2227873595),
new b(d[2],4271175723),new b(d[3],1595750129),new b(d[4],2917565137),new b(d[5],725511199),new b(d[6],4215389547),new b(d[7],327033209)];break;default:throw Error("Unknown SHA variant");}else if(0===c.lastIndexOf("SHA3-",0)||0===c.lastIndexOf("SHAKE",0))for(c=0;5>c;c+=1)a[c]=[new b(0,0),new b(0,0),new b(0,0),new b(0,0),new b(0,0)];else throw Error("No SHA variants supported");return a}function K(c,a){var b=[],e,d,n,g,l,p,f;e=a[0];d=a[1];n=a[2];g=a[3];l=a[4];for(f=0;80>f;f+=1)b[f]=16>f?c[f]:y(b[f-
3]^b[f-8]^b[f-14]^b[f-16],1),p=20>f?H(y(e,5),d&n^~d&g,l,1518500249,b[f]):40>f?H(y(e,5),d^n^g,l,1859775393,b[f]):60>f?H(y(e,5),U(d,n,g),l,2400959708,b[f]):H(y(e,5),d^n^g,l,3395469782,b[f]),l=g,g=n,n=y(d,30),d=e,e=p;a[0]=G(e,a[0]);a[1]=G(d,a[1]);a[2]=G(n,a[2]);a[3]=G(g,a[3]);a[4]=G(l,a[4]);return a}function Z(c,a,b,e){var d;for(d=(a+65>>>9<<4)+15;c.length<=d;)c.push(0);c[a>>>5]|=128<<24-a%32;a+=b;c[d]=a&4294967295;c[d-1]=a/4294967296|0;a=c.length;for(d=0;d<a;d+=16)e=K(c.slice(d,d+16),e);return e}function L(c,
a,k){var e,h,n,g,l,p,f,m,q,u,r,t,v,w,y,A,z,x,F,B,C,D,E=[],J;if("SHA-224"===k||"SHA-256"===k)u=64,t=1,D=Number,v=G,w=la,y=H,A=ha,z=ja,x=da,F=fa,C=U,B=aa,J=d;else if("SHA-384"===k||"SHA-512"===k)u=80,t=2,D=b,v=ma,w=na,y=oa,A=ia,z=ka,x=ea,F=ga,C=ca,B=ba,J=V;else throw Error("Unexpected error in SHA-2 implementation");k=a[0];e=a[1];h=a[2];n=a[3];g=a[4];l=a[5];p=a[6];f=a[7];for(r=0;r<u;r+=1)16>r?(q=r*t,m=c.length<=q?0:c[q],q=c.length<=q+1?0:c[q+1],E[r]=new D(m,q)):E[r]=w(z(E[r-2]),E[r-7],A(E[r-15]),E[r-
16]),m=y(f,F(g),B(g,l,p),J[r],E[r]),q=v(x(k),C(k,e,h)),f=p,p=l,l=g,g=v(n,m),n=h,h=e,e=k,k=v(m,q);a[0]=v(k,a[0]);a[1]=v(e,a[1]);a[2]=v(h,a[2]);a[3]=v(n,a[3]);a[4]=v(g,a[4]);a[5]=v(l,a[5]);a[6]=v(p,a[6]);a[7]=v(f,a[7]);return a}function D(c,a){var d,e,h,n,g=[],l=[];if(null!==c)for(e=0;e<c.length;e+=2)a[(e>>>1)%5][(e>>>1)/5|0]=B(a[(e>>>1)%5][(e>>>1)/5|0],new b(c[e+1],c[e]));for(d=0;24>d;d+=1){n=A("SHA3-");for(e=0;5>e;e+=1){h=a[e][0];var p=a[e][1],f=a[e][2],m=a[e][3],q=a[e][4];g[e]=new b(h.a^p.a^f.a^
m.a^q.a,h.b^p.b^f.b^m.b^q.b)}for(e=0;5>e;e+=1)l[e]=B(g[(e+4)%5],S(g[(e+1)%5],1));for(e=0;5>e;e+=1)for(h=0;5>h;h+=1)a[e][h]=B(a[e][h],l[e]);for(e=0;5>e;e+=1)for(h=0;5>h;h+=1)n[h][(2*e+3*h)%5]=S(a[e][h],W[e][h]);for(e=0;5>e;e+=1)for(h=0;5>h;h+=1)a[e][h]=B(n[e][h],new b(~n[(e+1)%5][h].a&n[(e+2)%5][h].a,~n[(e+1)%5][h].b&n[(e+2)%5][h].b));a[0][0]=B(a[0][0],X[d])}return a}var d,V,W,X;d=[1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,
1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,
2227730452,2361852424,2428436474,2756734187,3204031479,3329325298];V=[new b(d[0],3609767458),new b(d[1],602891725),new b(d[2],3964484399),new b(d[3],2173295548),new b(d[4],4081628472),new b(d[5],3053834265),new b(d[6],2937671579),new b(d[7],3664609560),new b(d[8],2734883394),new b(d[9],1164996542),new b(d[10],1323610764),new b(d[11],3590304994),new b(d[12],4068182383),new b(d[13],991336113),new b(d[14],633803317),new b(d[15],3479774868),new b(d[16],2666613458),new b(d[17],944711139),new b(d[18],2341262773),
new b(d[19],2007800933),new b(d[20],1495990901),new b(d[21],1856431235),new b(d[22],3175218132),new b(d[23],2198950837),new b(d[24],3999719339),new b(d[25],766784016),new b(d[26],2566594879),new b(d[27],3203337956),new b(d[28],1034457026),new b(d[29],2466948901),new b(d[30],3758326383),new b(d[31],168717936),new b(d[32],1188179964),new b(d[33],1546045734),new b(d[34],1522805485),new b(d[35],2643833823),new b(d[36],2343527390),new b(d[37],1014477480),new b(d[38],1206759142),new b(d[39],344077627),
new b(d[40],1290863460),new b(d[41],3158454273),new b(d[42],3505952657),new b(d[43],106217008),new b(d[44],3606008344),new b(d[45],1432725776),new b(d[46],1467031594),new b(d[47],851169720),new b(d[48],3100823752),new b(d[49],1363258195),new b(d[50],3750685593),new b(d[51],3785050280),new b(d[52],3318307427),new b(d[53],3812723403),new b(d[54],2003034995),new b(d[55],3602036899),new b(d[56],1575990012),new b(d[57],1125592928),new b(d[58],2716904306),new b(d[59],442776044),new b(d[60],593698344),new b(d[61],
3733110249),new b(d[62],2999351573),new b(d[63],3815920427),new b(3391569614,3928383900),new b(3515267271,566280711),new b(3940187606,3454069534),new b(4118630271,4000239992),new b(116418474,1914138554),new b(174292421,2731055270),new b(289380356,3203993006),new b(460393269,320620315),new b(685471733,587496836),new b(852142971,1086792851),new b(1017036298,365543100),new b(1126000580,2618297676),new b(1288033470,3409855158),new b(1501505948,4234509866),new b(1607167915,987167468),new b(1816402316,
1246189591)];X=[new b(0,1),new b(0,32898),new b(2147483648,32906),new b(2147483648,2147516416),new b(0,32907),new b(0,2147483649),new b(2147483648,2147516545),new b(2147483648,32777),new b(0,138),new b(0,136),new b(0,2147516425),new b(0,2147483658),new b(0,2147516555),new b(2147483648,139),new b(2147483648,32905),new b(2147483648,32771),new b(2147483648,32770),new b(2147483648,128),new b(0,32778),new b(2147483648,2147483658),new b(2147483648,2147516545),new b(2147483648,32896),new b(0,2147483649),
new b(2147483648,2147516424)];W=[[0,36,3,41,18],[1,44,10,45,2],[62,6,43,15,61],[28,55,25,21,56],[27,20,39,8,14]];"function"===typeof define&&define.amd?define(function(){return C}):"undefined"!==typeof exports?("undefined"!==typeof module&&module.exports&&(module.exports=C),exports=C):Y.jsSHA=C})(this);

23
frontend/jsSHA/src/sha1.js Executable file
View file

@ -0,0 +1,23 @@
/*
A JavaScript implementation of the SHA family of hashes, as
defined in FIPS PUB 180-4 and FIPS PUB 202, as well as the corresponding
HMAC implementation as defined in FIPS PUB 198a
Copyright 2008-2018 Brian Turek, 1998-2009 Paul Johnston & Contributors
Distributed under the BSD License
See http://caligatio.github.com/jsSHA/ for more information
*/
'use strict';(function(G){function r(d,b,c){var h=0,a=[],f=0,g,m,k,e,l,p,q,t,w=!1,n=[],u=[],v,r=!1;c=c||{};g=c.encoding||"UTF8";v=c.numRounds||1;if(v!==parseInt(v,10)||1>v)throw Error("numRounds must a integer >= 1");if("SHA-1"===d)l=512,p=z,q=H,e=160,t=function(a){return a.slice()};else throw Error("Chosen SHA variant is not supported");k=A(b,g);m=x(d);this.setHMACKey=function(a,f,b){var c;if(!0===w)throw Error("HMAC key already set");if(!0===r)throw Error("Cannot set HMAC key after calling update");
g=(b||{}).encoding||"UTF8";f=A(f,g)(a);a=f.binLen;f=f.value;c=l>>>3;b=c/4-1;if(c<a/8){for(f=q(f,a,0,x(d),e);f.length<=b;)f.push(0);f[b]&=4294967040}else if(c>a/8){for(;f.length<=b;)f.push(0);f[b]&=4294967040}for(a=0;a<=b;a+=1)n[a]=f[a]^909522486,u[a]=f[a]^1549556828;m=p(n,m);h=l;w=!0};this.update=function(b){var e,g,c,d=0,q=l>>>5;e=k(b,a,f);b=e.binLen;g=e.value;e=b>>>5;for(c=0;c<e;c+=q)d+l<=b&&(m=p(g.slice(c,c+q),m),d+=l);h+=d;a=g.slice(d>>>5);f=b%l;r=!0};this.getHash=function(b,g){var c,k,l,p;if(!0===
w)throw Error("Cannot call getHash after setting HMAC key");l=B(g);switch(b){case "HEX":c=function(a){return C(a,e,l)};break;case "B64":c=function(a){return D(a,e,l)};break;case "BYTES":c=function(a){return E(a,e)};break;case "ARRAYBUFFER":try{k=new ArrayBuffer(0)}catch(I){throw Error("ARRAYBUFFER not supported by this environment");}c=function(a){return F(a,e)};break;default:throw Error("format must be HEX, B64, BYTES, or ARRAYBUFFER");}p=q(a.slice(),f,h,t(m),e);for(k=1;k<v;k+=1)p=q(p,e,0,x(d),e);
return c(p)};this.getHMAC=function(b,g){var c,k,n,r;if(!1===w)throw Error("Cannot call getHMAC without first setting HMAC key");n=B(g);switch(b){case "HEX":c=function(a){return C(a,e,n)};break;case "B64":c=function(a){return D(a,e,n)};break;case "BYTES":c=function(a){return E(a,e)};break;case "ARRAYBUFFER":try{c=new ArrayBuffer(0)}catch(I){throw Error("ARRAYBUFFER not supported by this environment");}c=function(a){return F(a,e)};break;default:throw Error("outputFormat must be HEX, B64, BYTES, or ARRAYBUFFER");
}k=q(a.slice(),f,h,t(m),e);r=p(u,x(d));r=q(k,e,l,r,e);return c(r)}}function C(d,b,c){var h="";b/=8;var a,f;for(a=0;a<b;a+=1)f=d[a>>>2]>>>8*(3+a%4*-1),h+="0123456789abcdef".charAt(f>>>4&15)+"0123456789abcdef".charAt(f&15);return c.outputUpper?h.toUpperCase():h}function D(d,b,c){var h="",a=b/8,f,g,m;for(f=0;f<a;f+=3)for(g=f+1<a?d[f+1>>>2]:0,m=f+2<a?d[f+2>>>2]:0,m=(d[f>>>2]>>>8*(3+f%4*-1)&255)<<16|(g>>>8*(3+(f+1)%4*-1)&255)<<8|m>>>8*(3+(f+2)%4*-1)&255,g=0;4>g;g+=1)8*f+6*g<=b?h+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(m>>>
6*(3-g)&63):h+=c.b64Pad;return h}function E(d,b){var c="",h=b/8,a,f;for(a=0;a<h;a+=1)f=d[a>>>2]>>>8*(3+a%4*-1)&255,c+=String.fromCharCode(f);return c}function F(d,b){var c=b/8,h,a=new ArrayBuffer(c),f;f=new Uint8Array(a);for(h=0;h<c;h+=1)f[h]=d[h>>>2]>>>8*(3+h%4*-1)&255;return a}function B(d){var b={outputUpper:!1,b64Pad:"=",shakeLen:-1};d=d||{};b.outputUpper=d.outputUpper||!1;!0===d.hasOwnProperty("b64Pad")&&(b.b64Pad=d.b64Pad);if("boolean"!==typeof b.outputUpper)throw Error("Invalid outputUpper formatting option");
if("string"!==typeof b.b64Pad)throw Error("Invalid b64Pad formatting option");return b}function A(d,b){var c;switch(b){case "UTF8":case "UTF16BE":case "UTF16LE":break;default:throw Error("encoding must be UTF8, UTF16BE, or UTF16LE");}switch(d){case "HEX":c=function(b,a,f){var g=b.length,c,d,e,l,p;if(0!==g%2)throw Error("String of HEX type must be in byte increments");a=a||[0];f=f||0;p=f>>>3;for(c=0;c<g;c+=2){d=parseInt(b.substr(c,2),16);if(isNaN(d))throw Error("String of HEX type contains invalid characters");
l=(c>>>1)+p;for(e=l>>>2;a.length<=e;)a.push(0);a[e]|=d<<8*(3+l%4*-1)}return{value:a,binLen:4*g+f}};break;case "TEXT":c=function(c,a,f){var g,d,k=0,e,l,p,q,t,n;a=a||[0];f=f||0;p=f>>>3;if("UTF8"===b)for(n=3,e=0;e<c.length;e+=1)for(g=c.charCodeAt(e),d=[],128>g?d.push(g):2048>g?(d.push(192|g>>>6),d.push(128|g&63)):55296>g||57344<=g?d.push(224|g>>>12,128|g>>>6&63,128|g&63):(e+=1,g=65536+((g&1023)<<10|c.charCodeAt(e)&1023),d.push(240|g>>>18,128|g>>>12&63,128|g>>>6&63,128|g&63)),l=0;l<d.length;l+=1){t=k+
p;for(q=t>>>2;a.length<=q;)a.push(0);a[q]|=d[l]<<8*(n+t%4*-1);k+=1}else if("UTF16BE"===b||"UTF16LE"===b)for(n=2,d="UTF16LE"===b&&!0||"UTF16LE"!==b&&!1,e=0;e<c.length;e+=1){g=c.charCodeAt(e);!0===d&&(l=g&255,g=l<<8|g>>>8);t=k+p;for(q=t>>>2;a.length<=q;)a.push(0);a[q]|=g<<8*(n+t%4*-1);k+=2}return{value:a,binLen:8*k+f}};break;case "B64":c=function(b,a,f){var c=0,d,k,e,l,p,q,n;if(-1===b.search(/^[a-zA-Z0-9=+\/]+$/))throw Error("Invalid character in base-64 string");k=b.indexOf("=");b=b.replace(/\=/g,
"");if(-1!==k&&k<b.length)throw Error("Invalid '=' found in base-64 string");a=a||[0];f=f||0;q=f>>>3;for(k=0;k<b.length;k+=4){p=b.substr(k,4);for(e=l=0;e<p.length;e+=1)d="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".indexOf(p[e]),l|=d<<18-6*e;for(e=0;e<p.length-1;e+=1){n=c+q;for(d=n>>>2;a.length<=d;)a.push(0);a[d]|=(l>>>16-8*e&255)<<8*(3+n%4*-1);c+=1}}return{value:a,binLen:8*c+f}};break;case "BYTES":c=function(b,a,c){var d,m,k,e,l;a=a||[0];c=c||0;k=c>>>3;for(m=0;m<b.length;m+=
1)d=b.charCodeAt(m),l=m+k,e=l>>>2,a.length<=e&&a.push(0),a[e]|=d<<8*(3+l%4*-1);return{value:a,binLen:8*b.length+c}};break;case "ARRAYBUFFER":try{c=new ArrayBuffer(0)}catch(h){throw Error("ARRAYBUFFER not supported by this environment");}c=function(b,a,c){var d,m,k,e,l;a=a||[0];c=c||0;m=c>>>3;l=new Uint8Array(b);for(d=0;d<b.byteLength;d+=1)e=d+m,k=e>>>2,a.length<=k&&a.push(0),a[k]|=l[d]<<8*(3+e%4*-1);return{value:a,binLen:8*b.byteLength+c}};break;default:throw Error("format must be HEX, TEXT, B64, BYTES, or ARRAYBUFFER");
}return c}function n(d,b){return d<<b|d>>>32-b}function u(d,b){var c=(d&65535)+(b&65535);return((d>>>16)+(b>>>16)+(c>>>16)&65535)<<16|c&65535}function y(d,b,c,h,a){var f=(d&65535)+(b&65535)+(c&65535)+(h&65535)+(a&65535);return((d>>>16)+(b>>>16)+(c>>>16)+(h>>>16)+(a>>>16)+(f>>>16)&65535)<<16|f&65535}function x(d){var b=[];if("SHA-1"===d)b=[1732584193,4023233417,2562383102,271733878,3285377520];else throw Error("No SHA variants supported");return b}function z(d,b){var c=[],h,a,f,g,m,k,e;h=b[0];a=b[1];
f=b[2];g=b[3];m=b[4];for(e=0;80>e;e+=1)c[e]=16>e?d[e]:n(c[e-3]^c[e-8]^c[e-14]^c[e-16],1),k=20>e?y(n(h,5),a&f^~a&g,m,1518500249,c[e]):40>e?y(n(h,5),a^f^g,m,1859775393,c[e]):60>e?y(n(h,5),a&f^a&g^f&g,m,2400959708,c[e]):y(n(h,5),a^f^g,m,3395469782,c[e]),m=g,g=f,f=n(a,30),a=h,h=k;b[0]=u(h,b[0]);b[1]=u(a,b[1]);b[2]=u(f,b[2]);b[3]=u(g,b[3]);b[4]=u(m,b[4]);return b}function H(d,b,c,h){var a;for(a=(b+65>>>9<<4)+15;d.length<=a;)d.push(0);d[b>>>5]|=128<<24-b%32;b+=c;d[a]=b&4294967295;d[a-1]=b/4294967296|0;
b=d.length;for(a=0;a<b;a+=16)h=z(d.slice(a,a+16),h);return h}"function"===typeof define&&define.amd?define(function(){return r}):"undefined"!==typeof exports?("undefined"!==typeof module&&module.exports&&(module.exports=r),exports=r):G.jsSHA=r})(this);

27
frontend/jsSHA/src/sha256.js Executable file
View file

@ -0,0 +1,27 @@
/*
A JavaScript implementation of the SHA family of hashes, as
defined in FIPS PUB 180-4 and FIPS PUB 202, as well as the corresponding
HMAC implementation as defined in FIPS PUB 198a
Copyright 2008-2018 Brian Turek, 1998-2009 Paul Johnston & Contributors
Distributed under the BSD License
See http://caligatio.github.com/jsSHA/ for more information
*/
'use strict';(function(I){function w(c,a,d){var l=0,b=[],g=0,f,n,k,e,h,q,y,p,m=!1,t=[],r=[],u,z=!1;d=d||{};f=d.encoding||"UTF8";u=d.numRounds||1;if(u!==parseInt(u,10)||1>u)throw Error("numRounds must a integer >= 1");if(0===c.lastIndexOf("SHA-",0))if(q=function(b,a){return A(b,a,c)},y=function(b,a,l,f){var g,e;if("SHA-224"===c||"SHA-256"===c)g=(a+65>>>9<<4)+15,e=16;else throw Error("Unexpected error in SHA-2 implementation");for(;b.length<=g;)b.push(0);b[a>>>5]|=128<<24-a%32;a=a+l;b[g]=a&4294967295;
b[g-1]=a/4294967296|0;l=b.length;for(a=0;a<l;a+=e)f=A(b.slice(a,a+e),f,c);if("SHA-224"===c)b=[f[0],f[1],f[2],f[3],f[4],f[5],f[6]];else if("SHA-256"===c)b=f;else throw Error("Unexpected error in SHA-2 implementation");return b},p=function(b){return b.slice()},"SHA-224"===c)h=512,e=224;else if("SHA-256"===c)h=512,e=256;else throw Error("Chosen SHA variant is not supported");else throw Error("Chosen SHA variant is not supported");k=B(a,f);n=x(c);this.setHMACKey=function(b,a,g){var e;if(!0===m)throw Error("HMAC key already set");
if(!0===z)throw Error("Cannot set HMAC key after calling update");f=(g||{}).encoding||"UTF8";a=B(a,f)(b);b=a.binLen;a=a.value;e=h>>>3;g=e/4-1;if(e<b/8){for(a=y(a,b,0,x(c));a.length<=g;)a.push(0);a[g]&=4294967040}else if(e>b/8){for(;a.length<=g;)a.push(0);a[g]&=4294967040}for(b=0;b<=g;b+=1)t[b]=a[b]^909522486,r[b]=a[b]^1549556828;n=q(t,n);l=h;m=!0};this.update=function(a){var c,f,e,d=0,p=h>>>5;c=k(a,b,g);a=c.binLen;f=c.value;c=a>>>5;for(e=0;e<c;e+=p)d+h<=a&&(n=q(f.slice(e,e+p),n),d+=h);l+=d;b=f.slice(d>>>
5);g=a%h;z=!0};this.getHash=function(a,f){var d,h,k,q;if(!0===m)throw Error("Cannot call getHash after setting HMAC key");k=C(f);switch(a){case "HEX":d=function(a){return D(a,e,k)};break;case "B64":d=function(a){return E(a,e,k)};break;case "BYTES":d=function(a){return F(a,e)};break;case "ARRAYBUFFER":try{h=new ArrayBuffer(0)}catch(v){throw Error("ARRAYBUFFER not supported by this environment");}d=function(a){return G(a,e)};break;default:throw Error("format must be HEX, B64, BYTES, or ARRAYBUFFER");
}q=y(b.slice(),g,l,p(n));for(h=1;h<u;h+=1)q=y(q,e,0,x(c));return d(q)};this.getHMAC=function(a,f){var d,k,t,u;if(!1===m)throw Error("Cannot call getHMAC without first setting HMAC key");t=C(f);switch(a){case "HEX":d=function(a){return D(a,e,t)};break;case "B64":d=function(a){return E(a,e,t)};break;case "BYTES":d=function(a){return F(a,e)};break;case "ARRAYBUFFER":try{d=new ArrayBuffer(0)}catch(v){throw Error("ARRAYBUFFER not supported by this environment");}d=function(a){return G(a,e)};break;default:throw Error("outputFormat must be HEX, B64, BYTES, or ARRAYBUFFER");
}k=y(b.slice(),g,l,p(n));u=q(r,x(c));u=y(k,e,h,u);return d(u)}}function m(){}function D(c,a,d){var l="";a/=8;var b,g;for(b=0;b<a;b+=1)g=c[b>>>2]>>>8*(3+b%4*-1),l+="0123456789abcdef".charAt(g>>>4&15)+"0123456789abcdef".charAt(g&15);return d.outputUpper?l.toUpperCase():l}function E(c,a,d){var l="",b=a/8,g,f,n;for(g=0;g<b;g+=3)for(f=g+1<b?c[g+1>>>2]:0,n=g+2<b?c[g+2>>>2]:0,n=(c[g>>>2]>>>8*(3+g%4*-1)&255)<<16|(f>>>8*(3+(g+1)%4*-1)&255)<<8|n>>>8*(3+(g+2)%4*-1)&255,f=0;4>f;f+=1)8*g+6*f<=a?l+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(n>>>
6*(3-f)&63):l+=d.b64Pad;return l}function F(c,a){var d="",l=a/8,b,g;for(b=0;b<l;b+=1)g=c[b>>>2]>>>8*(3+b%4*-1)&255,d+=String.fromCharCode(g);return d}function G(c,a){var d=a/8,l,b=new ArrayBuffer(d),g;g=new Uint8Array(b);for(l=0;l<d;l+=1)g[l]=c[l>>>2]>>>8*(3+l%4*-1)&255;return b}function C(c){var a={outputUpper:!1,b64Pad:"=",shakeLen:-1};c=c||{};a.outputUpper=c.outputUpper||!1;!0===c.hasOwnProperty("b64Pad")&&(a.b64Pad=c.b64Pad);if("boolean"!==typeof a.outputUpper)throw Error("Invalid outputUpper formatting option");
if("string"!==typeof a.b64Pad)throw Error("Invalid b64Pad formatting option");return a}function B(c,a){var d;switch(a){case "UTF8":case "UTF16BE":case "UTF16LE":break;default:throw Error("encoding must be UTF8, UTF16BE, or UTF16LE");}switch(c){case "HEX":d=function(a,b,c){var f=a.length,d,k,e,h,q;if(0!==f%2)throw Error("String of HEX type must be in byte increments");b=b||[0];c=c||0;q=c>>>3;for(d=0;d<f;d+=2){k=parseInt(a.substr(d,2),16);if(isNaN(k))throw Error("String of HEX type contains invalid characters");
h=(d>>>1)+q;for(e=h>>>2;b.length<=e;)b.push(0);b[e]|=k<<8*(3+h%4*-1)}return{value:b,binLen:4*f+c}};break;case "TEXT":d=function(c,b,d){var f,n,k=0,e,h,q,m,p,r;b=b||[0];d=d||0;q=d>>>3;if("UTF8"===a)for(r=3,e=0;e<c.length;e+=1)for(f=c.charCodeAt(e),n=[],128>f?n.push(f):2048>f?(n.push(192|f>>>6),n.push(128|f&63)):55296>f||57344<=f?n.push(224|f>>>12,128|f>>>6&63,128|f&63):(e+=1,f=65536+((f&1023)<<10|c.charCodeAt(e)&1023),n.push(240|f>>>18,128|f>>>12&63,128|f>>>6&63,128|f&63)),h=0;h<n.length;h+=1){p=k+
q;for(m=p>>>2;b.length<=m;)b.push(0);b[m]|=n[h]<<8*(r+p%4*-1);k+=1}else if("UTF16BE"===a||"UTF16LE"===a)for(r=2,n="UTF16LE"===a&&!0||"UTF16LE"!==a&&!1,e=0;e<c.length;e+=1){f=c.charCodeAt(e);!0===n&&(h=f&255,f=h<<8|f>>>8);p=k+q;for(m=p>>>2;b.length<=m;)b.push(0);b[m]|=f<<8*(r+p%4*-1);k+=2}return{value:b,binLen:8*k+d}};break;case "B64":d=function(a,b,c){var f=0,d,k,e,h,q,m,p;if(-1===a.search(/^[a-zA-Z0-9=+\/]+$/))throw Error("Invalid character in base-64 string");k=a.indexOf("=");a=a.replace(/\=/g,
"");if(-1!==k&&k<a.length)throw Error("Invalid '=' found in base-64 string");b=b||[0];c=c||0;m=c>>>3;for(k=0;k<a.length;k+=4){q=a.substr(k,4);for(e=h=0;e<q.length;e+=1)d="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".indexOf(q[e]),h|=d<<18-6*e;for(e=0;e<q.length-1;e+=1){p=f+m;for(d=p>>>2;b.length<=d;)b.push(0);b[d]|=(h>>>16-8*e&255)<<8*(3+p%4*-1);f+=1}}return{value:b,binLen:8*f+c}};break;case "BYTES":d=function(a,b,c){var d,n,k,e,h;b=b||[0];c=c||0;k=c>>>3;for(n=0;n<a.length;n+=
1)d=a.charCodeAt(n),h=n+k,e=h>>>2,b.length<=e&&b.push(0),b[e]|=d<<8*(3+h%4*-1);return{value:b,binLen:8*a.length+c}};break;case "ARRAYBUFFER":try{d=new ArrayBuffer(0)}catch(l){throw Error("ARRAYBUFFER not supported by this environment");}d=function(a,b,c){var d,n,k,e,h;b=b||[0];c=c||0;n=c>>>3;h=new Uint8Array(a);for(d=0;d<a.byteLength;d+=1)e=d+n,k=e>>>2,b.length<=k&&b.push(0),b[k]|=h[d]<<8*(3+e%4*-1);return{value:b,binLen:8*a.byteLength+c}};break;default:throw Error("format must be HEX, TEXT, B64, BYTES, or ARRAYBUFFER");
}return d}function r(c,a){return c>>>a|c<<32-a}function J(c,a,d){return c&a^~c&d}function K(c,a,d){return c&a^c&d^a&d}function L(c){return r(c,2)^r(c,13)^r(c,22)}function M(c){return r(c,6)^r(c,11)^r(c,25)}function N(c){return r(c,7)^r(c,18)^c>>>3}function O(c){return r(c,17)^r(c,19)^c>>>10}function P(c,a){var d=(c&65535)+(a&65535);return((c>>>16)+(a>>>16)+(d>>>16)&65535)<<16|d&65535}function Q(c,a,d,l){var b=(c&65535)+(a&65535)+(d&65535)+(l&65535);return((c>>>16)+(a>>>16)+(d>>>16)+(l>>>16)+(b>>>
16)&65535)<<16|b&65535}function R(c,a,d,l,b){var g=(c&65535)+(a&65535)+(d&65535)+(l&65535)+(b&65535);return((c>>>16)+(a>>>16)+(d>>>16)+(l>>>16)+(b>>>16)+(g>>>16)&65535)<<16|g&65535}function x(c){var a=[],d;if(0===c.lastIndexOf("SHA-",0))switch(a=[3238371032,914150663,812702999,4144912697,4290775857,1750603025,1694076839,3204075428],d=[1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225],c){case "SHA-224":break;case "SHA-256":a=d;break;case "SHA-384":a=[new m,new m,
new m,new m,new m,new m,new m,new m];break;case "SHA-512":a=[new m,new m,new m,new m,new m,new m,new m,new m];break;default:throw Error("Unknown SHA variant");}else throw Error("No SHA variants supported");return a}function A(c,a,d){var l,b,g,f,n,k,e,h,m,r,p,w,t,x,u,z,A,B,C,D,E,F,v=[],G;if("SHA-224"===d||"SHA-256"===d)r=64,w=1,F=Number,t=P,x=Q,u=R,z=N,A=O,B=L,C=M,E=K,D=J,G=H;else throw Error("Unexpected error in SHA-2 implementation");d=a[0];l=a[1];b=a[2];g=a[3];f=a[4];n=a[5];k=a[6];e=a[7];for(p=
0;p<r;p+=1)16>p?(m=p*w,h=c.length<=m?0:c[m],m=c.length<=m+1?0:c[m+1],v[p]=new F(h,m)):v[p]=x(A(v[p-2]),v[p-7],z(v[p-15]),v[p-16]),h=u(e,C(f),D(f,n,k),G[p],v[p]),m=t(B(d),E(d,l,b)),e=k,k=n,n=f,f=t(g,h),g=b,b=l,l=d,d=t(h,m);a[0]=t(d,a[0]);a[1]=t(l,a[1]);a[2]=t(b,a[2]);a[3]=t(g,a[3]);a[4]=t(f,a[4]);a[5]=t(n,a[5]);a[6]=t(k,a[6]);a[7]=t(e,a[7]);return a}var H;H=[1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,
2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,
2756734187,3204031479,3329325298];"function"===typeof define&&define.amd?define(function(){return w}):"undefined"!==typeof exports?("undefined"!==typeof module&&module.exports&&(module.exports=w),exports=w):I.jsSHA=w})(this);

27
frontend/jsSHA/src/sha3.js Executable file
View file

@ -0,0 +1,27 @@
/*
A JavaScript implementation of the SHA family of hashes, as
defined in FIPS PUB 180-4 and FIPS PUB 202, as well as the corresponding
HMAC implementation as defined in FIPS PUB 198a
Copyright 2008-2018 Brian Turek, 1998-2009 Paul Johnston & Contributors
Distributed under the BSD License
See http://caligatio.github.com/jsSHA/ for more information
*/
'use strict';(function(L){function u(d,b,h){var c=0,a=[],l=0,e,m,r,g,k,f,p,v,A=!1,n=[],u=[],w,z=!1,x=!1,t=-1;h=h||{};e=h.encoding||"UTF8";w=h.numRounds||1;if(w!==parseInt(w,10)||1>w)throw Error("numRounds must a integer >= 1");if(0===d.lastIndexOf("SHA3-",0)||0===d.lastIndexOf("SHAKE",0)){var C=6;f=B;v=function(c){var a=[],e;for(e=0;5>e;e+=1)a[e]=c[e].slice();return a};t=1;if("SHA3-224"===d)k=1152,g=224;else if("SHA3-256"===d)k=1088,g=256;else if("SHA3-384"===d)k=832,g=384;else if("SHA3-512"===d)k=
576,g=512;else if("SHAKE128"===d)k=1344,g=-1,C=31,x=!0;else if("SHAKE256"===d)k=1088,g=-1,C=31,x=!0;else throw Error("Chosen SHA variant is not supported");p=function(c,a,e,g,d){e=k;var b=C,m,l=[],f=e>>>5,h=0,r=a>>>5;for(m=0;m<r&&a>=e;m+=f)g=B(c.slice(m,m+f),g),a-=e;c=c.slice(m);for(a%=e;c.length<f;)c.push(0);m=a>>>3;c[m>>2]^=b<<m%4*8;c[f-1]^=2147483648;for(g=B(c,g);32*l.length<d;){c=g[h%5][h/5|0];l.push(c.b);if(32*l.length>=d)break;l.push(c.a);h+=1;0===64*h%e&&B(null,g)}return l}}else throw Error("Chosen SHA variant is not supported");
r=D(b,e,t);m=y(d);this.setHMACKey=function(a,b,l){var h;if(!0===A)throw Error("HMAC key already set");if(!0===z)throw Error("Cannot set HMAC key after calling update");if(!0===x)throw Error("SHAKE is not supported for HMAC");e=(l||{}).encoding||"UTF8";b=D(b,e,t)(a);a=b.binLen;b=b.value;h=k>>>3;l=h/4-1;if(h<a/8){for(b=p(b,a,0,y(d),g);b.length<=l;)b.push(0);b[l]&=4294967040}else if(h>a/8){for(;b.length<=l;)b.push(0);b[l]&=4294967040}for(a=0;a<=l;a+=1)n[a]=b[a]^909522486,u[a]=b[a]^1549556828;m=f(n,m);
c=k;A=!0};this.update=function(e){var b,g,d,h=0,p=k>>>5;b=r(e,a,l);e=b.binLen;g=b.value;b=e>>>5;for(d=0;d<b;d+=p)h+k<=e&&(m=f(g.slice(d,d+p),m),h+=k);c+=h;a=g.slice(h>>>5);l=e%k;z=!0};this.getHash=function(e,b){var h,f,r,k;if(!0===A)throw Error("Cannot call getHash after setting HMAC key");r=E(b);if(!0===x){if(-1===r.shakeLen)throw Error("shakeLen must be specified in options");g=r.shakeLen}switch(e){case "HEX":h=function(a){return F(a,g,t,r)};break;case "B64":h=function(a){return G(a,g,t,r)};break;
case "BYTES":h=function(a){return H(a,g,t)};break;case "ARRAYBUFFER":try{f=new ArrayBuffer(0)}catch(q){throw Error("ARRAYBUFFER not supported by this environment");}h=function(a){return I(a,g,t)};break;default:throw Error("format must be HEX, B64, BYTES, or ARRAYBUFFER");}k=p(a.slice(),l,c,v(m),g);for(f=1;f<w;f+=1)!0===x&&0!==g%32&&(k[k.length-1]&=16777215>>>24-g%32),k=p(k,g,0,y(d),g);return h(k)};this.getHMAC=function(e,b){var h,r,n,w;if(!1===A)throw Error("Cannot call getHMAC without first setting HMAC key");
n=E(b);switch(e){case "HEX":h=function(a){return F(a,g,t,n)};break;case "B64":h=function(a){return G(a,g,t,n)};break;case "BYTES":h=function(a){return H(a,g,t)};break;case "ARRAYBUFFER":try{h=new ArrayBuffer(0)}catch(M){throw Error("ARRAYBUFFER not supported by this environment");}h=function(a){return I(a,g,t)};break;default:throw Error("outputFormat must be HEX, B64, BYTES, or ARRAYBUFFER");}r=p(a.slice(),l,c,v(m),g);w=f(u,y(d));w=p(r,g,k,w,g);return h(w)}}function f(d,b){this.a=d;this.b=b}function F(d,
b,h,c){var a="";b/=8;var l,e,m;m=-1===h?3:0;for(l=0;l<b;l+=1)e=d[l>>>2]>>>8*(m+l%4*h),a+="0123456789abcdef".charAt(e>>>4&15)+"0123456789abcdef".charAt(e&15);return c.outputUpper?a.toUpperCase():a}function G(d,b,h,c){var a="",l=b/8,e,m,f,g;g=-1===h?3:0;for(e=0;e<l;e+=3)for(m=e+1<l?d[e+1>>>2]:0,f=e+2<l?d[e+2>>>2]:0,f=(d[e>>>2]>>>8*(g+e%4*h)&255)<<16|(m>>>8*(g+(e+1)%4*h)&255)<<8|f>>>8*(g+(e+2)%4*h)&255,m=0;4>m;m+=1)8*e+6*m<=b?a+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(f>>>
6*(3-m)&63):a+=c.b64Pad;return a}function H(d,b,h){var c="";b/=8;var a,l,e;e=-1===h?3:0;for(a=0;a<b;a+=1)l=d[a>>>2]>>>8*(e+a%4*h)&255,c+=String.fromCharCode(l);return c}function I(d,b,h){b/=8;var c,a=new ArrayBuffer(b),l,e;e=new Uint8Array(a);l=-1===h?3:0;for(c=0;c<b;c+=1)e[c]=d[c>>>2]>>>8*(l+c%4*h)&255;return a}function E(d){var b={outputUpper:!1,b64Pad:"=",shakeLen:-1};d=d||{};b.outputUpper=d.outputUpper||!1;!0===d.hasOwnProperty("b64Pad")&&(b.b64Pad=d.b64Pad);if(!0===d.hasOwnProperty("shakeLen")){if(0!==
d.shakeLen%8)throw Error("shakeLen must be a multiple of 8");b.shakeLen=d.shakeLen}if("boolean"!==typeof b.outputUpper)throw Error("Invalid outputUpper formatting option");if("string"!==typeof b.b64Pad)throw Error("Invalid b64Pad formatting option");return b}function D(d,b,h){switch(b){case "UTF8":case "UTF16BE":case "UTF16LE":break;default:throw Error("encoding must be UTF8, UTF16BE, or UTF16LE");}switch(d){case "HEX":d=function(c,a,b){var e=c.length,d,f,g,k,q,p;if(0!==e%2)throw Error("String of HEX type must be in byte increments");
a=a||[0];b=b||0;q=b>>>3;p=-1===h?3:0;for(d=0;d<e;d+=2){f=parseInt(c.substr(d,2),16);if(isNaN(f))throw Error("String of HEX type contains invalid characters");k=(d>>>1)+q;for(g=k>>>2;a.length<=g;)a.push(0);a[g]|=f<<8*(p+k%4*h)}return{value:a,binLen:4*e+b}};break;case "TEXT":d=function(c,a,d){var e,m,f=0,g,k,q,p,v,n;a=a||[0];d=d||0;q=d>>>3;if("UTF8"===b)for(n=-1===h?3:0,g=0;g<c.length;g+=1)for(e=c.charCodeAt(g),m=[],128>e?m.push(e):2048>e?(m.push(192|e>>>6),m.push(128|e&63)):55296>e||57344<=e?m.push(224|
e>>>12,128|e>>>6&63,128|e&63):(g+=1,e=65536+((e&1023)<<10|c.charCodeAt(g)&1023),m.push(240|e>>>18,128|e>>>12&63,128|e>>>6&63,128|e&63)),k=0;k<m.length;k+=1){v=f+q;for(p=v>>>2;a.length<=p;)a.push(0);a[p]|=m[k]<<8*(n+v%4*h);f+=1}else if("UTF16BE"===b||"UTF16LE"===b)for(n=-1===h?2:0,m="UTF16LE"===b&&1!==h||"UTF16LE"!==b&&1===h,g=0;g<c.length;g+=1){e=c.charCodeAt(g);!0===m&&(k=e&255,e=k<<8|e>>>8);v=f+q;for(p=v>>>2;a.length<=p;)a.push(0);a[p]|=e<<8*(n+v%4*h);f+=2}return{value:a,binLen:8*f+d}};break;case "B64":d=
function(c,a,b){var e=0,d,f,g,k,q,p,n,u;if(-1===c.search(/^[a-zA-Z0-9=+\/]+$/))throw Error("Invalid character in base-64 string");f=c.indexOf("=");c=c.replace(/\=/g,"");if(-1!==f&&f<c.length)throw Error("Invalid '=' found in base-64 string");a=a||[0];b=b||0;p=b>>>3;u=-1===h?3:0;for(f=0;f<c.length;f+=4){q=c.substr(f,4);for(g=k=0;g<q.length;g+=1)d="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".indexOf(q[g]),k|=d<<18-6*g;for(g=0;g<q.length-1;g+=1){n=e+p;for(d=n>>>2;a.length<=d;)a.push(0);
a[d]|=(k>>>16-8*g&255)<<8*(u+n%4*h);e+=1}}return{value:a,binLen:8*e+b}};break;case "BYTES":d=function(c,a,b){var e,d,f,g,k,n;a=a||[0];b=b||0;f=b>>>3;n=-1===h?3:0;for(d=0;d<c.length;d+=1)e=c.charCodeAt(d),k=d+f,g=k>>>2,a.length<=g&&a.push(0),a[g]|=e<<8*(n+k%4*h);return{value:a,binLen:8*c.length+b}};break;case "ARRAYBUFFER":try{d=new ArrayBuffer(0)}catch(c){throw Error("ARRAYBUFFER not supported by this environment");}d=function(c,a,b){var d,f,n,g,k,q;a=a||[0];b=b||0;f=b>>>3;k=-1===h?3:0;q=new Uint8Array(c);
for(d=0;d<c.byteLength;d+=1)g=d+f,n=g>>>2,a.length<=n&&a.push(0),a[n]|=q[d]<<8*(k+g%4*h);return{value:a,binLen:8*c.byteLength+b}};break;default:throw Error("format must be HEX, TEXT, B64, BYTES, or ARRAYBUFFER");}return d}function z(d,b){return 32<b?(b-=32,new f(d.b<<b|d.a>>>32-b,d.a<<b|d.b>>>32-b)):0!==b?new f(d.a<<b|d.b>>>32-b,d.b<<b|d.a>>>32-b):d}function n(d,b){return new f(d.a^b.a,d.b^b.b)}function y(d){var b=[];if(0===d.lastIndexOf("SHA3-",0)||0===d.lastIndexOf("SHAKE",0))for(d=0;5>d;d+=1)b[d]=
[new f(0,0),new f(0,0),new f(0,0),new f(0,0),new f(0,0)];else throw Error("No SHA variants supported");return b}function B(d,b){var h,c,a,l,e=[],m=[];if(null!==d)for(c=0;c<d.length;c+=2)b[(c>>>1)%5][(c>>>1)/5|0]=n(b[(c>>>1)%5][(c>>>1)/5|0],new f(d[c+1],d[c]));for(h=0;24>h;h+=1){l=y("SHA3-");for(c=0;5>c;c+=1){a=b[c][0];var r=b[c][1],g=b[c][2],k=b[c][3],q=b[c][4];e[c]=new f(a.a^r.a^g.a^k.a^q.a,a.b^r.b^g.b^k.b^q.b)}for(c=0;5>c;c+=1)m[c]=n(e[(c+4)%5],z(e[(c+1)%5],1));for(c=0;5>c;c+=1)for(a=0;5>a;a+=1)b[c][a]=
n(b[c][a],m[c]);for(c=0;5>c;c+=1)for(a=0;5>a;a+=1)l[a][(2*c+3*a)%5]=z(b[c][a],J[c][a]);for(c=0;5>c;c+=1)for(a=0;5>a;a+=1)b[c][a]=n(l[c][a],new f(~l[(c+1)%5][a].a&l[(c+2)%5][a].a,~l[(c+1)%5][a].b&l[(c+2)%5][a].b));b[0][0]=n(b[0][0],K[h])}return b}var J,K;K=[new f(0,1),new f(0,32898),new f(2147483648,32906),new f(2147483648,2147516416),new f(0,32907),new f(0,2147483649),new f(2147483648,2147516545),new f(2147483648,32777),new f(0,138),new f(0,136),new f(0,2147516425),new f(0,2147483658),new f(0,2147516555),
new f(2147483648,139),new f(2147483648,32905),new f(2147483648,32771),new f(2147483648,32770),new f(2147483648,128),new f(0,32778),new f(2147483648,2147483658),new f(2147483648,2147516545),new f(2147483648,32896),new f(0,2147483649),new f(2147483648,2147516424)];J=[[0,36,3,41,18],[1,44,10,45,2],[62,6,43,15,61],[28,55,25,21,56],[27,20,39,8,14]];"function"===typeof define&&define.amd?define(function(){return u}):"undefined"!==typeof exports?("undefined"!==typeof module&&module.exports&&(module.exports=
u),exports=u):L.jsSHA=u})(this);

34
frontend/jsSHA/src/sha512.js Executable file
View file

@ -0,0 +1,34 @@
/*
A JavaScript implementation of the SHA family of hashes, as
defined in FIPS PUB 180-4 and FIPS PUB 202, as well as the corresponding
HMAC implementation as defined in FIPS PUB 198a
Copyright 2008-2018 Brian Turek, 1998-2009 Paul Johnston & Contributors
Distributed under the BSD License
See http://caligatio.github.com/jsSHA/ for more information
*/
'use strict';(function(K){function x(b,a,d){var e=0,g=[],k=0,f,c,m,h,l,p,t,q,y=!1,u=[],r=[],v,A=!1;d=d||{};f=d.encoding||"UTF8";v=d.numRounds||1;if(v!==parseInt(v,10)||1>v)throw Error("numRounds must a integer >= 1");if(0===b.lastIndexOf("SHA-",0))if(p=function(a,d){return B(a,d,b)},t=function(a,d,g,e){var c,k;if("SHA-384"===b||"SHA-512"===b)c=(d+129>>>10<<5)+31,k=32;else throw Error("Unexpected error in SHA-2 implementation");for(;a.length<=c;)a.push(0);a[d>>>5]|=128<<24-d%32;d=d+g;a[c]=d&4294967295;
a[c-1]=d/4294967296|0;g=a.length;for(d=0;d<g;d+=k)e=B(a.slice(d,d+k),e,b);if("SHA-384"===b)a=[e[0].a,e[0].b,e[1].a,e[1].b,e[2].a,e[2].b,e[3].a,e[3].b,e[4].a,e[4].b,e[5].a,e[5].b];else if("SHA-512"===b)a=[e[0].a,e[0].b,e[1].a,e[1].b,e[2].a,e[2].b,e[3].a,e[3].b,e[4].a,e[4].b,e[5].a,e[5].b,e[6].a,e[6].b,e[7].a,e[7].b];else throw Error("Unexpected error in SHA-2 implementation");return a},q=function(a){return a.slice()},"SHA-384"===b)l=1024,h=384;else if("SHA-512"===b)l=1024,h=512;else throw Error("Chosen SHA variant is not supported");
else throw Error("Chosen SHA variant is not supported");m=C(a,f);c=z(b);this.setHMACKey=function(a,d,g){var k;if(!0===y)throw Error("HMAC key already set");if(!0===A)throw Error("Cannot set HMAC key after calling update");f=(g||{}).encoding||"UTF8";d=C(d,f)(a);a=d.binLen;d=d.value;k=l>>>3;g=k/4-1;if(k<a/8){for(d=t(d,a,0,z(b));d.length<=g;)d.push(0);d[g]&=4294967040}else if(k>a/8){for(;d.length<=g;)d.push(0);d[g]&=4294967040}for(a=0;a<=g;a+=1)u[a]=d[a]^909522486,r[a]=d[a]^1549556828;c=p(u,c);e=l;y=
!0};this.update=function(a){var d,b,n,f=0,h=l>>>5;d=m(a,g,k);a=d.binLen;b=d.value;d=a>>>5;for(n=0;n<d;n+=h)f+l<=a&&(c=p(b.slice(n,n+h),c),f+=l);e+=f;g=b.slice(f>>>5);k=a%l;A=!0};this.getHash=function(a,d){var f,l,m,p;if(!0===y)throw Error("Cannot call getHash after setting HMAC key");m=D(d);switch(a){case "HEX":f=function(a){return E(a,h,m)};break;case "B64":f=function(a){return F(a,h,m)};break;case "BYTES":f=function(a){return G(a,h)};break;case "ARRAYBUFFER":try{l=new ArrayBuffer(0)}catch(w){throw Error("ARRAYBUFFER not supported by this environment");
}f=function(a){return H(a,h)};break;default:throw Error("format must be HEX, B64, BYTES, or ARRAYBUFFER");}p=t(g.slice(),k,e,q(c));for(l=1;l<v;l+=1)p=t(p,h,0,z(b));return f(p)};this.getHMAC=function(a,d){var f,m,u,v;if(!1===y)throw Error("Cannot call getHMAC without first setting HMAC key");u=D(d);switch(a){case "HEX":f=function(a){return E(a,h,u)};break;case "B64":f=function(a){return F(a,h,u)};break;case "BYTES":f=function(a){return G(a,h)};break;case "ARRAYBUFFER":try{f=new ArrayBuffer(0)}catch(w){throw Error("ARRAYBUFFER not supported by this environment");
}f=function(a){return H(a,h)};break;default:throw Error("outputFormat must be HEX, B64, BYTES, or ARRAYBUFFER");}m=t(g.slice(),k,e,q(c));v=p(r,z(b));v=t(m,h,l,v);return f(v)}}function b(b,a){this.a=b;this.b=a}function E(b,a,d){var e="";a/=8;var g,k;for(g=0;g<a;g+=1)k=b[g>>>2]>>>8*(3+g%4*-1),e+="0123456789abcdef".charAt(k>>>4&15)+"0123456789abcdef".charAt(k&15);return d.outputUpper?e.toUpperCase():e}function F(b,a,d){var e="",g=a/8,k,f,c;for(k=0;k<g;k+=3)for(f=k+1<g?b[k+1>>>2]:0,c=k+2<g?b[k+2>>>2]:
0,c=(b[k>>>2]>>>8*(3+k%4*-1)&255)<<16|(f>>>8*(3+(k+1)%4*-1)&255)<<8|c>>>8*(3+(k+2)%4*-1)&255,f=0;4>f;f+=1)8*k+6*f<=a?e+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(c>>>6*(3-f)&63):e+=d.b64Pad;return e}function G(b,a){var d="",e=a/8,g,c;for(g=0;g<e;g+=1)c=b[g>>>2]>>>8*(3+g%4*-1)&255,d+=String.fromCharCode(c);return d}function H(b,a){var d=a/8,e,g=new ArrayBuffer(d),c;c=new Uint8Array(g);for(e=0;e<d;e+=1)c[e]=b[e>>>2]>>>8*(3+e%4*-1)&255;return g}function D(b){var a={outputUpper:!1,
b64Pad:"=",shakeLen:-1};b=b||{};a.outputUpper=b.outputUpper||!1;!0===b.hasOwnProperty("b64Pad")&&(a.b64Pad=b.b64Pad);if("boolean"!==typeof a.outputUpper)throw Error("Invalid outputUpper formatting option");if("string"!==typeof a.b64Pad)throw Error("Invalid b64Pad formatting option");return a}function C(b,a){var d;switch(a){case "UTF8":case "UTF16BE":case "UTF16LE":break;default:throw Error("encoding must be UTF8, UTF16BE, or UTF16LE");}switch(b){case "HEX":d=function(a,b,d){var f=a.length,c,n,h,l,
p;if(0!==f%2)throw Error("String of HEX type must be in byte increments");b=b||[0];d=d||0;p=d>>>3;for(c=0;c<f;c+=2){n=parseInt(a.substr(c,2),16);if(isNaN(n))throw Error("String of HEX type contains invalid characters");l=(c>>>1)+p;for(h=l>>>2;b.length<=h;)b.push(0);b[h]|=n<<8*(3+l%4*-1)}return{value:b,binLen:4*f+d}};break;case "TEXT":d=function(b,d,c){var f,n,m=0,h,l,p,t,q,r;d=d||[0];c=c||0;p=c>>>3;if("UTF8"===a)for(r=3,h=0;h<b.length;h+=1)for(f=b.charCodeAt(h),n=[],128>f?n.push(f):2048>f?(n.push(192|
f>>>6),n.push(128|f&63)):55296>f||57344<=f?n.push(224|f>>>12,128|f>>>6&63,128|f&63):(h+=1,f=65536+((f&1023)<<10|b.charCodeAt(h)&1023),n.push(240|f>>>18,128|f>>>12&63,128|f>>>6&63,128|f&63)),l=0;l<n.length;l+=1){q=m+p;for(t=q>>>2;d.length<=t;)d.push(0);d[t]|=n[l]<<8*(r+q%4*-1);m+=1}else if("UTF16BE"===a||"UTF16LE"===a)for(r=2,n="UTF16LE"===a&&!0||"UTF16LE"!==a&&!1,h=0;h<b.length;h+=1){f=b.charCodeAt(h);!0===n&&(l=f&255,f=l<<8|f>>>8);q=m+p;for(t=q>>>2;d.length<=t;)d.push(0);d[t]|=f<<8*(r+q%4*-1);m+=
2}return{value:d,binLen:8*m+c}};break;case "B64":d=function(a,b,d){var c=0,n,m,h,l,p,t,q;if(-1===a.search(/^[a-zA-Z0-9=+\/]+$/))throw Error("Invalid character in base-64 string");m=a.indexOf("=");a=a.replace(/\=/g,"");if(-1!==m&&m<a.length)throw Error("Invalid '=' found in base-64 string");b=b||[0];d=d||0;t=d>>>3;for(m=0;m<a.length;m+=4){p=a.substr(m,4);for(h=l=0;h<p.length;h+=1)n="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".indexOf(p[h]),l|=n<<18-6*h;for(h=0;h<p.length-1;h+=
1){q=c+t;for(n=q>>>2;b.length<=n;)b.push(0);b[n]|=(l>>>16-8*h&255)<<8*(3+q%4*-1);c+=1}}return{value:b,binLen:8*c+d}};break;case "BYTES":d=function(a,b,d){var c,n,m,h,l;b=b||[0];d=d||0;m=d>>>3;for(n=0;n<a.length;n+=1)c=a.charCodeAt(n),l=n+m,h=l>>>2,b.length<=h&&b.push(0),b[h]|=c<<8*(3+l%4*-1);return{value:b,binLen:8*a.length+d}};break;case "ARRAYBUFFER":try{d=new ArrayBuffer(0)}catch(e){throw Error("ARRAYBUFFER not supported by this environment");}d=function(a,b,d){var c,n,m,h,l;b=b||[0];d=d||0;n=
d>>>3;l=new Uint8Array(a);for(c=0;c<a.byteLength;c+=1)h=c+n,m=h>>>2,b.length<=m&&b.push(0),b[m]|=l[c]<<8*(3+h%4*-1);return{value:b,binLen:8*a.byteLength+d}};break;default:throw Error("format must be HEX, TEXT, B64, BYTES, or ARRAYBUFFER");}return d}function r(c,a){var d=null,d=new b(c.a,c.b);return d=32>=a?new b(d.a>>>a|d.b<<32-a&4294967295,d.b>>>a|d.a<<32-a&4294967295):new b(d.b>>>a-32|d.a<<64-a&4294967295,d.a>>>a-32|d.b<<64-a&4294967295)}function I(c,a){var d=null;return d=32>=a?new b(c.a>>>a,c.b>>>
a|c.a<<32-a&4294967295):new b(0,c.a>>>a-32)}function L(c,a,d){return new b(c.a&a.a^~c.a&d.a,c.b&a.b^~c.b&d.b)}function M(c,a,d){return new b(c.a&a.a^c.a&d.a^a.a&d.a,c.b&a.b^c.b&d.b^a.b&d.b)}function N(c){var a=r(c,28),d=r(c,34);c=r(c,39);return new b(a.a^d.a^c.a,a.b^d.b^c.b)}function O(c){var a=r(c,14),d=r(c,18);c=r(c,41);return new b(a.a^d.a^c.a,a.b^d.b^c.b)}function P(c){var a=r(c,1),d=r(c,8);c=I(c,7);return new b(a.a^d.a^c.a,a.b^d.b^c.b)}function Q(c){var a=r(c,19),d=r(c,61);c=I(c,6);return new b(a.a^
d.a^c.a,a.b^d.b^c.b)}function R(c,a){var d,e,g;d=(c.b&65535)+(a.b&65535);e=(c.b>>>16)+(a.b>>>16)+(d>>>16);g=(e&65535)<<16|d&65535;d=(c.a&65535)+(a.a&65535)+(e>>>16);e=(c.a>>>16)+(a.a>>>16)+(d>>>16);return new b((e&65535)<<16|d&65535,g)}function S(c,a,d,e){var g,k,f;g=(c.b&65535)+(a.b&65535)+(d.b&65535)+(e.b&65535);k=(c.b>>>16)+(a.b>>>16)+(d.b>>>16)+(e.b>>>16)+(g>>>16);f=(k&65535)<<16|g&65535;g=(c.a&65535)+(a.a&65535)+(d.a&65535)+(e.a&65535)+(k>>>16);k=(c.a>>>16)+(a.a>>>16)+(d.a>>>16)+(e.a>>>16)+(g>>>
16);return new b((k&65535)<<16|g&65535,f)}function T(c,a,d,e,g){var k,f,r;k=(c.b&65535)+(a.b&65535)+(d.b&65535)+(e.b&65535)+(g.b&65535);f=(c.b>>>16)+(a.b>>>16)+(d.b>>>16)+(e.b>>>16)+(g.b>>>16)+(k>>>16);r=(f&65535)<<16|k&65535;k=(c.a&65535)+(a.a&65535)+(d.a&65535)+(e.a&65535)+(g.a&65535)+(f>>>16);f=(c.a>>>16)+(a.a>>>16)+(d.a>>>16)+(e.a>>>16)+(g.a>>>16)+(k>>>16);return new b((f&65535)<<16|k&65535,r)}function z(c){var a=[],d;if(0===c.lastIndexOf("SHA-",0))switch(a=[3238371032,914150663,812702999,4144912697,
4290775857,1750603025,1694076839,3204075428],d=[1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225],c){case "SHA-224":break;case "SHA-256":a=d;break;case "SHA-384":a=[new b(3418070365,a[0]),new b(1654270250,a[1]),new b(2438529370,a[2]),new b(355462360,a[3]),new b(1731405415,a[4]),new b(41048885895,a[5]),new b(3675008525,a[6]),new b(1203062813,a[7])];break;case "SHA-512":a=[new b(d[0],4089235720),new b(d[1],2227873595),new b(d[2],4271175723),new b(d[3],1595750129),
new b(d[4],2917565137),new b(d[5],725511199),new b(d[6],4215389547),new b(d[7],327033209)];break;default:throw Error("Unknown SHA variant");}else throw Error("No SHA variants supported");return a}function B(c,a,d){var e,g,k,f,r,m,h,l,p,t,q,y,u,x,v,A,z,B,C,D,E,F,w=[],G;if("SHA-384"===d||"SHA-512"===d)t=80,y=2,F=b,u=R,x=S,v=T,A=P,z=Q,B=N,C=O,E=M,D=L,G=J;else throw Error("Unexpected error in SHA-2 implementation");d=a[0];e=a[1];g=a[2];k=a[3];f=a[4];r=a[5];m=a[6];h=a[7];for(q=0;q<t;q+=1)16>q?(p=q*y,l=
c.length<=p?0:c[p],p=c.length<=p+1?0:c[p+1],w[q]=new F(l,p)):w[q]=x(z(w[q-2]),w[q-7],A(w[q-15]),w[q-16]),l=v(h,C(f),D(f,r,m),G[q],w[q]),p=u(B(d),E(d,e,g)),h=m,m=r,r=f,f=u(k,l),k=g,g=e,e=d,d=u(l,p);a[0]=u(d,a[0]);a[1]=u(e,a[1]);a[2]=u(g,a[2]);a[3]=u(k,a[3]);a[4]=u(f,a[4]);a[5]=u(r,a[5]);a[6]=u(m,a[6]);a[7]=u(h,a[7]);return a}var c,J;c=[1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,
3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,
3329325298];J=[new b(c[0],3609767458),new b(c[1],602891725),new b(c[2],3964484399),new b(c[3],2173295548),new b(c[4],4081628472),new b(c[5],3053834265),new b(c[6],2937671579),new b(c[7],3664609560),new b(c[8],2734883394),new b(c[9],1164996542),new b(c[10],1323610764),new b(c[11],3590304994),new b(c[12],4068182383),new b(c[13],991336113),new b(c[14],633803317),new b(c[15],3479774868),new b(c[16],2666613458),new b(c[17],944711139),new b(c[18],2341262773),new b(c[19],2007800933),new b(c[20],1495990901),
new b(c[21],1856431235),new b(c[22],3175218132),new b(c[23],2198950837),new b(c[24],3999719339),new b(c[25],766784016),new b(c[26],2566594879),new b(c[27],3203337956),new b(c[28],1034457026),new b(c[29],2466948901),new b(c[30],3758326383),new b(c[31],168717936),new b(c[32],1188179964),new b(c[33],1546045734),new b(c[34],1522805485),new b(c[35],2643833823),new b(c[36],2343527390),new b(c[37],1014477480),new b(c[38],1206759142),new b(c[39],344077627),new b(c[40],1290863460),new b(c[41],3158454273),
new b(c[42],3505952657),new b(c[43],106217008),new b(c[44],3606008344),new b(c[45],1432725776),new b(c[46],1467031594),new b(c[47],851169720),new b(c[48],3100823752),new b(c[49],1363258195),new b(c[50],3750685593),new b(c[51],3785050280),new b(c[52],3318307427),new b(c[53],3812723403),new b(c[54],2003034995),new b(c[55],3602036899),new b(c[56],1575990012),new b(c[57],1125592928),new b(c[58],2716904306),new b(c[59],442776044),new b(c[60],593698344),new b(c[61],3733110249),new b(c[62],2999351573),new b(c[63],
3815920427),new b(3391569614,3928383900),new b(3515267271,566280711),new b(3940187606,3454069534),new b(4118630271,4000239992),new b(116418474,1914138554),new b(174292421,2731055270),new b(289380356,3203993006),new b(460393269,320620315),new b(685471733,587496836),new b(852142971,1086792851),new b(1017036298,365543100),new b(1126000580,2618297676),new b(1288033470,3409855158),new b(1501505948,4234509866),new b(1607167915,987167468),new b(1816402316,1246189591)];"function"===typeof define&&define.amd?
define(function(){return x}):"undefined"!==typeof exports?("undefined"!==typeof module&&module.exports&&(module.exports=x),exports=x):K.jsSHA=x})(this);

2254
frontend/jsSHA/src/sha_dev.js Executable file

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,67 @@
#!/usr/bin/env python2
import binascii
import hashlib
import sha3
def main():
hash_funcs = [
('SHA-1', hashlib.sha1),
('SHA-224', hashlib.sha224),
('SHA-256', hashlib.sha256),
('SHA-384', hashlib.sha384),
('SHA-512', hashlib.sha512)]
for (sha_type, sha_func) in hash_funcs:
digest = sha_func('abc').digest()
# Only loop 4 times since an iteration was done above
for x in xrange(0, 4):
digest = sha_func(digest).digest()
print('{} with 5 Rounds: {}'.format(sha_type, digest.encode('hex')))
# Loop another 5 times to get to 10
for x in xrange(0, 5):
digest = sha_func(digest).digest()
print('{} with 10 Rounds: {}'.format(sha_type, digest.encode('hex')))
# SHA3 is handled differently as it's not in hashlib.
# Use the SHA3 creators' version
hash3_funcs = [
('SHA3-224', sha3.SHA3_224),
('SHA3-256', sha3.SHA3_256),
('SHA3-384', sha3.SHA3_384),
('SHA3-512', sha3.SHA3_512)]
for (sha_type, sha_func) in hash3_funcs:
digest = sha_func([ord(c) for c in 'abc'])
# Only loop 4 times since an iteration was done above
for x in xrange(0, 4):
digest = sha_func(digest)
print('{} with 5 Rounds: {}'.format(sha_type, binascii.hexlify(digest)))
# Loop another 5 times to get to 10
for x in xrange(0, 5):
digest = sha_func(digest)
print('{} with 10 Rounds: {}'.format(sha_type, binascii.hexlify(digest)))
hash3_funcs = [
('SHAKE128', sha3.SHAKE128),
('SHAKE256', sha3.SHAKE256)]
for (sha_type, sha_func) in hash3_funcs:
digest = sha_func([ord(c) for c in 'abc'], 31)
# Only loop 4 times since an iteration was done above
for x in xrange(0, 4):
digest = sha_func(digest, 31)
print('{} with 5 Rounds: {}'.format(sha_type, binascii.hexlify(digest)))
# Loop another 5 times to get to 10
for x in xrange(0, 5):
digest = sha_func(digest, 31)
print('{} with 10 Rounds: {}'.format(sha_type, binascii.hexlify(digest)))
if ('__main__' == __name__):
main()

42
frontend/jsSHA/test/genShake.py Executable file
View file

@ -0,0 +1,42 @@
#!/usr/bin/env python2
import binascii
import sha3
def main():
test_vectors = {
'Short': 'abc',
'Medium': 'abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu',
'Long': 'a' * 1000000
}
hash_funcs = {'SHAKE128': sha3.SHAKE128, 'SHAKE256': sha3.SHAKE256}
output_lens = [31, 63]
for hash_name, hash_func in hash_funcs.items():
for vector_name, vector_value in test_vectors.items():
for output_len in output_lens:
print('%s with %s UTF-8 Input and %d bit Output: %s' % (
hash_name,
vector_name,
output_len * 8,
binascii.hexlify(hash_func(vector_value.encode(), output_len)).decode()
)
)
print('%s with %s UTF-16BE Input and %d bit Output: %s' % (
hash_name,
vector_name,
output_len * 8,
binascii.hexlify(hash_func(vector_value.encode('UTF-16BE'), output_len)).decode()
)
)
print('%s with %s UTF-16LE Input and %d bit Output: %s' % (
hash_name,
vector_name,
output_len * 8,
binascii.hexlify(hash_func(vector_value.encode('UTF-16LE'), output_len)).decode()
)
)
if ('__main__' == __name__):
main()

View file

@ -0,0 +1,114 @@
<!DOCTYPE html>
<html>
<head>
<title>jsSHA (http://caligatio.github.com/jsSHA/) - File Test</title>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<script type="text/javascript" src="../src/sha.js"></script>
<script type="text/javascript" >
// How many bytes to read per chunk
var chunkSize = Math.pow(10, 5)
// Handle various I/O problems
function errorHandler(evt) {
switch(evt.target.error.code) {
case evt.target.error.NOT_FOUND_ERR:
alert('File Not Found!')
break
case evt.target.error.NOT_READABLE_ERR:
alert('File is not readable')
break
case evt.target.error.ABORT_ERR:
break // noop
default:
alert('An error occurred reading this file.')
}
}
// Recurse through async chunk reads
function readFile(hasher1, hasher224, hasher256, hasher384, hasher512, file, start, stop) {
var progress = document.querySelector('#progress')
// Only read to the end of the file
stop = (stop <= file.size) ? stop : file.size
// Prepare to read chunk
var reader = new FileReader()
reader.onerror = errorHandler
// If we use onloadend, we need to check the readyState.
reader.onloadend = function(evt) {
if (evt.target.readyState == FileReader.DONE) {
hasher1.update(evt.target.result)
hasher224.update(evt.target.result)
hasher256.update(evt.target.result)
hasher384.update(evt.target.result)
hasher512.update(evt.target.result)
var percent = Math.round((stop / file.size) * 100)
progress.innerHTML = 'Progress: ' + percent + '%'
// Recurse or finish
if (stop == file.size) {
progress.innerHTML = "";
result1 = hasher1.getHash('HEX')
result224 = hasher224.getHash('HEX')
result256 = hasher256.getHash('HEX')
result384 = hasher384.getHash('HEX')
result512 = hasher512.getHash('HEX')
progress.innerHTML += '<p>SHA-1: ' + result1 + '</p>';
progress.innerHTML += '<p>SHA-224: ' + result224 + '</p>';
progress.innerHTML += '<p>SHA-256: ' + result256 + '</p>';
progress.innerHTML += '<p>SHA-384: ' + result384 + '</p>';
progress.innerHTML += '<p>SHA-512: ' + result512 + '</p>';
} else {
readFile(hasher1, hasher224, hasher256, hasher384, hasher512, file, start + chunkSize, stop + chunkSize)
}
}
}
// Begin read
var blob = file.slice(start, stop)
reader.readAsArrayBuffer(blob)
}
function handleFileSelect(input) {
var progress = document.querySelector('#progress')
// Reset progress indicator on new file selection.
progress.innerHTML = 'Progress: 0%';
// Get file object from the form
var file = input.files[0];
var hasher1 = new jsSHA('SHA-1', 'ARRAYBUFFER')
var hasher224 = new jsSHA('SHA-224', 'ARRAYBUFFER')
var hasher256 = new jsSHA('SHA-256', 'ARRAYBUFFER')
var hasher384 = new jsSHA('SHA-384', 'ARRAYBUFFER')
var hasher512 = new jsSHA('SHA-512', 'ARRAYBUFFER')
// Read file in chunks
readFile(hasher1, hasher224, hasher256, hasher384, hasher512, file, 0, chunkSize)
}
</script>
<style type="text/css">
.correct
{
color: #00FF00;
background-color: #FFFFFF;
}
.incorrect
{
color: #FF0000;
background-color: #FFFFFF;
}
</style>
</head>
<body>
Drop this project's LICENSE file to test, or any other file to find its hashes:
<p>
<input type="file" id="files" name="file" onchange="handleFileSelect(this)" />
</p>
NOTE: This may not work in Internet Explorer
<div id="progress"></div>
</body>
</html>

106
frontend/jsSHA/test/sha3.py Executable file
View file

@ -0,0 +1,106 @@
# -*- coding: utf-8 -*-
# Implementation by the Keccak, Keyak and Ketje Teams, namely, Guido Bertoni,
# Joan Daemen, Michaël Peeters, Gilles Van Assche and Ronny Van Keer, hereby
# denoted as "the implementer".
#
# For more information, feedback or questions, please refer to our websites:
# http://keccak.noekeon.org/
# http://keyak.noekeon.org/
# http://ketje.noekeon.org/
#
# To the extent possible under law, the implementer has waived all copyright
# and related or neighboring rights to the source code in this file.
# http://creativecommons.org/publicdomain/zero/1.0/
def ROL64(a, n):
return ((a >> (64-(n%64))) + (a << (n%64))) % (1 << 64)
def KeccakF1600onLanes(lanes):
R = 1
for round in range(24):
# θ
C = [lanes[x][0] ^ lanes[x][1] ^ lanes[x][2] ^ lanes[x][3] ^ lanes[x][4] for x in range(5)]
D = [C[(x+4)%5] ^ ROL64(C[(x+1)%5], 1) for x in range(5)]
lanes = [[lanes[x][y]^D[x] for y in range(5)] for x in range(5)]
# ρ and π
(x, y) = (1, 0)
current = lanes[x][y]
for t in range(24):
(x, y) = (y, (2*x+3*y)%5)
(current, lanes[x][y]) = (lanes[x][y], ROL64(current, (t+1)*(t+2)//2))
# χ
for y in range(5):
T = [lanes[x][y] for x in range(5)]
for x in range(5):
lanes[x][y] = T[x] ^((~T[(x+1)%5]) & T[(x+2)%5])
# ι
for j in range(7):
R = ((R << 1) ^ ((R >> 7)*0x71)) % 256
if (R & 2):
lanes[0][0] = lanes[0][0] ^ (1 << ((1<<j)-1))
return lanes
def load64(b):
return sum((b[i] << (8*i)) for i in range(8))
def store64(a):
return list((a >> (8*i)) % 256 for i in range(8))
def KeccakF1600(state):
lanes = [[load64(state[8*(x+5*y):8*(x+5*y)+8]) for y in range(5)] for x in range(5)]
lanes = KeccakF1600onLanes(lanes)
state = bytearray(200)
for x in range(5):
for y in range(5):
state[8*(x+5*y):8*(x+5*y)+8] = store64(lanes[x][y])
return state
def Keccak(rate, capacity, inputBytes, delimitedSuffix, outputByteLen):
outputBytes = bytearray()
state = bytearray([0 for i in range(200)])
rateInBytes = rate//8
blockSize = 0
if (((rate + capacity) != 1600) or ((rate % 8) != 0)):
return
inputOffset = 0
# === Absorb all the input blocks ===
while(inputOffset < len(inputBytes)):
blockSize = min(len(inputBytes)-inputOffset, rateInBytes)
for i in range(blockSize):
state[i] = state[i] ^ inputBytes[i+inputOffset]
inputOffset = inputOffset + blockSize
if (blockSize == rateInBytes):
state = KeccakF1600(state)
blockSize = 0
# === Do the padding and switch to the squeezing phase ===
state[blockSize] = state[blockSize] ^ delimitedSuffix
if (((delimitedSuffix & 0x80) != 0) and (blockSize == (rateInBytes-1))):
state = KeccakF1600(state)
state[rateInBytes-1] = state[rateInBytes-1] ^ 0x80
state = KeccakF1600(state)
# === Squeeze out all the output blocks ===
while(outputByteLen > 0):
blockSize = min(outputByteLen, rateInBytes)
outputBytes = outputBytes + state[0:blockSize]
outputByteLen = outputByteLen - blockSize
if (outputByteLen > 0):
state = KeccakF1600(state)
return outputBytes
def SHAKE128(inputBytes, outputByteLen):
return Keccak(1344, 256, inputBytes, 0x1F, outputByteLen)
def SHAKE256(inputBytes, outputByteLen):
return Keccak(1088, 512, inputBytes, 0x1F, outputByteLen)
def SHA3_224(inputBytes):
return Keccak(1152, 448, inputBytes, 0x06, 224//8)
def SHA3_256(inputBytes):
return Keccak(1088, 512, inputBytes, 0x06, 256//8)
def SHA3_384(inputBytes):
return Keccak(832, 768, inputBytes, 0x06, 384//8)
def SHA3_512(inputBytes):
return Keccak(576, 1024, inputBytes, 0x06, 512//8)

38
frontend/jsSHA/test/test.html Executable file
View file

@ -0,0 +1,38 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<title>jsSHA (http://caligatio.github.com/jsSHA/) Tests</title>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/mocha/2.5.3/mocha.min.css" />
<style type="text/css">
body {
margin: 5px
}
</style>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/mocha/2.5.3/mocha.min.js"></script>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/chai/3.5.0/chai.min.js"></script>
<script type="text/javascript" src="../src/sha_dev.js"></script>
<script type="text/javascript">mocha.setup('bdd')</script>
<script type="text/javascript" src="test_hashes.js"></script>
<script type="text/javascript" src="test_multi.js"></script>
<script type="text/javascript" src="test_hmac.js"></script>
</head>
<body onload="mocha.run()">
<h1><a href="http://caligatio.github.com/jsSHA/">jsSHA</a> Hash Test Page</h1>
<h2>Hash Tests</h2>
<p>
These tests implement the test vectors found on the <a href="http://csrc.nist.gov/groups/ST/toolkit/examples.html">NIST Examples</a> page.
</p>
<p>
Note that the "Long" test involves hashing a 1,000,000 character string and can take quite a while depending on the browser and machine.
</p>
<h2>Custom Tests</h2>
<p>
Values for SHAKE tests can be generated using the included genShake.py. Similarly, values for the multiple round tests can be generated using the included getHashRounds.py.
</p>
<div id="mocha"></div>
</body>
</html>

1213
frontend/jsSHA/test/test_hashes.js Executable file

File diff suppressed because it is too large Load diff

533
frontend/jsSHA/test/test_hmac.js Executable file
View file

@ -0,0 +1,533 @@
/* Kind of hack to get the tests working both in the browser and node.js */
if (("undefined" !== typeof module) && module["exports"])
{
mocha = require("mocha");
chai = require("chai");
jsSHA = require("../src/sha_dev.js");
}
String.prototype.repeat = function(times) {
return (new Array(times + 1)).join(this);
}
/* These are used often so make a global copy that everything can reference */
var millionaAscii = "a".repeat(1000000), millionaHex = "61".repeat(1000000), millionaB64 = "YWFh".repeat(333333) + "YQ==";
/* ============================================================================
* Begin HMAC Tests
* ============================================================================
*/
var hmacTests = [
{
"hash": "SHA-1",
"tests": [
{
"name": "Short",
"ptInputs": [
{"type": "TEXT", "value": "Sample message for keylen<blocklen"},
{"type": "HEX", "value": "53616D706C65206D65737361676520666F72206B65796C656E3C626C6F636B6C656E"},
{"type": "B64", "value": "U2FtcGxlIG1lc3NhZ2UgZm9yIGtleWxlbjxibG9ja2xlbg=="}
],
"keyInputs": [
{"type": "HEX", "value": "000102030405060708090A0B0C0D0E0F10111213"},
{"type": "B64", "value": "AAECAwQFBgcICQoLDA0ODxAREhM="}
],
"outputs": [
{"type": "HEX", "value": "4c99ff0cb1b31bd33f8431dbaf4d17fcd356a807"},
{"type": "B64", "value": "TJn/DLGzG9M/hDHbr00X/NNWqAc="}
]
},
{
"name": "Medium",
"ptInputs": [
{"type": "TEXT", "value": "Sample message for keylen=blocklen"},
{"type": "HEX", "value": "53616D706C65206D65737361676520666F72206B65796C656E3D626C6F636B6C656E"},
{"type": "B64", "value": "U2FtcGxlIG1lc3NhZ2UgZm9yIGtleWxlbj1ibG9ja2xlbg=="}
],
"keyInputs": [
{"type": "HEX", "value": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F"},
{"type": "B64", "value": "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+Pw=="}
],
"outputs": [
{ "type": "HEX", "value": "5fd596ee78d5553c8ff4e72d266dfd192366da29"},
{"type": "B64", "value": "X9WW7njVVTyP9OctJm39GSNm2ik="}
]
},
{
"name": "Long",
"ptInputs": [
{"type": "TEXT", "value": "Sample message for keylen=blocklen"},
{"type": "HEX", "value": "53616D706C65206D65737361676520666F72206B65796C656E3D626C6F636B6C656E"},
{"type": "B64", "value": "U2FtcGxlIG1lc3NhZ2UgZm9yIGtleWxlbj1ibG9ja2xlbg=="}
],
"keyInputs": [
{"type": "HEX", "value": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F60616263"},
{"type": "B64", "value": "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYGFiYw=="}
],
"outputs": [
{"type": "HEX", "value": "2d51b2f7750e410584662e38f133435f4c4fd42a"},
{"type": "B64", "value": "LVGy93UOQQWEZi448TNDX0xP1Co="}
]
}
]
},
{
"hash": "SHA-224",
"tests": [
{
"name": "Short",
"ptInputs": [
{"type": "TEXT", "value": "Sample message for keylen<blocklen"},
{"type": "HEX", "value": "53616D706C65206D65737361676520666F72206B65796C656E3C626C6F636B6C656E"},
{"type": "B64", "value": "U2FtcGxlIG1lc3NhZ2UgZm9yIGtleWxlbjxibG9ja2xlbg=="}
],
"keyInputs": [
{"type": "HEX", "value": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B"},
{"type": "B64", "value": "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGw=="}
],
"outputs": [
{"type": "HEX", "value": "e3d249a8cfb67ef8b7a169e9a0a599714a2cecba65999a51beb8fbbe"},
{"type": "B64", "value": "49JJqM+2fvi3oWnpoKWZcUos7LplmZpRvrj7vg=="}
]
},
{
"name": "Medium",
"ptInputs": [
{"type": "TEXT", "value": "Sample message for keylen=blocklen"},
{"type": "HEX", "value": "53616D706C65206D65737361676520666F72206B65796C656E3D626C6F636B6C656E"},
{"type": "B64", "value": "U2FtcGxlIG1lc3NhZ2UgZm9yIGtleWxlbj1ibG9ja2xlbg=="}
],
"keyInputs": [
{"type": "HEX", "value": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F"},
{"type": "B64", "value": "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+Pw=="}
],
"outputs": [
{"type": "HEX", "value": "c7405e3ae058e8cd30b08b4140248581ed174cb34e1224bcc1efc81b"},
{"type": "B64", "value": "x0BeOuBY6M0wsItBQCSFge0XTLNOEiS8we/IGw=="}
]
},
{
"name": "Long",
"ptInputs": [
{"type": "TEXT", "value": "Sample message for keylen=blocklen"},
{"type": "HEX", "value": "53616D706C65206D65737361676520666F72206B65796C656E3D626C6F636B6C656E"},
{"type": "B64", "value": "U2FtcGxlIG1lc3NhZ2UgZm9yIGtleWxlbj1ibG9ja2xlbg=="}
],
"keyInputs": [
{"type": "HEX", "value": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F60616263"},
{"type": "B64", "value": "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYGFiYw=="}
],
"outputs": [
{"type": "HEX", "value": "91c52509e5af8531601ae6230099d90bef88aaefb961f4080abc014d"},
{"type": "B64", "value": "kcUlCeWvhTFgGuYjAJnZC++Iqu+5YfQICrwBTQ=="}
],
}
]
},
{
"hash": "SHA3-224",
"tests": [
{
"name": "Short",
"ptInputs": [
{"type": "TEXT", "value": "Sample message for keylen<blocklen"},
{"type": "HEX", "value": "53616D706C65206D65737361676520666F72206B65796C656E3C626C6F636B6C656E"},
{"type": "B64", "value": "U2FtcGxlIG1lc3NhZ2UgZm9yIGtleWxlbjxibG9ja2xlbg=="}
],
"keyInputs": [
{"type": "HEX", "value": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B"},
{"type": "B64", "value": "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGw=="}
],
"outputs": [
{"type": "HEX", "value": "332cfd59347fdb8e576e77260be4aba2d6dc53117b3bfb52c6d18c04"},
{"type": "B64", "value": "Myz9WTR/245XbncmC+SrotbcUxF7O/tSxtGMBA=="}
]
},
{
"name": "Medium",
"ptInputs": [
{"type": "TEXT", "value": "Sample message for keylen=blocklen"},
{"type": "HEX", "value": "53616D706C65206D65737361676520666F72206B65796C656E3D626C6F636B6C656E"},
{"type": "B64", "value": "U2FtcGxlIG1lc3NhZ2UgZm9yIGtleWxlbj1ibG9ja2xlbg=="}
],
"keyInputs": [
{"type": "HEX", "value": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f"},
{"type": "B64", "value": "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fn+AgYKDhIWGh4iJiouMjY6P"}
],
"outputs": [
{"type": "HEX", "value": "d8b733bcf66c644a12323d564e24dcf3fc75f231f3b67968359100c7"},
{"type": "B64", "value": "2LczvPZsZEoSMj1WTiTc8/x18jHztnloNZEAxw=="}
]
},
{
"name": "Long",
"ptInputs": [
{"type": "TEXT", "value": "Sample message for keylen>blocklen"},
{"type": "HEX", "value": "53616d706c65206d65737361676520666f72206b65796c656e3e626c6f636b6c656e"},
{"type": "B64", "value": "U2FtcGxlIG1lc3NhZ2UgZm9yIGtleWxlbj5ibG9ja2xlbg=="}
],
"keyInputs": [
{"type": "HEX", "value": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaab"},
{"type": "B64", "value": "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fn+AgYKDhIWGh4iJiouMjY6PkJGSk5SVlpeYmZqbnJ2en6ChoqOkpaanqKmqqw=="}
],
"outputs": [
{"type": "HEX", "value": "078695eecc227c636ad31d063a15dd05a7e819a66ec6d8de1e193e59"},
{"type": "B64", "value": "B4aV7swifGNq0x0GOhXdBafoGaZuxtjeHhk+WQ=="}
],
}
]
},
{
"hash": "SHA-256",
"tests": [
{
"name": "Short",
"ptInputs": [
{"type": "TEXT", "value": "Sample message for keylen<blocklen"},
{"type": "HEX", "value": "53616D706C65206D65737361676520666F72206B65796C656E3C626C6F636B6C656E"},
{"type": "B64", "value": "U2FtcGxlIG1lc3NhZ2UgZm9yIGtleWxlbjxibG9ja2xlbg=="}
],
"keyInputs": [
{"type": "HEX", "value": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F"},
{"type": "B64", "value": "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8="}
],
"outputs": [
{"type": "HEX", "value": "a28cf43130ee696a98f14a37678b56bcfcbdd9e5cf69717fecf5480f0ebdf790"},
{"type": "B64", "value": "ooz0MTDuaWqY8Uo3Z4tWvPy92eXPaXF/7PVIDw6995A="}
],
},
{
"name": "Medium",
"ptInputs": [
{"type": "TEXT", "value": "Sample message for keylen=blocklen"},
{"type": "HEX", "value": "53616D706C65206D65737361676520666F72206B65796C656E3D626C6F636B6C656E"},
{"type": "B64", "value": "U2FtcGxlIG1lc3NhZ2UgZm9yIGtleWxlbj1ibG9ja2xlbg=="}
],
"keyInputs": [
{"type": "HEX", "value": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F"},
{"type": "B64", "value": "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+Pw=="}
],
"outputs": [
{"type": "HEX", "value": "8bb9a1db9806f20df7f77b82138c7914d174d59e13dc4d0169c9057b133e1d62"},
{"type": "B64", "value": "i7mh25gG8g3393uCE4x5FNF01Z4T3E0BackFexM+HWI="}
],
},
{
"name": "Long",
"ptInputs": [
{"type": "TEXT", "value": "Sample message for keylen=blocklen"},
{"type": "HEX", "value": "53616D706C65206D65737361676520666F72206B65796C656E3D626C6F636B6C656E"},
{"type": "B64", "value": "U2FtcGxlIG1lc3NhZ2UgZm9yIGtleWxlbj1ibG9ja2xlbg=="}
],
"keyInputs": [
{"type": "HEX", "value": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F60616263"},
{"type": "B64", "value": "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYGFiYw=="}
],
"outputs": [
{"type": "HEX", "value": "bdccb6c72ddeadb500ae768386cb38cc41c63dbb0878ddb9c7a38a431b78378d"},
{"type": "B64", "value": "vcy2xy3erbUArnaDhss4zEHGPbsIeN25x6OKQxt4N40="}
]
}
]
},
{
"hash": "SHA3-256",
"tests": [
{
"name": "Short",
"ptInputs": [
{"type": "TEXT", "value": "Sample message for keylen<blocklen"},
{"type": "HEX", "value": "53616D706C65206D65737361676520666F72206B65796C656E3C626C6F636B6C656E"},
{"type": "B64", "value": "U2FtcGxlIG1lc3NhZ2UgZm9yIGtleWxlbjxibG9ja2xlbg=="}
],
"keyInputs": [
{"type": "HEX", "value": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F"},
{"type": "B64", "value": "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8="}
],
"outputs": [
{"type": "HEX", "value": "4fe8e202c4f058e8dddc23d8c34e467343e23555e24fc2f025d598f558f67205"},
{"type": "B64", "value": "T+jiAsTwWOjd3CPYw05Gc0PiNVXiT8LwJdWY9Vj2cgU="}
],
},
{
"name": "Medium",
"ptInputs": [
{"type": "TEXT", "value": "Sample message for keylen=blocklen"},
{"type": "HEX", "value": "53616D706C65206D65737361676520666F72206B65796C656E3D626C6F636B6C656E"},
{"type": "B64", "value": "U2FtcGxlIG1lc3NhZ2UgZm9yIGtleWxlbj1ibG9ja2xlbg=="}
],
"keyInputs": [
{"type": "HEX", "value": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f8081828384858687"},
{"type": "B64", "value": "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fn+AgYKDhIWGhw=="}
],
"outputs": [
{"type": "HEX", "value": "68b94e2e538a9be4103bebb5aa016d47961d4d1aa906061313b557f8af2c3faa"},
{"type": "B64", "value": "aLlOLlOKm+QQO+u1qgFtR5YdTRqpBgYTE7VX+K8sP6o="}
],
},
{
"name": "Long",
"ptInputs": [
{"type": "TEXT", "value": "Sample message for keylen>blocklen"},
{"type": "HEX", "value": "53616d706c65206d65737361676520666f72206b65796c656e3e626c6f636b6c656e"},
{"type": "B64", "value": "U2FtcGxlIG1lc3NhZ2UgZm9yIGtleWxlbj5ibG9ja2xlbg=="}
],
"keyInputs": [
{"type": "HEX", "value": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7"},
{"type": "B64", "value": "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fn+AgYKDhIWGh4iJiouMjY6PkJGSk5SVlpeYmZqbnJ2en6ChoqOkpaan"}
],
"outputs": [
{"type": "HEX", "value": "9bcf2c238e235c3ce88404e813bd2f3a97185ac6f238c63d6229a00b07974258"},
{"type": "B64", "value": "m88sI44jXDzohAToE70vOpcYWsbyOMY9YimgCweXQlg="}
]
}
]
},
{
"hash": "SHA-384",
"tests": [
{
"name": "Short",
"ptInputs": [
{"type": "TEXT", "value": "Sample message for keylen<blocklen"},
{"type": "HEX", "value": "53616D706C65206D65737361676520666F72206B65796C656E3C626C6F636B6C656E"},
{"type": "B64", "value": "U2FtcGxlIG1lc3NhZ2UgZm9yIGtleWxlbjxibG9ja2xlbg=="}
],
"keyInputs": [
{"type": "HEX", "value": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F"},
{"type": "B64", "value": "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4v"}
],
"outputs": [
{"type": "HEX", "value": "6eb242bdbb582ca17bebfa481b1e23211464d2b7f8c20b9ff2201637b93646af5ae9ac316e98db45d9cae773675eeed0"},
{"type": "B64", "value": "brJCvbtYLKF76/pIGx4jIRRk0rf4wguf8iAWN7k2Rq9a6awxbpjbRdnK53NnXu7Q"}
]
},
{
"name": "Medium",
"ptInputs": [
{"type": "TEXT", "value": "Sample message for keylen=blocklen"},
{"type": "HEX", "value": "53616D706C65206D65737361676520666F72206B65796C656E3D626C6F636B6C656E"},
{"type": "B64", "value": "U2FtcGxlIG1lc3NhZ2UgZm9yIGtleWxlbj1ibG9ja2xlbg=="}
],
"keyInputs": [
{"type": "HEX", "value": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F"},
{"type": "B64", "value": "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fn8="}
],
"outputs": [
{"type": "HEX", "value": "63c5daa5e651847ca897c95814ab830bededc7d25e83eef9195cd45857a37f448947858f5af50cc2b1b730ddf29671a9"},
{"type": "B64", "value": "Y8XapeZRhHyol8lYFKuDC+3tx9Jeg+75GVzUWFejf0SJR4WPWvUMwrG3MN3ylnGp"}
]
},
{
"name": "Long",
"ptInputs": [
{"type": "TEXT", "value": "Sample message for keylen=blocklen"},
{"type": "HEX", "value": "53616D706C65206D65737361676520666F72206B65796C656E3D626C6F636B6C656E"},
{"type": "B64", "value": "U2FtcGxlIG1lc3NhZ2UgZm9yIGtleWxlbj1ibG9ja2xlbg=="}
],
"keyInputs": [
{"type": "HEX", "value": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7"},
{"type": "B64", "value": "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fn+AgYKDhIWGh4iJiouMjY6PkJGSk5SVlpeYmZqbnJ2en6ChoqOkpaanqKmqq6ytrq+wsbKztLW2t7i5uru8vb6/wMHCw8TFxsc="}
],
"outputs": [
{"type": "HEX", "value": "5b664436df69b0ca22551231a3f0a3d5b4f97991713cfa84bff4d0792eff96c27dccbbb6f79b65d548b40e8564cef594"},
{"type": "B64", "value": "W2ZENt9psMoiVRIxo/Cj1bT5eZFxPPqEv/TQeS7/lsJ9zLu295tl1Ui0DoVkzvWU"}
]
}
]
},
{
"hash": "SHA3-384",
"tests": [
{
"name": "Short",
"ptInputs": [
{"type": "TEXT", "value": "Sample message for keylen<blocklen"},
{"type": "HEX", "value": "53616D706C65206D65737361676520666F72206B65796C656E3C626C6F636B6C656E"},
{"type": "B64", "value": "U2FtcGxlIG1lc3NhZ2UgZm9yIGtleWxlbjxibG9ja2xlbg=="}
],
"keyInputs": [
{"type": "HEX", "value": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F"},
{"type": "B64", "value": "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4v"}
],
"outputs": [
{"type": "HEX", "value": "d588a3c51f3f2d906e8298c1199aa8ff6296218127f6b38a90b6afe2c5617725bc99987f79b22a557b6520db710b7f42"},
{"type": "B64", "value": "1YijxR8/LZBugpjBGZqo/2KWIYEn9rOKkLav4sVhdyW8mZh/ebIqVXtlINtxC39C"}
]
},
{
"name": "Medium",
"ptInputs": [
{"type": "TEXT", "value": "Sample message for keylen=blocklen"},
{"type": "HEX", "value": "53616D706C65206D65737361676520666F72206B65796C656E3D626C6F636B6C656E"},
{"type": "B64", "value": "U2FtcGxlIG1lc3NhZ2UgZm9yIGtleWxlbj1ibG9ja2xlbg=="}
],
"keyInputs": [
{"type": "HEX", "value": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F6061626364656667"},
{"type": "B64", "value": "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYGFiY2RlZmc="}
],
"outputs": [
{"type": "HEX", "value": "a27d24b592e8c8cbf6d4ce6fc5bf62d8fc98bf2d486640d9eb8099e24047837f5f3bffbe92dcce90b4ed5b1e7e44fa90"},
{"type": "B64", "value": "on0ktZLoyMv21M5vxb9i2PyYvy1IZkDZ64CZ4kBHg39fO/++ktzOkLTtWx5+RPqQ"}
]
},
{
"name": "Long",
"ptInputs": [
{"type": "TEXT", "value": "Sample message for keylen>blocklen"},
{"type": "HEX", "value": "53616d706c65206d65737361676520666f72206b65796c656e3e626c6f636b6c656e"},
{"type": "B64", "value": "U2FtcGxlIG1lc3NhZ2UgZm9yIGtleWxlbj5ibG9ja2xlbg=="}
],
"keyInputs": [
{"type": "HEX", "value": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F9091929394959697"},
{"type": "B64", "value": "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fn+AgYKDhIWGh4iJiouMjY6PkJGSk5SVlpc="}
],
"outputs": [
{"type": "HEX", "value": "e5ae4c739f455279368ebf36d4f5354c95aa184c899d3870e460ebc288ef1f9470053f73f7c6da2a71bcaec38ce7d6ac"},
{"type": "B64", "value": "5a5Mc59FUnk2jr821PU1TJWqGEyJnThw5GDrwojvH5RwBT9z98baKnG8rsOM59as"}
]
}
]
},
{
"hash": "SHA-512",
"tests": [
{
"name": "Short",
"ptInputs": [
{"type": "TEXT", "value": "Sample message for keylen<blocklen"},
{"type": "HEX", "value": "53616D706C65206D65737361676520666F72206B65796C656E3C626C6F636B6C656E"},
{"type": "B64", "value": "U2FtcGxlIG1lc3NhZ2UgZm9yIGtleWxlbjxibG9ja2xlbg=="}
],
"keyInputs": [
{"type": "HEX", "value": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F"},
{"type": "B64", "value": "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+Pw=="}
],
"outputs": [
{"type": "HEX", "value": "fd44c18bda0bb0a6ce0e82b031bf2818f6539bd56ec00bdc10a8a2d730b3634de2545d639b0f2cf710d0692c72a1896f1f211c2b922d1a96c392e07e7ea9fedc"},
{"type": "B64", "value": "/UTBi9oLsKbODoKwMb8oGPZTm9VuwAvcEKii1zCzY03iVF1jmw8s9xDQaSxyoYlvHyEcK5ItGpbDkuB+fqn+3A=="}
]
},
{
"name": "Medium",
"ptInputs": [
{"type": "TEXT", "value": "Sample message for keylen=blocklen"},
{"type": "HEX", "value": "53616D706C65206D65737361676520666F72206B65796C656E3D626C6F636B6C656E"},
{"type": "B64", "value": "U2FtcGxlIG1lc3NhZ2UgZm9yIGtleWxlbj1ibG9ja2xlbg=="}
],
"keyInputs": [
{"type": "HEX", "value": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F"},
{"type": "B64", "value": "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fn8="}
],
"outputs": [
{"type": "HEX", "value": "fc25e240658ca785b7a811a8d3f7b4ca48cfa26a8a366bf2cd1f836b05fcb024bd36853081811d6cea4216ebad79da1cfcb95ea4586b8a0ce356596a55fb1347"},
{"type": "B64", "value": "/CXiQGWMp4W3qBGo0/e0ykjPomqKNmvyzR+DawX8sCS9NoUwgYEdbOpCFuutedoc/LlepFhrigzjVllqVfsTRw=="}
],
},
{
"name": "Long",
"ptInputs": [
{"type": "TEXT", "value": "Sample message for keylen=blocklen"},
{"type": "HEX", "value": "53616D706C65206D65737361676520666F72206B65796C656E3D626C6F636B6C656E"},
{"type": "B64", "value": "U2FtcGxlIG1lc3NhZ2UgZm9yIGtleWxlbj1ibG9ja2xlbg=="}
],
"keyInputs": [
{"type": "HEX", "value": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7"},
{"type": "B64", "value": "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fn+AgYKDhIWGh4iJiouMjY6PkJGSk5SVlpeYmZqbnJ2en6ChoqOkpaanqKmqq6ytrq+wsbKztLW2t7i5uru8vb6/wMHCw8TFxsc="}
],
"outputs": [
{"type": "HEX", "value": "d93ec8d2de1ad2a9957cb9b83f14e76ad6b5e0cce285079a127d3b14bccb7aa7286d4ac0d4ce64215f2bc9e6870b33d97438be4aaa20cda5c5a912b48b8e27f3"},
{"type": "B64", "value": "2T7I0t4a0qmVfLm4PxTnata14MzihQeaEn07FLzLeqcobUrA1M5kIV8ryeaHCzPZdDi+SqogzaXFqRK0i44n8w=="}
]
}
]
},
{
"hash": "SHA3-512",
"tests": [
{
"name": "Short",
"ptInputs": [
{"type": "TEXT", "value": "Sample message for keylen<blocklen"},
{"type": "HEX", "value": "53616D706C65206D65737361676520666F72206B65796C656E3C626C6F636B6C656E"},
{"type": "B64", "value": "U2FtcGxlIG1lc3NhZ2UgZm9yIGtleWxlbjxibG9ja2xlbg=="}
],
"keyInputs": [
{"type": "HEX", "value": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F"},
{"type": "B64", "value": "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+Pw=="}
],
"outputs": [
{"type": "HEX", "value": "4efd629d6c71bf86162658f29943b1c308ce27cdfa6db0d9c3ce81763f9cbce5f7ebe9868031db1a8f8eb7b6b95e5c5e3f657a8996c86a2f6527e307f0213196"},
{"type": "B64", "value": "Tv1inWxxv4YWJljymUOxwwjOJ836bbDZw86Bdj+cvOX36+mGgDHbGo+Ot7a5XlxeP2V6iZbIai9lJ+MH8CExlg=="}
]
},
{
"name": "Medium",
"ptInputs": [
{"type": "TEXT", "value": "Sample message for keylen=blocklen"},
{"type": "HEX", "value": "53616D706C65206D65737361676520666F72206B65796C656E3D626C6F636B6C656E"},
{"type": "B64", "value": "U2FtcGxlIG1lc3NhZ2UgZm9yIGtleWxlbj1ibG9ja2xlbg=="}
],
"keyInputs": [
{"type": "HEX", "value": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F4041424344454647"},
{"type": "B64", "value": "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZH"}
],
"outputs": [
{"type": "HEX", "value": "544e257ea2a3e5ea19a590e6a24b724ce6327757723fe2751b75bf007d80f6b360744bf1b7a88ea585f9765b47911976d3191cf83c039f5ffab0d29cc9d9b6da"},
{"type": "B64", "value": "VE4lfqKj5eoZpZDmoktyTOYyd1dyP+J1G3W/AH2A9rNgdEvxt6iOpYX5dltHkRl20xkc+DwDn1/6sNKcydm22g=="}
],
},
{
"name": "Long",
"ptInputs": [
{"type": "TEXT", "value": "Sample message for keylen>blocklen"},
{"type": "HEX", "value": "53616d706c65206d65737361676520666f72206b65796c656e3e626c6f636b6c656e"},
{"type": "B64", "value": "U2FtcGxlIG1lc3NhZ2UgZm9yIGtleWxlbj5ibG9ja2xlbg=="}
],
"keyInputs": [
{"type": "HEX", "value": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F8081828384858687"},
{"type": "B64", "value": "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fn+AgYKDhIWGhw=="}
],
"outputs": [
{"type": "HEX", "value": "5f464f5e5b7848e3885e49b2c385f0694985d0e38966242dc4a5fe3fea4b37d46b65ceced5dcf59438dd840bab22269f0ba7febdb9fcf74602a35666b2a32915"},
{"type": "B64", "value": "X0ZPXlt4SOOIXkmyw4XwaUmF0OOJZiQtxKX+P+pLN9RrZc7O1dz1lDjdhAurIiafC6f+vbn890YCo1ZmsqMpFQ=="}
]
}
]
}
]
hmacTests.forEach(function(testSuite) {
describe("HMAC " + testSuite["hash"] + " Tests", function() {
try
{
testSuite["tests"].forEach(function(test) {
test["ptInputs"].forEach(function(ptInput) {
test["keyInputs"].forEach(function(keyInput) {
var hash = new jsSHA(testSuite["hash"], ptInput["type"]);
hash.setHMACKey(keyInput["value"], keyInput["type"])
hash.update(ptInput["value"]);
test["outputs"].forEach(function(output) {
it(ptInput["type"] + " Input - " + test["name"] + " " + keyInput["type"] + " Key - " + output["type"] + " Output", function() {
chai.assert.equal(hash.getHMAC(output["type"]), output["value"]);
});
});
});
});
});
}
catch(e)
{
if (e.message != "Chosen SHA variant is not supported")
{
throw new Error("Testing of HMAC " + testSuite["hash"] + " failed");
}
}
});
});
/* ============================================================================
* End HMAC Tests
* ============================================================================
*/

220
frontend/jsSHA/test/test_multi.js Executable file
View file

@ -0,0 +1,220 @@
/* Kind of hack to get the tests working both in the browser and node.js */
if (("undefined" !== typeof module) && module["exports"])
{
mocha = require("mocha");
chai = require("chai");
jsSHA = require("../src/sha_dev.js");
}
String.prototype.repeat = function(times) {
return (new Array(times + 1)).join(this);
}
/* These are used often so make a global copy that everything can reference */
var millionaAscii = "a".repeat(1000000), millionaHex = "61".repeat(1000000), millionaB64 = "YWFh".repeat(333333) + "YQ==";
/* ============================================================================
* Begin Multi-Round Hash Tests
* ============================================================================
*/
var multiRoundTests = [
{
"hash": "SHA-1",
"tests": [
{
"name": "Short",
"ptInputs": [
{"type": "TEXT", "value": "abc"}
],
"outputs": [
{"type": "HEX", "rounds": 5, "value": "b5c64925eb9940259be55c005c9cecc7d9897ef9"},
{"type": "HEX", "rounds": 10, "value": "94ebc0d3c81b61eb98670666f5fde68560c4e165"}
]
}
]
},
{
"hash": "SHA-224",
"tests": [
{
"name": "Short",
"ptInputs": [
{"type": "TEXT", "value": "abc"}
],
"outputs": [
{"type": "HEX", "rounds": 5, "value": "5b4b17f720d52c6a864229e784fb636184ca48ce7dd848fdad986239"},
{"type": "HEX", "rounds": 10, "value": "5230eb37afcc115f4f380a9f50c4743d457bbe586e6faa6bf21696f9"}
]
}
]
},
{
"hash": "SHA3-224",
"tests": [
{
"name": "Short",
"ptInputs": [
{"type": "TEXT", "value": "abc"}
],
"outputs": [
{"type": "HEX", "rounds": 5, "value": "7d208060760d239d9e9b041b5c30ac992b83ff1df658263953c9eff0"},
{"type": "HEX", "rounds": 10, "value": "a1b668748fd69b8b6a6453d3bada2b9eb9a06a29b78fbcff5ab530ae"}
]
}
]
},
{
"hash": "SHA-256",
"tests": [
{
"name": "Short",
"ptInputs": [
{"type": "TEXT", "value": "abc"}
],
"outputs": [
{"type": "HEX", "rounds": 5, "value": "184f6d6e82554c051b33f15e7ffffecb0cc0f461a29096c41c214e168e34c21d"},
{"type": "HEX", "rounds": 10, "value": "10e286f907c0fe9f02cea3864cbaec04ae47e2c0a13b60473bc9968a4851b219"}
]
}
]
},
{
"hash": "SHA3-256",
"tests": [
{
"name": "Short",
"ptInputs": [
{"type": "TEXT", "value": "abc"}
],
"outputs": [
{"type": "HEX", "rounds": 5, "value": "fd5ad48a1abf3fd8211ecd2a6a0b0503e745d953def260541fa5db7dc1b3b84f"},
{"type": "HEX", "rounds": 10, "value": "5b814fc96d03918994939bccb796945d9683fa90a22f99350d6a964de78a7980"}
]
}
]
},
{
"hash": "SHA-384",
"tests": [
{
"name": "Short",
"ptInputs": [
{"type": "TEXT", "value": "abc"}
],
"outputs": [
{"type": "HEX", "rounds": 5, "value": "a4aa4cd8534aecb2d07765f928303d1d2609835ea85d14312bcee264e99dc5d7dc08bb18ec694053fd7fe6906706d55f"},
{"type": "HEX", "rounds": 10, "value": "b80c82979453f2f3dcf89ec4cef5c71e89837537de170e3942af8b37757cc790d4cc4ebe16a52164ad19f3a02d192f1c"}
]
}
]
},
{
"hash": "SHA3-384",
"tests": [
{
"name": "Short",
"ptInputs": [
{"type": "TEXT", "value": "abc"}
],
"outputs": [
{"type": "HEX", "rounds": 5, "value": "be2f2365cecd5df751f3ab7d23cabfb60491ce28bdf80b121f7941ee33227ce86d5d62d6633f5654a4f3ae5381cf1825"},
{"type": "HEX", "rounds": 10, "value": "4cb125e919d39ab283964e06ce58dd8923fa599046b533958c9353317ab368066b9902c2e1a9c9376d66f321fcc2c0a1"}
]
}
]
},
{
"hash": "SHA-512",
"tests": [
{
"name": "Short",
"ptInputs": [
{"type": "TEXT", "value": "abc"}
],
"outputs": [
{"type": "HEX", "rounds": 5, "value": "299b2e3ce932e4d0e9005345e37af5a4cc6be21e6b6e21231ce71ccde2a7aba4a6822cd7a9aaf9b13918db05ede70d3f1e6af65f8ad0bda1c4c4fa263e3cabdd"},
{"type": "HEX", "rounds": 10, "value": "4c3ead8c83442fff47d4386702044f2a6c19730a806de541964b0fa9987cac08641611e02b2e0742ef2600ff82bfe3a711567c8e76dda16b4948f4c76e3c6e9c"}
]
}
]
},
{
"hash": "SHA3-512",
"tests": [
{
"name": "Short",
"ptInputs": [
{"type": "TEXT", "value": "abc"}
],
"outputs": [
{"type": "HEX", "rounds": 5, "value": "8c74189ca608ad188bb96c8c374fb717ce982500dc2c0ce90ad8e5888b498ce9fda0e4bf256feeaaf1674b69e9ea80cf5ed444dfdd5d3eb05cfebd597b4aab67"},
{"type": "HEX", "rounds": 10, "value": "0e3c0126a211563fdedc96149f1c2334aa5f5b2afcf5590cb71fec0ab348ba522e56c1136f165f525b22890e2546d2f9edbea6b6f5e929237b6c0f395e1b2e9b"}
]
}
]
},
{
"hash": "SHAKE128",
"tests": [
{
"name": "Short",
"ptInputs": [
{"type": "TEXT", "value": "abc"}
],
"outputs": [
{"type": "HEX", "rounds": 5, "value": "99d5aa0763f5bd9464ed4bbc631ecdac6f67e77cbf61c7f7171dd2ffa892ba", "shakeLen": 248},
{"type": "HEX", "rounds": 10, "value": "5a5aeb2022e0e92ef4da3dc3e261a9303224b65cf6666f87a4d395a4ab94fe", "shakeLen": 248}
]
}
]
},
{
"hash": "SHAKE256",
"tests": [
{
"name": "Short",
"ptInputs": [
{"type": "TEXT", "value": "abc"}
],
"outputs": [
{"type": "HEX", "rounds": 5, "value": "70368c73548e76dd6405ea6c1b4358eb0aeb4c0efe73526c7c6e1d9a9e4e0a", "shakeLen": 248},
{"type": "HEX", "rounds": 10, "value": "d706c35b6642f39a27635c61c85ab13e76827de8fde4557e25bfc96b445f10", "shakeLen": 248}
]
}
]
}
]
multiRoundTests.forEach(function(testSuite) {
describe("Multiround " + testSuite["hash"] + " Tests", function() {
try
{
testSuite["tests"].forEach(function(test) {
test["ptInputs"].forEach(function(ptInput) {
test["outputs"].forEach(function(output) {
var options = {}, hash = new jsSHA(testSuite["hash"], ptInput["type"], {"numRounds": output["rounds"]});
hash.update(ptInput["value"]);
it(test["name"] + " " + ptInput["type"] + " Input - " + output["type"] + " Output - " + output["rounds"] + " Rounds ", function() {
if (output.hasOwnProperty("shakeLen"))
{
options["shakeLen"] = output["shakeLen"]
}
chai.assert.equal(hash.getHash(output["type"], options), output["value"]);
});
});
});
});
}
catch(e)
{
if (e.message != "Chosen SHA variant is not supported")
{
throw new Error("Testing of multi-round " + testSuite["hash"] + " failed");
}
}
});
});
/* ============================================================================
* End Multi-Round Hash Tests
* ============================================================================
*/

BIN
frontend/thumbnail.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

View file

@ -15,11 +15,7 @@ const { sendInitialStats } = require('./stats.js')
const fs = require('fs')
const ObjectId = require('mongodb').ObjectId // just to check ObjectIDs
const static_files_path = path.join(__dirname,
isDevEnvironment
? '../volt.link-frontend/build/'
: '../volt.link-frontend/'
)
const static_files_path = path.join(__dirname, './frontend/')
function checkOrigin(origin){
return (