From fe331cc7350502c60016cbe82042f170f413d9d9 Mon Sep 17 00:00:00 2001 From: Snider Date: Sun, 23 Jan 2022 14:24:05 +0000 Subject: [PATCH] Reproducible salts from input without prior knowledge const salt = new EnchantrixSaltQuasiEntropy('Snider').salty() --- .build/img/img.png | Bin 0 -> 21369 bytes .editorconfig | 321 +++++++++++++++++++++++++++++++++ .eslintrc.js | 31 ++++ .gitignore | 2 + .idea/.gitignore | 8 + .idea/enchantrix.iml | 9 + .idea/misc.xml | 6 + .idea/modules.xml | 8 + .idea/vcs.xml | 6 + README.md | 10 +- deno.json | 18 ++ package.json | 43 +++++ src/salt/quasi-entropy.test.ts | 18 ++ src/salt/quasi-entropy.ts | 56 ++++++ 14 files changed, 534 insertions(+), 2 deletions(-) create mode 100644 .build/img/img.png create mode 100644 .editorconfig create mode 100644 .eslintrc.js create mode 100644 .gitignore create mode 100644 .idea/.gitignore create mode 100644 .idea/enchantrix.iml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/vcs.xml create mode 100644 deno.json create mode 100644 package.json create mode 100644 src/salt/quasi-entropy.test.ts create mode 100644 src/salt/quasi-entropy.ts diff --git a/.build/img/img.png b/.build/img/img.png new file mode 100644 index 0000000000000000000000000000000000000000..6395fa38faf2be1f47e4f00ad14e304fc0787a3b GIT binary patch literal 21369 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 PDdmd3df^X_foZ=2K-3A& literal 0 HcmV?d00001 diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..613f1e8 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,321 @@ +root = true + +[*] +charset = utf-8 +end_of_line = lf +indent_size = 4 +indent_style = tab +insert_final_newline = true +# max_line_length = 800 +# tab_width = 4 +trim_trailing_whitespace = true +# ij_continuation_indent_size = 8 +# ij_formatter_off_tag = @formatter:off +# ij_formatter_on_tag = @formatter:on +# ij_formatter_tags_enabled = false +# ij_smart_tabs = true +# ij_visual_guides = none +# ij_wrap_on_typing = false + +[*.css] +# ij_css_align_closing_brace_with_properties = false +# ij_css_blank_lines_around_nested_selector = 1 +# ij_css_blank_lines_between_blocks = 1 +# ij_css_brace_placement = end_of_line +# ij_css_enforce_quotes_on_format = false +# ij_css_hex_color_long_format = false +# ij_css_hex_color_lower_case = false +# ij_css_hex_color_short_format = false +# ij_css_hex_color_upper_case = false +# ij_css_keep_blank_lines_in_code = 2 +# ij_css_keep_indents_on_empty_lines = false +# ij_css_keep_single_line_blocks = false +# ij_css_properties_order = font,font-family,font-size,font-weight,font-style,font-variant,font-size-adjust,font-stretch,line-height,position,z-index,top,right,bottom,left,display,visibility,float,clear,overflow,overflow-x,overflow-y,clip,zoom,align-content,align-items,align-self,flex,flex-flow,flex-basis,flex-direction,flex-grow,flex-shrink,flex-wrap,justify-content,order,box-sizing,width,min-width,max-width,height,min-height,max-height,margin,margin-top,margin-right,margin-bottom,margin-left,padding,padding-top,padding-right,padding-bottom,padding-left,table-layout,empty-cells,caption-side,border-spacing,border-collapse,list-style,list-style-position,list-style-type,list-style-image,content,quotes,counter-reset,counter-increment,resize,cursor,user-select,nav-index,nav-up,nav-right,nav-down,nav-left,transition,transition-delay,transition-timing-function,transition-duration,transition-property,transform,transform-origin,animation,animation-name,animation-duration,animation-play-state,animation-timing-function,animation-delay,animation-iteration-count,animation-direction,text-align,text-align-last,vertical-align,white-space,text-decoration,text-emphasis,text-emphasis-color,text-emphasis-style,text-emphasis-position,text-indent,text-justify,letter-spacing,word-spacing,text-outline,text-transform,text-wrap,text-overflow,text-overflow-ellipsis,text-overflow-mode,word-wrap,word-break,tab-size,hyphens,pointer-events,opacity,color,border,border-width,border-style,border-color,border-top,border-top-width,border-top-style,border-top-color,border-right,border-right-width,border-right-style,border-right-color,border-bottom,border-bottom-width,border-bottom-style,border-bottom-color,border-left,border-left-width,border-left-style,border-left-color,border-radius,border-top-left-radius,border-top-right-radius,border-bottom-right-radius,border-bottom-left-radius,border-image,border-image-source,border-image-slice,border-image-width,border-image-outset,border-image-repeat,outline,outline-width,outline-style,outline-color,outline-offset,background,background-color,background-image,background-repeat,background-attachment,background-position,background-position-x,background-position-y,background-clip,background-origin,background-size,box-decoration-break,box-shadow,text-shadow +# ij_css_space_after_colon = true +# ij_css_space_before_opening_brace = true +# ij_css_use_double_quotes = true +# ij_css_value_alignment = do_not_align + +[*.sass] +# indent_size = 2 +# ij_sass_align_closing_brace_with_properties = false +# ij_sass_blank_lines_around_nested_selector = 1 +# ij_sass_blank_lines_between_blocks = 1 +# ij_sass_brace_placement = 0 +# ij_sass_enforce_quotes_on_format = false +# ij_sass_hex_color_long_format = false +# ij_sass_hex_color_lower_case = false +# ij_sass_hex_color_short_format = false +# ij_sass_hex_color_upper_case = false +# ij_sass_keep_blank_lines_in_code = 2 +# ij_sass_keep_indents_on_empty_lines = false +# ij_sass_keep_single_line_blocks = false +# ij_sass_properties_order = font,font-family,font-size,font-weight,font-style,font-variant,font-size-adjust,font-stretch,line-height,position,z-index,top,right,bottom,left,display,visibility,float,clear,overflow,overflow-x,overflow-y,clip,zoom,align-content,align-items,align-self,flex,flex-flow,flex-basis,flex-direction,flex-grow,flex-shrink,flex-wrap,justify-content,order,box-sizing,width,min-width,max-width,height,min-height,max-height,margin,margin-top,margin-right,margin-bottom,margin-left,padding,padding-top,padding-right,padding-bottom,padding-left,table-layout,empty-cells,caption-side,border-spacing,border-collapse,list-style,list-style-position,list-style-type,list-style-image,content,quotes,counter-reset,counter-increment,resize,cursor,user-select,nav-index,nav-up,nav-right,nav-down,nav-left,transition,transition-delay,transition-timing-function,transition-duration,transition-property,transform,transform-origin,animation,animation-name,animation-duration,animation-play-state,animation-timing-function,animation-delay,animation-iteration-count,animation-direction,text-align,text-align-last,vertical-align,white-space,text-decoration,text-emphasis,text-emphasis-color,text-emphasis-style,text-emphasis-position,text-indent,text-justify,letter-spacing,word-spacing,text-outline,text-transform,text-wrap,text-overflow,text-overflow-ellipsis,text-overflow-mode,word-wrap,word-break,tab-size,hyphens,pointer-events,opacity,color,border,border-width,border-style,border-color,border-top,border-top-width,border-top-style,border-top-color,border-right,border-right-width,border-right-style,border-right-color,border-bottom,border-bottom-width,border-bottom-style,border-bottom-color,border-left,border-left-width,border-left-style,border-left-color,border-radius,border-top-left-radius,border-top-right-radius,border-bottom-right-radius,border-bottom-left-radius,border-image,border-image-source,border-image-slice,border-image-width,border-image-outset,border-image-repeat,outline,outline-width,outline-style,outline-color,outline-offset,background,background-color,background-image,background-repeat,background-attachment,background-position,background-position-x,background-position-y,background-clip,background-origin,background-size,box-decoration-break,box-shadow,text-shadow +# ij_sass_space_after_colon = true +# ij_sass_space_before_opening_brace = true +# ij_sass_use_double_quotes = true +# ij_sass_value_alignment = 0 + +[*.scss] +# indent_size = 2 +# ij_scss_align_closing_brace_with_properties = false +# ij_scss_blank_lines_around_nested_selector = 1 +# ij_scss_blank_lines_between_blocks = 1 +# ij_scss_brace_placement = 0 +# ij_scss_enforce_quotes_on_format = false +# ij_scss_hex_color_long_format = false +# ij_scss_hex_color_lower_case = false +# ij_scss_hex_color_short_format = false +# ij_scss_hex_color_upper_case = false +# ij_scss_keep_blank_lines_in_code = 2 +# ij_scss_keep_indents_on_empty_lines = false +# ij_scss_keep_single_line_blocks = false +# ij_scss_properties_order = font,font-family,font-size,font-weight,font-style,font-variant,font-size-adjust,font-stretch,line-height,position,z-index,top,right,bottom,left,display,visibility,float,clear,overflow,overflow-x,overflow-y,clip,zoom,align-content,align-items,align-self,flex,flex-flow,flex-basis,flex-direction,flex-grow,flex-shrink,flex-wrap,justify-content,order,box-sizing,width,min-width,max-width,height,min-height,max-height,margin,margin-top,margin-right,margin-bottom,margin-left,padding,padding-top,padding-right,padding-bottom,padding-left,table-layout,empty-cells,caption-side,border-spacing,border-collapse,list-style,list-style-position,list-style-type,list-style-image,content,quotes,counter-reset,counter-increment,resize,cursor,user-select,nav-index,nav-up,nav-right,nav-down,nav-left,transition,transition-delay,transition-timing-function,transition-duration,transition-property,transform,transform-origin,animation,animation-name,animation-duration,animation-play-state,animation-timing-function,animation-delay,animation-iteration-count,animation-direction,text-align,text-align-last,vertical-align,white-space,text-decoration,text-emphasis,text-emphasis-color,text-emphasis-style,text-emphasis-position,text-indent,text-justify,letter-spacing,word-spacing,text-outline,text-transform,text-wrap,text-overflow,text-overflow-ellipsis,text-overflow-mode,word-wrap,word-break,tab-size,hyphens,pointer-events,opacity,color,border,border-width,border-style,border-color,border-top,border-top-width,border-top-style,border-top-color,border-right,border-right-width,border-right-style,border-right-color,border-bottom,border-bottom-width,border-bottom-style,border-bottom-color,border-left,border-left-width,border-left-style,border-left-color,border-radius,border-top-left-radius,border-top-right-radius,border-bottom-right-radius,border-bottom-left-radius,border-image,border-image-source,border-image-slice,border-image-width,border-image-outset,border-image-repeat,outline,outline-width,outline-style,outline-color,outline-offset,background,background-color,background-image,background-repeat,background-attachment,background-position,background-position-x,background-position-y,background-clip,background-origin,background-size,box-decoration-break,box-shadow,text-shadow +# ij_scss_space_after_colon = true +# ij_scss_space_before_opening_brace = true +# ij_scss_use_double_quotes = true +# ij_scss_value_alignment = 0 + +[.editorconfig] +# ij_editorconfig_align_group_field_declarations = false +# ij_editorconfig_space_after_colon = false +# ij_editorconfig_space_after_comma = true +# ij_editorconfig_space_before_colon = false +# ij_editorconfig_space_before_comma = false +# ij_editorconfig_spaces_around_assignment_operators = true + +[{*.ats,*.ts}] +# indent_style = tab +# max_line_length = 800 +# ij_continuation_indent_size = 4 +# ij_typescript_align_imports = false +# ij_typescript_align_multiline_array_initializer_expression = false +# ij_typescript_align_multiline_binary_operation = false +# ij_typescript_align_multiline_chained_methods = false +# ij_typescript_align_multiline_extends_list = false +# ij_typescript_align_multiline_for = false +# ij_typescript_align_multiline_parameters = true +# ij_typescript_align_multiline_parameters_in_calls = false +# ij_typescript_align_multiline_ternary_operation = false +# ij_typescript_align_object_properties = 0 +# ij_typescript_align_union_types = false +# ij_typescript_align_var_statements = 0 +# ij_typescript_array_initializer_new_line_after_left_brace = false +# ij_typescript_array_initializer_right_brace_on_new_line = false +# ij_typescript_array_initializer_wrap = off +# ij_typescript_assignment_wrap = off +# ij_typescript_binary_operation_sign_on_next_line = false +# ij_typescript_binary_operation_wrap = off +# ij_typescript_blacklist_imports = rxjs/Rx,node_modules/**,**/node_modules/**,@angular/material,@angular/material/typings/** +# ij_typescript_blank_lines_after_imports = 1 +# ij_typescript_blank_lines_around_class = 1 +# ij_typescript_blank_lines_around_field = 0 +# ij_typescript_blank_lines_around_field_in_interface = 0 +# ij_typescript_blank_lines_around_function = 1 +# ij_typescript_blank_lines_around_method = 1 +# ij_typescript_blank_lines_around_method_in_interface = 1 +# ij_typescript_block_brace_style = end_of_line +# ij_typescript_call_parameters_new_line_after_left_paren = false +# ij_typescript_call_parameters_right_paren_on_new_line = false +# ij_typescript_call_parameters_wrap = off +# ij_typescript_catch_on_new_line = false +# ij_typescript_chained_call_dot_on_new_line = true +# ij_typescript_class_brace_style = end_of_line +# ij_typescript_comma_on_new_line = false +# ij_typescript_do_while_brace_force = never +# ij_typescript_else_on_new_line = false +# ij_typescript_enforce_trailing_comma = remove +# ij_typescript_extends_keyword_wrap = off +# ij_typescript_extends_list_wrap = off +# ij_typescript_field_prefix = _ +# ij_typescript_file_name_style = relaxed +# ij_typescript_finally_on_new_line = false +# ij_typescript_for_brace_force = never +# ij_typescript_for_statement_new_line_after_left_paren = false +# ij_typescript_for_statement_right_paren_on_new_line = false +# ij_typescript_for_statement_wrap = off +# ij_typescript_force_quote_style = true +# ij_typescript_force_semicolon_style = true +# ij_typescript_function_expression_brace_style = end_of_line +# ij_typescript_if_brace_force = never +# ij_typescript_import_merge_members = global +# ij_typescript_import_prefer_absolute_path = true +# ij_typescript_import_sort_members = true +# ij_typescript_import_sort_module_name = false +# ij_typescript_import_use_node_resolution = true +# ij_typescript_imports_wrap = on_every_item +# ij_typescript_indent_case_from_switch = true +# ij_typescript_indent_chained_calls = true +# ij_typescript_indent_package_children = 0 +# ij_typescript_jsdoc_include_types = true +# ij_typescript_jsx_attribute_value = braces +# ij_typescript_keep_blank_lines_in_code = 2 +# ij_typescript_keep_first_column_comment = true +# ij_typescript_keep_indents_on_empty_lines = false +# ij_typescript_keep_line_breaks = true +# ij_typescript_keep_simple_blocks_in_one_line = false +# ij_typescript_keep_simple_methods_in_one_line = false +# ij_typescript_line_comment_add_space = false +# ij_typescript_line_comment_at_first_column = true +# ij_typescript_method_brace_style = end_of_line +# ij_typescript_method_call_chain_wrap = off +# ij_typescript_method_parameters_new_line_after_left_paren = false +# ij_typescript_method_parameters_right_paren_on_new_line = false +# ij_typescript_method_parameters_wrap = off +# ij_typescript_object_literal_wrap = on_every_item +# ij_typescript_parentheses_expression_new_line_after_left_paren = false +# ij_typescript_parentheses_expression_right_paren_on_new_line = false +# ij_typescript_place_assignment_sign_on_next_line = false +# ij_typescript_prefer_as_type_cast = false +# ij_typescript_prefer_explicit_types_function_expression_returns = false +# ij_typescript_prefer_explicit_types_function_returns = false +# ij_typescript_prefer_explicit_types_vars_fields = false +# ij_typescript_prefer_parameters_wrap = false +# ij_typescript_reformat_c_style_comments = true +# ij_typescript_space_after_colon = true +# ij_typescript_space_after_comma = true +# ij_typescript_space_after_dots_in_rest_parameter = false +# ij_typescript_space_after_generator_mult = true +# ij_typescript_space_after_property_colon = true +# ij_typescript_space_after_quest = true +# ij_typescript_space_after_type_colon = true +# ij_typescript_space_after_unary_not = false +# ij_typescript_space_before_async_arrow_lparen = true +# ij_typescript_space_before_catch_keyword = true +# ij_typescript_space_before_catch_left_brace = true +# ij_typescript_space_before_catch_parentheses = true +# ij_typescript_space_before_class_lbrace = true +# ij_typescript_space_before_class_left_brace = true +# ij_typescript_space_before_colon = true +# ij_typescript_space_before_comma = false +# ij_typescript_space_before_do_left_brace = true +# ij_typescript_space_before_else_keyword = true +# ij_typescript_space_before_else_left_brace = true +# ij_typescript_space_before_finally_keyword = true +# ij_typescript_space_before_finally_left_brace = true +# ij_typescript_space_before_for_left_brace = true +# ij_typescript_space_before_for_parentheses = true +# ij_typescript_space_before_for_semicolon = false +# ij_typescript_space_before_function_left_parenth = true +# ij_typescript_space_before_generator_mult = false +# ij_typescript_space_before_if_left_brace = true +# ij_typescript_space_before_if_parentheses = true +# ij_typescript_space_before_method_call_parentheses = false +# ij_typescript_space_before_method_left_brace = true +# ij_typescript_space_before_method_parentheses = false +# ij_typescript_space_before_property_colon = false +# ij_typescript_space_before_quest = true +# ij_typescript_space_before_switch_left_brace = true +# ij_typescript_space_before_switch_parentheses = true +# ij_typescript_space_before_try_left_brace = true +# ij_typescript_space_before_type_colon = false +# ij_typescript_space_before_unary_not = false +# ij_typescript_space_before_while_keyword = true +# ij_typescript_space_before_while_left_brace = true +# ij_typescript_space_before_while_parentheses = true +# ij_typescript_spaces_around_additive_operators = true +# ij_typescript_spaces_around_arrow_function_operator = true +# ij_typescript_spaces_around_assignment_operators = true +# ij_typescript_spaces_around_bitwise_operators = true +# ij_typescript_spaces_around_equality_operators = true +# ij_typescript_spaces_around_logical_operators = true +# ij_typescript_spaces_around_multiplicative_operators = true +# ij_typescript_spaces_around_relational_operators = true +# ij_typescript_spaces_around_shift_operators = true +# ij_typescript_spaces_around_unary_operator = false +# ij_typescript_spaces_within_array_initializer_brackets = false +# ij_typescript_spaces_within_brackets = false +# ij_typescript_spaces_within_catch_parentheses = false +# ij_typescript_spaces_within_for_parentheses = false +# ij_typescript_spaces_within_if_parentheses = false +# ij_typescript_spaces_within_imports = false +# ij_typescript_spaces_within_interpolation_expressions = false +# ij_typescript_spaces_within_method_call_parentheses = false +# ij_typescript_spaces_within_method_parentheses = false +# ij_typescript_spaces_within_object_literal_braces = false +# ij_typescript_spaces_within_object_type_braces = true +# ij_typescript_spaces_within_parentheses = false +# ij_typescript_spaces_within_switch_parentheses = false +# ij_typescript_spaces_within_type_assertion = false +# ij_typescript_spaces_within_union_types = true +# ij_typescript_spaces_within_while_parentheses = false +# ij_typescript_special_else_if_treatment = true +# ij_typescript_ternary_operation_signs_on_next_line = false +# ij_typescript_ternary_operation_wrap = off +# ij_typescript_union_types_wrap = on_every_item +# ij_typescript_use_chained_calls_group_indents = false +# ij_typescript_use_double_quotes = false +# ij_typescript_use_explicit_js_extension = global +# ij_typescript_use_path_mapping = always +# ij_typescript_use_public_modifier = true +# ij_typescript_use_semicolon_after_statement = true +# ij_typescript_var_declaration_wrap = normal +# ij_typescript_while_brace_force = never +# ij_typescript_while_on_new_line = false +# ij_typescript_wrap_comments = false + +[{*.har,*.jsb2,*.jsb3,*.json,.babelrc,.eslintrc,.prettierrc,.stylelintrc,bowerrc,jest.config}] +# indent_size = 2 +# ij_json_keep_blank_lines_in_code = 0 +# ij_json_keep_indents_on_empty_lines = false +# ij_json_keep_line_breaks = true +# ij_json_space_after_colon = true +# ij_json_space_after_comma = true +# ij_json_space_before_colon = true +# ij_json_space_before_comma = false +# ij_json_spaces_within_braces = false +# ij_json_spaces_within_brackets = false +# ij_json_wrap_long_lines = false + +[{*.htm,*.html,*.ng,*.sht,*.shtm,*.shtml}] +# ij_html_add_new_line_before_tags = body,div,p,form,h1,h2,h3 +# ij_html_align_attributes = true +# ij_html_align_text = false +# ij_html_attribute_wrap = normal +# ij_html_block_comment_at_first_column = true +# ij_html_do_not_align_children_of_min_lines = 0 +# ij_html_do_not_break_if_inline_tags = title,h1,h2,h3,h4,h5,h6,p +# ij_html_do_not_indent_children_of_tags = html,body,thead,tbody,tfoot +# ij_html_enforce_quotes = false +# ij_html_inline_tags = a,abbr,acronym,b,basefont,bdo,big,br,cite,cite,code,dfn,em,font,i,img,input,kbd,label,q,s,samp,select,small,span,strike,strong,sub,sup,textarea,tt,u,var +# ij_html_keep_blank_lines = 2 +# ij_html_keep_indents_on_empty_lines = false +# ij_html_keep_line_breaks = true +# ij_html_keep_line_breaks_in_text = true +# ij_html_keep_whitespaces = false +# ij_html_keep_whitespaces_inside = span,pre,textarea +# ij_html_line_comment_at_first_column = true +# ij_html_new_line_after_last_attribute = never +# ij_html_new_line_before_first_attribute = never +# ij_html_quote_style = double +# ij_html_remove_new_line_before_tags = br +# ij_html_space_after_tag_name = false +# ij_html_space_around_equality_in_attribute = false +# ij_html_space_inside_empty_tag = false +# ij_html_text_wrap = normal + +[{*.markdown,*.md}] +# ij_markdown_force_one_space_after_blockquote_symbol = true +# ij_markdown_force_one_space_after_header_symbol = true +# ij_markdown_force_one_space_after_list_bullet = true +# ij_markdown_force_one_space_between_words = true +# ij_markdown_keep_indents_on_empty_lines = false +# ij_markdown_max_lines_around_block_elements = 1 +# ij_markdown_max_lines_around_header = 1 +# ij_markdown_max_lines_between_paragraphs = 1 +# ij_markdown_min_lines_around_block_elements = 1 +# ij_markdown_min_lines_around_header = 1 +# ij_markdown_min_lines_between_paragraphs = 1 + +[{*.yaml,*.yml}] +# indent_size = 2 +# ij_yaml_align_values_properties = do_not_align +# ij_yaml_autoinsert_sequence_marker = true +# ij_yaml_block_mapping_on_new_line = false +# ij_yaml_indent_sequence_value = true +# ij_yaml_keep_indents_on_empty_lines = false +# ij_yaml_keep_line_breaks = true +# ij_yaml_sequence_on_new_line = false +# ij_yaml_space_before_colon = false +# ij_yaml_spaces_within_braces = true +# ij_yaml_spaces_within_brackets = true \ No newline at end of file diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 0000000..339cfb0 --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,31 @@ +module.exports = { + root: true, // if you want to prevent ESLint from searching for the configuration file all the way up to the root directory of the filesystem + env: { + browser: true, // for ESLint to be aware of browser global variables + node: true, // for ESLint to be aware of Node.js global variables and scoping + es6: true, // for ESLint to be aware of ES6 global variables (this automatically enables ES6 syntax) + }, + parser: '@typescript-eslint/parser', // TypeScript (if not Vue) + parserOptions: { + parser: '@typescript-eslint/parser', // Vue + TypeScript + ecmaFeatures: { + jsx: true, // React, React Native + }, + sourceType: 'module', // if you're using ECMAScript modules + }, + extends: [ + 'eslint:recommended', // always (set of rules recommended by ESLint team) + 'plugin:@typescript-eslint/recommended' + ], + rules: { + "@typescript-eslint/no-explicit-any": ["error", { "fixToUnknown": false, "ignoreRestArgs": true }] + }, + plugins: [ + '@typescript-eslint', // TypeScript + ], + settings: { + react: { + version: 'detect', // React + } + } +}; \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d5f19d8 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +node_modules +package-lock.json diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..13566b8 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/enchantrix.iml b/.idea/enchantrix.iml new file mode 100644 index 0000000..d6ebd48 --- /dev/null +++ b/.idea/enchantrix.iml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..639900d --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..9e672f8 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..35eb1dd --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/README.md b/README.md index e29c35e..1d3577e 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,8 @@ -# enchantrix -CryptoSuite +# Enchantrix + +The Little CryptoSuite that could. + +```shell +deno test src/ +``` +![img.png](.build/img/img.png) diff --git a/deno.json b/deno.json new file mode 100644 index 0000000..9e9850e --- /dev/null +++ b/deno.json @@ -0,0 +1,18 @@ +{ + "compilerOptions": { + "allowJs": true, + "lib": ["deno.window", "deno.unstable"], + "strict": true + }, + "lint": { + "files": { + "include": ["src/"], + "exclude": ["src/testdata/"] + }, + "rules": { + "tags": ["recommended"], + "include": ["ban-untagged-todo"], + "exclude": ["no-unused-vars"] + } + } +} \ No newline at end of file diff --git a/package.json b/package.json new file mode 100644 index 0000000..9228057 --- /dev/null +++ b/package.json @@ -0,0 +1,43 @@ +{ + "name": "enchantrix", + "version": "0.0.1", + "license": "EUPL-1.2", + "description": "The Little CryptoSuite that could.", + "homepage": "https://github.com/Snider/enchantrix/wiki", + "bugs": { + "url": "https://github.com/Snider/enchantrix/issues", + "email": "snider@lt.hn" + }, + "author": "Snider (https://lt.hn)", + "main": "src/server.ts", + "repository": { + "type": "git", + "url": "https://github.com/Snider/enchantrix" + }, + "scripts": { + "dev": "deno run --watch --allow-net --allow-env --allow-run --allow-read --allow-write --unstable src/server.ts", + "lint": "eslint 'src/**/*.{ts,html,scss}' --cache", + "test": "deno test src/ ", + "sdk:angular": "openapi-generator generate -i openapi.json -g typescript-angular -o build/api" + }, + "dependencies": { + "ansi_up": "^5.1.0", + "ansi-to-html": "^0.7.2", + "ansicolor": "^1.1.95", + "axios": "^0.24.0", + "i": "^0.3.7", + "npm": "^8.1.2", + "openpgp": "^5.0.0", + "pem-ts": "^3.0.0", + "swagger-jsdoc": "^6.1.0" + }, + "devDependencies": { + "@openapitools/openapi-generator-cli": "^2.4.18", + "@typescript-eslint/eslint-plugin": "^5.4.0", + "@typescript-eslint/parser": "^5.4.0", + "eslint": "^8.3.0", + "eslint-config-prettier": "^8.3.0", + "eslint-plugin-prettier": "^4.0.0", + "prettier": "^2.4.1" + } +} diff --git a/src/salt/quasi-entropy.test.ts b/src/salt/quasi-entropy.test.ts new file mode 100644 index 0000000..dee7f59 --- /dev/null +++ b/src/salt/quasi-entropy.test.ts @@ -0,0 +1,18 @@ +import { assertEquals } from "https://deno.land/std@0.122.0/testing/asserts.ts"; +import {EnchantrixSaltQuasiEntropy} from "./quasi-entropy.ts"; + +// Compact form: name and function +Deno.test("IN: Snider OUT: redinS", () => { + const x = new EnchantrixSaltQuasiEntropy('Snider').salty(); + assertEquals(x, 'redinS'); +}); +// Compact form: name and function +Deno.test("IN: snider OUT: redins", () => { + const x = new EnchantrixSaltQuasiEntropy('snider').salty(); + assertEquals(x, 'redins'); +}); + +Deno.test("Medium Input, Large Salt", () => { + const x = new EnchantrixSaltQuasiEntropy('a long string with spaces and workds and much letters and stuff').salty(); + assertEquals(x, 'ffuts dna srettel hcum dna sdkrow dna secaps htiw gnirts gnol a'); +}); diff --git a/src/salt/quasi-entropy.ts b/src/salt/quasi-entropy.ts new file mode 100644 index 0000000..3063b55 --- /dev/null +++ b/src/salt/quasi-entropy.ts @@ -0,0 +1,56 @@ +/** + * Reproducible salts from input without prior knowledge + * + * @example const salt = new EnchantrixSaltQuasiEntropy('Snider').salty() + */ +export class EnchantrixSaltQuasiEntropy { + + /** + * Extend to enforce a custom mapping + * + * @protected + */ + protected charMap = { + 'o': '0', + 'l': "1", + 'e': "3", + 'a': "4", + 's': "z", + 't': "7", + } + + protected readonly _input: string = '' + + /** + * Supply the input + * + * @param input + */ + constructor(input: string) { + this._input = input + } + + get keyMap():any { + return this.charMap + } + + /** + * + * @param {string} input + * @returns {string} + */ + salty(): string { + if (!this._input) { + return ''; + } + + let i: number = this._input.length; + let salt:string[] = [] + while (i--) { + salt.push(this._input[i] === this.keyMap[this._input[i]] ? this.keyMap[this._input[i]] : this._input[i]); + } + + return salt.join(''); + } + +}