UNPKG

@aladas-org/cryptocalc

Version:
571 lines (459 loc) 22 kB
// ======================================================================================================================= // ==================================== entropy_converter_dialog.js ======================================= // ======================================================================================================================= "use strict"; const ECONVERTER_DIALOG_LABEL_ID = "econverter_dialog_label_id"; const ECONVERTER_ENTROPY_SIZE_VALUE_ID = "entropy_size_value_id"; const ECONVERTER_RAWTEXT_INPUT_ID = "rawtext_input_id"; const ECONVERTER_RAWTEXT_COPY_BTN_ID = "rawtext_copy_btn_id"; const ECONVERTER_HEXADECIMAL_INPUT_ID = "hex_input_id"; const ECONVERTER_HEXADECIMAL_COPY_BTN_ID = "hexadecimal_copy_btn_id"; const ECONVERTER_BASE64_INPUT_ID = "base64_input_id"; const ECONVERTER_BASE64_COPY_BTN_ID = "base64_copy_btn_id"; const ECONVERTER_BASE58_INPUT_ID = "base58_input_id"; const ECONVERTER_BASE58_COPY_BTN_ID = "base58_copy_btn_id"; const ECONVERTER_SECRET_PHRASE_INPUT_ID = "secret_phrase_input_id"; const ECONVERTER_SECRET_PHRASE_COPY_BTN_ID = "secret_phrase_copy_btn_id"; const ECONVERTER_BINARY_INPUT_ID = "binary_input_id"; const ECONVERTER_BINARY_COPY_BTN_ID = "binary_copy_btn_id"; const ECONVERTER_LANG_SELECT_ID = "econverter_lang_select_id"; const ECONVERTER_CLEAR_BTN_ID = "econverter_clear_btn_id"; const ECONVERTER_QUIT_BTN_ID = "econverter_quit_btn_id"; const BIP39_ALLOWED_BYTES_COUNT = [ 16, 20, 24, 28, 32 ]; const BIP39_ALLOWED_WORD_COUNT = [ 12, 15, 18, 21, 24 ]; const BIP39_ALLOWED_BIT_SIZES = [ 128, 160, 192, 224, 256 ]; const INPUT_FIELDS_IDS = [ ECONVERTER_RAWTEXT_INPUT_ID, ECONVERTER_HEXADECIMAL_INPUT_ID, ECONVERTER_BASE64_INPUT_ID, ECONVERTER_BASE58_INPUT_ID, ECONVERTER_SECRET_PHRASE_INPUT_ID, ECONVERTER_BINARY_INPUT_ID ]; class EntropyConverterDialog { static #Key = Symbol(); static #Singleton = new EntropyConverterDialog( this.#Key ); static #InstanceCount = 0; static get This() { if ( EntropyConverterDialog.#Singleton == undefined ) { EntropyConverterDialog.#Singleton = new EntropyConverterDialog( this.#Key ); if ( Bip38EncryptDecryptDialog.#Singleton > 0 ) { throw new TypeError("'EntropyConverterDialog' constructor called more than once"); } EntropyConverterDialog.#InstanceCount++; } return EntropyConverterDialog.#Singleton; } // EntropyConverterDialog 'This' getter // ** Private constructor ** constructor( key ) { // console.log(">> **************** new EntropyConverterDialog"); if ( key !== EntropyConverterDialog.#Key ) { throw new TypeError("'EntropyConverterDialog' constructor is private"); } this.event_handlers_attached = false; this.displayed = false; this.encrypt_mode = true; this.previous_lang = 'EN'; } // ** Private constructor ** initialize() { // console.log(">> EntropyConverterDialog.initialize"); $("#" + ENTROPY_CONVERTER_DIALOG_ID).dialog ( { // -------------------- JQuery Dialog options -------------------- modal: true, resizable: false, autoOpen: false, dialogClass: 'DialogBox', // https://stackoverflow.com/questions/18992081/trigger-event-on-dialog-box-open // https://stackoverflow.com/questions/394491/passing-data-to-a-jquery-ui-dialog/3458299#3458299 width: 670, // 680 open: function( event, ui ) { let this_obj = EntropyConverterDialog.This; if ( ! this_obj.event_handlers_attached ) { this_obj.addEventHandler ( ECONVERTER_RAWTEXT_COPY_BTN_ID, 'click', () => { EntropyConverterDialog.This.onCopyField(ECONVERTER_RAWTEXT_INPUT_ID); } ); this_obj.addEventHandler ( ECONVERTER_HEXADECIMAL_COPY_BTN_ID, 'click', () => { EntropyConverterDialog.This.onCopyField(ECONVERTER_HEXADECIMAL_INPUT_ID); } ); this_obj.addEventHandler ( ECONVERTER_BASE64_COPY_BTN_ID, 'click', () => { EntropyConverterDialog.This.onCopyField(ECONVERTER_BASE64_INPUT_ID); } ); this_obj.addEventHandler ( ECONVERTER_BASE58_COPY_BTN_ID, 'click', () => { EntropyConverterDialog.This.onCopyField(ECONVERTER_BASE58_INPUT_ID); } ); this_obj.addEventHandler ( ECONVERTER_SECRET_PHRASE_COPY_BTN_ID, 'click', () => { EntropyConverterDialog.This.onCopyField(ECONVERTER_SECRET_PHRASE_INPUT_ID); } ); this_obj.addEventHandler ( ECONVERTER_BINARY_COPY_BTN_ID, 'click', () => { EntropyConverterDialog.This.onCopyField(ECONVERTER_BINARY_INPUT_ID); } ); this_obj.addEventHandler ( ECONVERTER_RAWTEXT_INPUT_ID, 'input', async ( evt ) => { await EntropyConverterDialog.This.onChangeInputField( ECONVERTER_RAWTEXT_INPUT_ID ); } ); this_obj.addEventHandler ( ECONVERTER_HEXADECIMAL_INPUT_ID, 'input', async ( evt ) => { await EntropyConverterDialog.This.onChangeInputField( ECONVERTER_HEXADECIMAL_INPUT_ID ); } ); this_obj.addEventHandler ( ECONVERTER_BASE64_INPUT_ID, 'input', async ( evt ) => { await EntropyConverterDialog.This.onChangeInputField( ECONVERTER_BASE64_INPUT_ID ); } ); this_obj.addEventHandler ( ECONVERTER_BASE58_INPUT_ID, 'input', async ( evt ) => { await EntropyConverterDialog.This.onChangeInputField( ECONVERTER_BAS58_INPUT_ID ); } ); this_obj.addEventHandler ( ECONVERTER_LANG_SELECT_ID, 'change', async ( evt ) => { await EntropyConverterDialog.This.onChangeLang( ECONVERTER_LANG_SELECT_ID ); } ); /* this_obj.addEventHandler ( ECONVERTER_DIALOG_INPUT_ID, 'paste', async ( evt ) => { await EntropyConverterDialog.This.onPasteText( evt ); } ); */ this_obj.addEventHandler ( ECONVERTER_CLEAR_BTN_ID, 'click', () => { EntropyConverterDialog.This.onClearFields(); } ); this_obj.addEventHandler ( ECONVERTER_QUIT_BTN_ID, 'click', () => { EntropyConverterDialog.This.onQuit(); } ); this_obj.event_handlers_attached = true; } this_obj.clearFields(); this_obj.displayed = true; }, // open() close: function( event, ui ) { let this_obj = EntropyConverterDialog.This; this_obj.displayed = false; } // close() } // -------------------- JQuery Dialog options ).parent().css('z-index', 900); } // initialize() showDialog() { trace2Main( pretty_func_header_format( "EntropyConverterDialog.showDialog" ) ); let dialog_id = ENTROPY_CONVERTER_DIALOG_ID; let dialog_elt = document.getElementById( dialog_id ); // https://stackoverflow.com/questions/394491/passing-data-to-a-jquery-ui-dialog/3458299#3458299 if ( dialog_elt != undefined ) { // https://stackoverflow.com/questions/13520139/jquery-ui-dialog-cannot-call-methods-on-dialog-prior-to-initialization let dialog_obj = $("#" + dialog_id); dialog_obj.dialog('open'); } else { console.log( ">> " + _RED_HIGH_ + "*ERROR* NOT FOUND " + dialog_id + " (EntropyConverterDialog.showDialog)" + _END_); } } // showDialog() closeDialog() { let dialog_obj = $("#" + ENTROPY_CONVERTER_DIALOG_ID); this.clearFields(); dialog_obj.dialog('close'); } // closeDialog() ascii_to_hexa( in_str ) { // Initialize an empty array to store the hexadecimal values let hex_str = []; // Iterate through each character in the input string for (let i = 0; i < in_str.length; i++) { // Convert the ASCII value of the current character to its hexadecimal representation let hex = in_str.charCodeAt(i).toString(16).padStart(2, '0'); // Push the hexadecimal value to the array hex_str.push(hex); } // Join the hexadecimal values in the array to form a single string return hex_str.join(''); } // ascii_to_hexa() hexa_to_ascii( hex_value ) { let hex_str = hex_value.toString(); //force conversion console.log(" hex_str: " + hex_str); var ascii_str = ''; for (let i = 0; i < hex_str.length; i += 2) { let hex_byte = hex_str.substr(i, 2); console.log(" hex_byte(" + i + "): " + hex_byte); let char_code = parseInt( hex_byte, 16 ); console.log(" char_code(" + i + "): " + char_code); if ( char_code >= 32 ) { ascii_str += String.fromCharCode(char_code); console.log(" ascii_str(" + i + "): " + ascii_str); } } return ascii_str; } // hexa_to_ascii() getEntropyBip39ByteCount( hex_str ) { // Initialize an empty array to store the hexadecimal values if ( ! isHexString( hex_str ) || hex_str.length % 2 != 0) return 0; let bytes_count = hex_str.length / 2; if ( BIP39_ALLOWED_BYTES_COUNT.indexOf( bytes_count ) != -1 ) { return bytes_count; } } // getEntropyBip39ByteCount() async propagateNewValue( source_elt_id ) { let hex_value = ''; let base64_value = ''; let raw_value = ''; let entropy = ''; let lang = ''; let mnemonics_value = ""; let data = {}; let entropy_info = {}; const getHexValue = async ( field_id ) => { let hex_value = ''; let mnemonics_value = ''; let field_value = HtmlUtils.GetElementValue( field_id ); if ( field_id == ECONVERTER_HEXADECIMAL_INPUT_ID ) { hex_value = HtmlUtils.GetElementValue( ECONVERTER_HEXADECIMAL_INPUT_ID ); } else if ( field_id == ECONVERTER_SECRET_PHRASE_INPUT_ID ) { mnemonics_value = HtmlUtils.GetElementValue( ECONVERTER_SECRET_PHRASE_INPUT_ID ); let mnemonics_items = mnemonics_value.split(); if ( BIP39_ALLOWED_WORD_COUNT.indexOf( mnemonics_items.length ) != -1 ) { let lang = HtmlUtils.GetElementValue( ECONVERTER_LANG_SELECT_ID ); let mnemonics = mnemonics_value; data = { mnemonics, lang }; entropy_info = await window.ipcMain.MnemonicsToEntropyInfo( data ); hex_value = entropy_info[ENTROPY_HEX]; } } else { let bases_data = {}; if ( field_id == ECONVERTER_RAWTEXT_INPUT_ID ) { bases_data[FROM_RAW_TEXT] = field_value; } else if ( field_id == ECONVERTER_BASE64_INPUT_ID ) { bases_data[FROM_BASE64] = field_value; } else if ( field_id == ECONVERTER_BASE58_INPUT_ID ) { bases_data[FROM_BASE58] = field_value; } else if ( field_id == ECONVERTER_BINARY_INPUT_ID ) { bases_data[FROM_BINARY] = field_value; } data = bases_data; hex_value = await window.ipcMain.ConvertFromBasesToHex( data ); } return hex_value; }; // async getHexValue() let base_conversions = {}; const BIP39_ALLOWED_BYTES_COUNT = [ 16, 20, 24, 28, 32 ]; let bit_size = 0; for ( let i=0; i < INPUT_FIELDS_IDS.length; i++ ) { let source_field_id = INPUT_FIELDS_IDS [ i ]; raw_value = ''; base64_value = ''; base_conversions = {}; let bit_size = 0; if ( source_field_id == ECONVERTER_HEXADECIMAL_INPUT_ID ) { hex_value = HtmlUtils.GetElementValue( ECONVERTER_HEXADECIMAL_INPUT_ID ); bit_size = hex_value.length * 4; } else if ( source_field_id == ECONVERTER_RAWTEXT_INPUT_ID ) { raw_value = HtmlUtils.GetElementValue( ECONVERTER_RAWTEXT_INPUT_ID ); bit_size = raw_value.length * 8; hex_value = await getHexValue( ECONVERTER_RAWTEXT_INPUT_ID ); } else if ( source_field_id == ECONVERTER_BASE64_INPUT_ID ) { base64_value = HtmlUtils.GetElementValue( ECONVERTER_BASE64_INPUT_ID ); base64_value = base64_value.replaceAll('=',''); bit_size = base64_value.length * 6; hex_value = await getHexValue( ECONVERTER_BASE64_INPUT_ID ); let hex_value_bit_size = hex_value.length * 4; if ( BIP39_ALLOWED_BIT_SIZES.indexOf( hex_value_bit_size ) != -1 ) { bit_size = hex_value_bit_size; } } else { hex_value = await getHexValue( source_field_id ); } if ( bit_size > 0 ) { console.log(" bit_size: " + bit_size); HtmlUtils.SetElementValue( ECONVERTER_ENTROPY_SIZE_VALUE_ID, bit_size ); } let bytes_count = hex_value.length / 2; if ( BIP39_ALLOWED_BYTES_COUNT.indexOf( bytes_count ) == -1 ) { continue; } if ( hex_value != '' ) { base64_value = hexToB64( hex_value ); entropy = hex_value; data = { entropy, lang }; mnemonics_value = await window.ipcMain.EntropyToMnemonics( data ); base_conversions = await window.ipcMain.ConvertFromHexToBases( hex_value ); } for ( let j=0; j < INPUT_FIELDS_IDS.length; j++ ) { let target_field_id = INPUT_FIELDS_IDS [ j ]; if ( source_field_id != target_field_id && hex_value != '' ) { if ( target_field_id == ECONVERTER_RAWTEXT_INPUT_ID && base_conversions[TO_RAW_TEXT] != undefined ) { HtmlUtils.SetElementValue( ECONVERTER_RAWTEXT_INPUT_ID, base_conversions[TO_RAW_TEXT] ); } else if ( target_field_id == ECONVERTER_HEXADECIMAL_INPUT_ID && hex_value != '' ) { HtmlUtils.SetElementValue( ECONVERTER_HEXADECIMAL_INPUT_ID, hex_value ); } else if ( target_field_id == ECONVERTER_BASE64_INPUT_ID && base_conversions[TO_BASE64] != undefined ) { HtmlUtils.SetElementValue( ECONVERTER_BASE64_INPUT_ID, base_conversions[TO_BASE64] ); } else if ( target_field_id == ECONVERTER_BASE58_INPUT_ID && base_conversions[TO_BASE58] != undefined ) { HtmlUtils.SetElementValue( ECONVERTER_BASE58_INPUT_ID, base_conversions[TO_BASE58] ); } else if ( target_field_id == ECONVERTER_BINARY_INPUT_ID && base_conversions[TO_BINARY] != undefined ) { HtmlUtils.SetElementValue( ECONVERTER_BINARY_INPUT_ID, base_conversions[TO_BINARY] ); } else if ( target_field_id == ECONVERTER_SECRET_PHRASE_INPUT_ID && mnemonics_value != '' ) { HtmlUtils.SetElementValue( ECONVERTER_SECRET_PHRASE_INPUT_ID, mnemonics_value ); } } } } } // async propagateNewValue() async onChangeLang() { let log_msg = ">> " + _CYAN_ + "EntropyConverterDialog.onChangeLang" + _END_; window.ipcMain.logToMain(log_msg); let data = {}; let lang = this.previous_lang; let mnemonics = HtmlUtils.GetElementValue( ECONVERTER_SECRET_PHRASE_INPUT_ID ); if ( lang == WORDLIST_WORD_INDEXES ) { lang = 'EN'; // console.log(" word indexes of mnemonics: '" + mnemonics + "'" ); let word_indexes = mnemonics.split(' '); // console.log(" word indexes typeof " + typeof word_indexes ); // console.log(" word indexes: " + JSON.stringify(word_indexes) ); data = { word_indexes, lang }; mnemonics = await window.ipcMain.WordIndexesToMnemonics( data ); // console.log(" word indexes to mnemonics: '" + mnemonics + "'" ); } console.log(" current mnemonics(" + lang + "): " + mnemonics); data = { mnemonics, lang }; let entropy_info = await window.ipcMain.MnemonicsToEntropyInfo( data ); let entropy_value = entropy_info[ENTROPY_HEX]; console.log(" entropy_value: " + entropy_value); let entropy = entropy_value; let new_lang = HtmlUtils.GetElementValue( ECONVERTER_LANG_SELECT_ID ); let new_mnemonics = ''; if ( new_lang == WORDLIST_WORD_INDEXES ) { let options = { [LANG]: this.previous_lang }; data = { mnemonics, options }; let word_indexes = await window.ipcMain.MnemonicsToWordIndexes( data ); new_mnemonics = word_indexes.join(' '); } else { lang = new_lang; data = { entropy, lang }; new_mnemonics = await window.ipcMain.EntropyToMnemonics( data ); console.log(" new_mnemonics(" + lang + "): " + new_mnemonics); } HtmlUtils.SetElementValue( ECONVERTER_SECRET_PHRASE_INPUT_ID, new_mnemonics ); this.previous_lang = new_lang; } // async onChangeLang() async onChangeInputField( source_elt_id ) { let log_msg = ">> " + _CYAN_ + "EntropyConverterDialog.onChangeInputField" + _END_; window.ipcMain.logToMain(log_msg); // console.log(" source_elt_id: " + source_elt_id); let field_value = HtmlUtils.GetElementValue( source_elt_id ); // console.log(" Change field_value: " + field_value + " length: " + field_value.length + " bytes: " + field_value.length/2); for ( let i=0; i < INPUT_FIELDS_IDS.length; i++ ) { let current_field_id = INPUT_FIELDS_IDS[ i ]; if ( current_field_id != source_elt_id ) { HtmlUtils.SetElementValue( current_field_id, '' ); } } for ( let i=0; i < INPUT_FIELDS_IDS.length; i++ ) { let current_field_id = INPUT_FIELDS_IDS[ i ]; await this.propagateNewValue( current_field_id ); } } // async onChangeInputField() async updateTranslatedMnemonics( entropy, output_lang ) { let log_msg = ">> " + _CYAN_ + "EntropyConverterDialog.updateTranslatedMnemonics" + _END_; window.ipcMain.logToMain(log_msg); let lang = output_lang; let data = { entropy, lang }; let mnemonics = await window.ipcMain.EntropyToMnemonics( data ); let translated_secret_phrase = mnemonics; if ( output_lang == 'JP' ) { translated_secret_phrase = translated_secret_phrase.replaceAll(' ', '\u3000'); } // console.log(" translated_secret_phrase: " + translated_secret_phrase); HtmlUtils.SetElementValue( ECONVERTER_DIALOG_TRANSLATED_ID, translated_secret_phrase ); } // async updateTranslatedMnemonics() onQuit() { let log_msg = ">> " + _CYAN_ + "EntropyConverterDialog.onQuit" + _END_; window.ipcMain.logToMain(log_msg); this.closeDialog(); } // onQuit() isDisplayed() { return this.displayed; } // isDisplayed() async onPasteText( evt ) { evt.preventDefault(); let paste_text = (evt.clipboardData || window.clipboardData).getData("text"); let words = paste_text.split(' '); if ( ! ( words.length == 12 || words.length == 15 || words.length == 18 || words.length == 21 || words.length == 24 ) ) { let error_msg = "*Error*: Invalid mnemonics count: " + words.length; HtmlUtils.SetElementValue( ECONVERTER_DIALOG_ERROR_MSG_ID, error_msg ); return; } // ----------Special case: 'Word Indexes' ---------- let is_word_indexes_list = true; for ( let i=0; i< words.length; i++ ) { let current_word = words[i]; if (! stringIsNumber( current_word ) ) { is_word_indexes_list = false; break; } } // ----------Special case: 'Word Indexes' let mnemonics = ""; let paste_lang = ""; let data = {}; if ( is_word_indexes_list ) { paste_lang = WORDLIST_WORD_INDEXES; } else { mnemonics = paste_text; data = { mnemonics }; paste_lang = await window.ipcMain.GuessMnemonicsLang( data ); // console.log(" paste_lang: " + paste_lang); if ( paste_lang == '' ) return; } HtmlUtils.SetElementValue( ECONVERTER_DIALOG_INPUT_ID, paste_text ); HtmlUtils.SetElementValue( ECONVERTER_DIALOG_INPUT_LANG_SELECT_ID, paste_lang ); } // async onPasteText() onCopyField( elt_id ) { let log_msg = ">> " + _CYAN_ + "EntropyConverterDialog.onCopyField" + _END_; window.ipcMain.logToMain(log_msg); console.log(" elt_id: " + elt_id); let copy_text = HtmlUtils.GetElementValue( elt_id ); console.log(" copy_text: " + copy_text); if ( copy_text == "") { return; } if ( copy_text != "" ) { navigator.clipboard.writeText( copy_text ); } } // onCopyField() onClearFields() { console.log(">> EntropyConverterDialog.onClearFields"); this.clearFields(); } // onClearFields() clearFields() { HtmlUtils.SetElementValue( ECONVERTER_RAWTEXT_INPUT_ID, '' ); HtmlUtils.SetElementValue( ECONVERTER_HEXADECIMAL_INPUT_ID, '' ); HtmlUtils.SetElementValue( ECONVERTER_BASE64_INPUT_ID, '' ); HtmlUtils.SetElementValue( ECONVERTER_BASE58_INPUT_ID, '' ); HtmlUtils.SetElementValue( ECONVERTER_BINARY_INPUT_ID, '' ); HtmlUtils.SetElementValue( ECONVERTER_SECRET_PHRASE_INPUT_ID, '' ); HtmlUtils.SetElementValue( ECONVERTER_ENTROPY_SIZE_VALUE_ID, '' ); } // clearFields() addEventHandler( elt_id, evt_name, evt_handler ) { let elt = document.getElementById( elt_id ); if ( elt != undefined ) { elt.addEventListener( evt_name, evt_handler ); } } // addEventHandler() removeEventHandler( elt_id, evt_name, evt_handler ) { let elt = document.getElementById( elt_id ); if ( elt != undefined ) { elt.removeEventListener( evt_name, evt_handler ); } } // removeEventHandler() is_not_null( in_str ) { if ( in_str != undefined && in_str != 'undefined' && in_str != "" && in_str != '' ) { return true; } return false; } // is_not_null() } // EntropyConverterDialog class EntropyConverterDialog.This.initialize();